1161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
3161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//                     The LLVM Compiler Infrastructure
4161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
5161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// This file is distributed under the University of Illinois Open Source
6161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// License. See LICENSE.TXT for details.
7161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
8161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===//
9161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
10443c9ed7688e66c55c43819a75be681574b291deEric Christopher// This file contains support for constructing a dwarf compile unit.
11161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
12161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===//
13161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
14161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#define DEBUG_TYPE "dwarfdebug"
15161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
16c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher#include "DwarfAccelTable.h"
17161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfCompileUnit.h"
18161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfDebug.h"
19161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Constants.h"
2016eeb6f5ebc978b03745177b9ac82684ab1c6932Bill Wendling#include "llvm/DIBuilder.h"
216f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/GlobalVariable.h"
226f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/Instructions.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,
364d069bf8ec726570d668e59fda993a33dfb7cb0bEric 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
54873cf0a0d7906083578d9b793008348750636138Eric Christopher/// addFlag - Add a flag that is true.
55873cf0a0d7906083578d9b793008348750636138Eric Christophervoid CompileUnit::addFlag(DIE *Die, unsigned Attribute) {
56873cf0a0d7906083578d9b793008348750636138Eric Christopher  if (!DD->useDarwinGDBCompat())
57873cf0a0d7906083578d9b793008348750636138Eric Christopher    Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
58873cf0a0d7906083578d9b793008348750636138Eric Christopher                  DIEIntegerOne);
59873cf0a0d7906083578d9b793008348750636138Eric Christopher  else
60873cf0a0d7906083578d9b793008348750636138Eric Christopher    addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
61873cf0a0d7906083578d9b793008348750636138Eric Christopher}
62873cf0a0d7906083578d9b793008348750636138Eric Christopher
63161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addUInt - Add an unsigned integer attribute data and value.
64161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
65161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addUInt(DIE *Die, unsigned Attribute,
66161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, uint64_t Integer) {
67161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(false, Integer);
68161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = Integer == 1 ?
69161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
70161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
71161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
72161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
73161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSInt - Add an signed integer attribute data and value.
74161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
75161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSInt(DIE *Die, unsigned Attribute,
76161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, int64_t Integer) {
77161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(true, Integer);
78161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
79161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
80161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
81161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
826a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// addString - Add a string attribute data and value. We always emit a
836a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// reference to the string pool instead of immediate strings so that DIEs have
846a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// more predictable sizes.
85390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewyckyvoid CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
866a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  MCSymbol *Symb = DD->getStringPoolEntry(String);
876a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  DIEValue *Value;
886a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  if (Asm->needsRelocationsForDwarfStringPool())
896a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    Value = new (DIEValueAllocator) DIELabel(Symb);
906a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  else {
916a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    MCSymbol *StringPool = DD->getStringPool();
926a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
93390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  }
946a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
95161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
96161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
97161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addLabel - Add a Dwarf label attribute data and value.
98161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
99161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
100161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           const MCSymbol *Label) {
101161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
102161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
103161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
104161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
105161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDelta - Add a label delta attribute data and value.
106161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
107161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
108161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           const MCSymbol *Hi, const MCSymbol *Lo) {
109161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
110161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
111161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
112161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
113161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDIEEntry - Add a DIE attribute data and value.
114161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
115161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
116161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                              DIE *Entry) {
117161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, createDIEEntry(Entry));
118161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
119161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
120161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlock - Add block data.
121161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
122161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
123161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           DIEBlock *Block) {
124161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Block->ComputeSize(Asm);
125161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
126161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Block->BestForm(), Block);
127161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
128161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
129161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
130161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
131161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
132161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify variable.
133161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!V.Verify())
134161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
135161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
136161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = V.getLineNumber();
137161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
138161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
139161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
140161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                            V.getContext().getDirectory());
141161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
142161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
143161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
144161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
145161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
146161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
147161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
148161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
149161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify global variable.
150161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!G.Verify())
151161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
152161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
153161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = G.getLineNumber();
154161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
155161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
156746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  unsigned FileID = DD->GetOrCreateSourceID(G.getFilename(), G.getDirectory());
157161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
158161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
159161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
160161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
161161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
162161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
163161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
164161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
165161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify subprogram.
166161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!SP.Verify())
167161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
168161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1692125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  // If the line number is 0, don't add it.
170161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = SP.getLineNumber();
1712125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
172161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
1732125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher
174746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(),
175746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky                                            SP.getDirectory());
176161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
177161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
178161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
179161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
180161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
181161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
182161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
183161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
184161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify type.
185161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Ty.Verify())
186161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
187161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
188161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = Ty.getLineNumber();
1892125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
190161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
191746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(),
192746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky                                            Ty.getDirectory());
193161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
194161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
195161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
196161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
197161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
198161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
199161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
200b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christophervoid CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
201b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  // Verify type.
202b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  if (!Ty.Verify())
203b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher    return;
204b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
205b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  unsigned Line = Ty.getLineNumber();
206b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  if (Line == 0)
207b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher    return;
208b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  DIFile File = Ty.getFile();
209b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  unsigned FileID = DD->GetOrCreateSourceID(File.getFilename(),
2104d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher                                            File.getDirectory());
211b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  assert(FileID && "Invalid file id");
212b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
213b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
214b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher}
215b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
216b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// addSourceLine - Add location information to specified debug information
217b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// entry.
218161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
219161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify namespace.
220161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!NS.Verify())
221161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
222161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
223161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = NS.getLineNumber();
224161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
225161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
226161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef FN = NS.getFilename();
227161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
228161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory());
229161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
230161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
231161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
232161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
233161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
234e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel/// addVariableAddress - Add DW_AT_location attribute for a
235e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel/// DbgVariable based on provided MachineLocation.
236e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patelvoid CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
237e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel                                     MachineLocation Location) {
238161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DV->variableHasComplexAddress())
239161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
240161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (DV->isBlockByrefVariable())
241161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
242161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
243161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addAddress(Die, dwarf::DW_AT_location, Location);
244161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
245161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
246116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOp - Add register operand.
247116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
248116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
249116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
250116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (DWReg < 32)
251116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
252116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
253116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
254116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
255116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
256116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
257116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
258116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOffset - Add register offset.
259116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
260116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel                                    int64_t Offset) {
261116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
262116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
263116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
264116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (Reg == TRI->getFrameRegister(*Asm->MF))
265116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    // If variable offset is based in frame register then use fbreg.
266116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
267116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else if (DWReg < 32)
268116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
269116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
270116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
271116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
272116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
273116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
274116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
275116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
276116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addAddress - Add an address attribute to a die based on the location
277116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// provided.
278116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addAddress(DIE *Die, unsigned Attribute,
279116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel                             const MachineLocation &Location) {
280116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
281116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
282116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (Location.isReg())
283116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOp(Block, Location.getReg());
284116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else
285116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
286116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
287116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  // Now attach the location information to the DIE.
288116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addBlock(Die, Attribute, 0, Block);
289116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
290116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
291161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addComplexAddress - Start with the address based on the location provided,
292161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// and generate the DWARF information necessary to find the actual variable
293161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given the extra address information encoded in the DIVariable, starting from
294161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// the starting location.  Add the DWARF information to the die.
295161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
296161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
297161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    unsigned Attribute,
298161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    const MachineLocation &Location) {
299161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
300c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  unsigned N = DV->getNumAddrElements();
301c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  unsigned i = 0;
302c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  if (Location.isReg()) {
303c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel    if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
304c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // If first address element is OpPlus then emit
305c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
306c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
307c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      i = 2;
308c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel    } else
309c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      addRegisterOp(Block, Location.getReg());
310c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  }
311116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else
312116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
313161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
314c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  for (;i < N; ++i) {
315161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t Element = DV->getAddrElement(i);
316161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element == DIBuilder::OpPlus) {
317161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
318161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
319161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else if (Element == DIBuilder::OpDeref) {
320501207676c78fefcfc9eeeaa1e3dbe9ea857d33fEric Christopher      if (!Location.isReg())
321501207676c78fefcfc9eeeaa1e3dbe9ea857d33fEric Christopher        addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
322161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else llvm_unreachable("unknown DIBuilder Opcode");
323161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
324161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
325161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
326161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
327161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
328161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
329161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/* Byref variables, in Blocks, are declared by the programmer as "SomeType
330161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
331161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   gives the variable VarName either the struct, or a pointer to the struct, as
332161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   its type.  This is necessary for various behind-the-scenes things the
333161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   compiler needs to do with by-reference variables in Blocks.
334161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
335161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However, as far as the original *programmer* is concerned, the variable
336161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   should still have type 'SomeType', as originally declared.
337161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
338161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The function getBlockByrefType dives into the __Block_byref_x_VarName
339161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to find the original type of the variable, which is then assigned to
340161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the variable's Debug Information Entry as its real type.  So far, so good.
341161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However now the debugger will expect the variable VarName to have the type
342161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   SomeType.  So we need the location attribute for the variable to be an
343161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   expression that explains to the debugger how to navigate through the
344161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   pointers and struct to find the actual variable of type SomeType.
345161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
346161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The following function does just that.  We start by getting
347161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the "normal" location for the variable. This will be the location
348161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   of either the struct __Block_byref_x_VarName or the pointer to the
349161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName.
350161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
351161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The struct will look something like:
352161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
353161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName {
354161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various fields>
355161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     struct __Block_byref_x_VarName *forwarding;
356161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various other fields>
357161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     SomeType VarName;
358161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <maybe more fields>
359161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   };
360161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
361161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we are given the struct directly (as our starting point) we
362161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   need to tell the debugger to:
363161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
364161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   1).  Add the offset of the forwarding field.
365161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
366161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   2).  Follow that pointer to get the real __Block_byref_x_VarName
367161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to use (the real one may have been copied onto the heap).
368161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
369161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   3).  Add the offset for the field VarName, to find the actual variable.
370161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
371161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we started with a pointer to the struct, then we need to
372161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   dereference that pointer first, before the other steps.
373161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   Translating this into DWARF ops, we will need to append the following
374161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   to the current location description for the variable:
375161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
376161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref                    -- optional, if we start with a pointer
377161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <forward_fld_offset>
378161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref
379161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <varName_fld_offset>
380161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
381161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   That is what this function does.  */
382161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
383161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlockByrefAddress - Start with the address based on the location
384161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// provided, and generate the DWARF information necessary to find the
385161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// actual Block variable (navigating the Block struct) based on the
386161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// starting location.  Add the DWARF information to the die.  For
387161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// more information, read large comment just above here.
388161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
389161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
390161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       unsigned Attribute,
391161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       const MachineLocation &Location) {
392161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType Ty = DV->getType();
393161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType TmpTy = Ty;
394161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = Ty.getTag();
395161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool isPointer = false;
396161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
397161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef varName = DV->getName();
398161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
399161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_pointer_type) {
400161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DTy = DIDerivedType(Ty);
401161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    TmpTy = DTy.getTypeDerivedFrom();
402161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    isPointer = true;
403161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
404161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
405161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DICompositeType blockStruct = DICompositeType(TmpTy);
406161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
407161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Find the __forwarding field and the variable field in the __Block_byref
408161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct.
409161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Fields = blockStruct.getTypeArray();
410161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor varField = DIDescriptor();
411161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor forwardingField = DIDescriptor();
412161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
413161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
414161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Fields.getElement(i);
415161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DT = DIDerivedType(Element);
416161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    StringRef fieldName = DT.getName();
417161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (fieldName == "__forwarding")
418161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      forwardingField = Element;
419161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (fieldName == varName)
420161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      varField = Element;
421161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
422161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
423161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the offsets for the forwarding field and the variable field.
424161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned forwardingFieldOffset =
425161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(forwardingField).getOffsetInBits() >> 3;
426161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned varFieldOffset =
427161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(varField).getOffsetInBits() >> 3;
428161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
429161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Decode the original location, and use that as the start of the byref
430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // variable's location.
431161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
432161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
433caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  if (Location.isReg())
434caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher    addRegisterOp(Block, Location.getReg());
435caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  else
436caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
438161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If we started with a pointer to the __Block_byref... struct, then
439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // the first thing we need to do is dereference the pointer (DW_OP_deref).
440161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (isPointer)
441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Next add the offset for the '__forwarding' field:
444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // adding the offset if it's 0.
446161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (forwardingFieldOffset > 0) {
447161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now dereference the __forwarding field to get to the real __Block_byref
452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct:  DW_OP_deref.
453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
454161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
455161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now that we've got the real __Block_byref... struct, add the offset
456161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // for the variable's field to get to the location of the actual variable:
457161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
458161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (varFieldOffset > 0) {
459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
4674ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel/// isTypeSigned - Return true if the type is signed.
4684ec14b0dee433a4f134d832e326a20839b1f777eDevang Patelstatic bool isTypeSigned(DIType Ty, int *SizeInBits) {
4694ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isDerivedType())
4704ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
4714ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isBasicType())
4724ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
4734ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel        || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
4744ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      *SizeInBits = Ty.getSizeInBits();
4754ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      return true;
4764ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    }
4774ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  return false;
4784ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel}
4794ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel
480161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
481b58128e2b2375173aafb07905bd53014d622e4baDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
482b58128e2b2375173aafb07905bd53014d622e4baDevang Patel                                   DIType Ty) {
483746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  assert(MO.isImm() && "Invalid machine operand!");
484161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
4854ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  int SizeInBits = -1;
4864ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
4874ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
4884ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  switch (SizeInBits) {
4894ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 8:  Form = dwarf::DW_FORM_data1; break;
4904ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 16: Form = dwarf::DW_FORM_data2; break;
4914ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 32: Form = dwarf::DW_FORM_data4; break;
4924ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 64: Form = dwarf::DW_FORM_data8; break;
493045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel    default: break;
494045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel  }
4954ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
4964ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    : addUInt(Block, 0, Form, MO.getImm());
49772f0d9cdefa3086715e1e2547a9843321690b4d9Devang Patel
498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
502161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantFPValue - Add constant value entry in variable DIE.
503161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelbool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
504390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  assert (MO.isFPImm() && "Invalid machine operand!");
505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  APFloat FPImm = MO.getFPImm()->getValueAPF();
507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the floating point.
509161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const APInt FltVal = FPImm.bitcastToAPInt();
510161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const char *FltPtr = (const char*)FltVal.getRawData();
511161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
512161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
513161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool LittleEndian = Asm->getTargetData().isLittleEndian();
514161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Incr = (LittleEndian ? 1 : -1);
515161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Start = (LittleEndian ? 0 : NumBytes - 1);
516161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Stop = (LittleEndian ? NumBytes : -1);
517161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
518161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
519161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (; Start != Stop; Start += Incr)
520161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1,
521161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            (unsigned char)0xFF & FltPtr[Start]);
522161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
523161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
524161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
526161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
527161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
5288594d429e02c688d428036f8563f09572da3fbffDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                   bool Unsigned) {
530d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel  unsigned CIBitWidth = CI->getBitWidth();
531d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel  if (CIBitWidth <= 64) {
532d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    unsigned form = 0;
533d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    switch (CIBitWidth) {
534d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 8: form = dwarf::DW_FORM_data1; break;
535d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 16: form = dwarf::DW_FORM_data2; break;
536d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 32: form = dwarf::DW_FORM_data4; break;
537d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 64: form = dwarf::DW_FORM_data8; break;
538d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    default:
539d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
540d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    }
541161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Unsigned)
542d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
543161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else
544d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
545161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return true;
546161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
547161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
548161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
549161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
550161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the large APInt.
551161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const APInt Val = CI->getValue();
552c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  const uint64_t *Ptr64 = Val.getRawData();
553161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
554161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
555161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool LittleEndian = Asm->getTargetData().isLittleEndian();
556161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
557161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
558c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  for (int i = 0; i < NumBytes; i++) {
559c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    uint8_t c;
560c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    if (LittleEndian)
561c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[i / 8] >> (8 * (i & 7));
562c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    else
563c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
564c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    addUInt(Block, 0, dwarf::DW_FORM_data1, c);
565c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  }
566161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
567161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
568161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
569161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
570161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
571161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addTemplateParams - Add template parameters in buffer.
572161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
573161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add template parameters.
574161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
575161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = TParams.getElement(i);
576161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.isTemplateTypeParameter())
577161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
578161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateTypeParameter(Element)));
579161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (Element.isTemplateValueParameter())
580161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateValueParameterDIE(
581161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateValueParameter(Element)));
582161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
583161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
584746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky
585161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addToContextOwner - Add Die into the list of its context owner's children.
586161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
587161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Context.isType()) {
588161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
589161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
590161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else if (Context.isNameSpace()) {
591161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
592161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
593161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else if (Context.isSubprogram()) {
594dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
595161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
596161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else if (DIE *ContextDIE = getDIE(Context))
597161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
598161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
599161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(Die);
600161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
601161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
602161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
603161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given DIType.
60494c7ddb6f52a5200983fed0ce74dc602a7737879Devang PatelDIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
60594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  DIType Ty(TyNode);
60694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  if (!Ty.Verify())
60794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel    return NULL;
608161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *TyDIE = getDIE(Ty);
609161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (TyDIE)
610161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return TyDIE;
611161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
612161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Create new type.
613161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  TyDIE = new DIE(dwarf::DW_TAG_base_type);
614161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIE(Ty, TyDIE);
615161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Ty.isBasicType())
616161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIBasicType(Ty));
617161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (Ty.isCompositeType())
618161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DICompositeType(Ty));
619161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else {
620161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    assert(Ty.isDerivedType() && "Unknown kind of DIType");
621161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIDerivedType(Ty));
622161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
6231b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // If this is a named finished type then include it in the list of types
6241b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // for the accelerator tables.
625c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
626c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    bool IsImplementation = 0;
627c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    if (Ty.isCompositeType()) {
628c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      DICompositeType CT(Ty);
629e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // A runtime language of 0 actually means C/C++ and that any
630e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // non-negative value is some version of Objective-C/C++.
631c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      IsImplementation = (CT.getRunTimeLang() == 0) ||
632e2dc9336d15ad3ca4f38d296d17f6682829b80b4Eric Christopher        CT.isObjcClassComplete();
633c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    }
634e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    unsigned Flags = IsImplementation ?
635e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher                     DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
636e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
637c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  }
6381b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher
639161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addToContextOwner(TyDIE, Ty.getContext());
640161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return TyDIE;
641161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
642161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
643161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addType - Add a new type attribute to the specified entity.
6444d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christophervoid CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) {
645161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Ty.Verify())
646161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
647161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
648161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Check for pre-existence.
649161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Entry = getDIEEntry(Ty);
650161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If it exists then use the existing value.
651161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Entry) {
652663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher    Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
653161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
654161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
655161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
656161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Construct type.
657161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Buffer = getOrCreateTypeDIE(Ty);
658161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
659161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Set up proxy.
660161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Entry = createDIEEntry(Buffer);
661161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIEEntry(Ty, Entry);
662663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher  Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
663e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel
664e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // If this is a complete composite type then include it in the
665e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // list of global types.
666c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel  addGlobalType(Ty);
66766658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel}
66866658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel
66966658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel/// addGlobalType - Add a new global type to the compile unit.
67066658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel///
671c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patelvoid CompileUnit::addGlobalType(DIType Ty) {
672e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  DIDescriptor Context = Ty.getContext();
673e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
67494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel      && (!Context || Context.isCompileUnit() || Context.isFile()
67594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel          || Context.isNameSpace()))
676c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    if (DIEEntry *Entry = getDIEEntry(Ty))
677c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel      GlobalTypes[Ty.getName()] = Entry->getEntry();
678161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
679161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
68031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// addPubTypes - Add type for pubtypes section.
68131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patelvoid CompileUnit::addPubTypes(DISubprogram SP) {
68231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DICompositeType SPTy = SP.getType();
68331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  unsigned SPTag = SPTy.getTag();
68431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (SPTag != dwarf::DW_TAG_subroutine_type)
68531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return;
68631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
68731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIArray Args = SPTy.getTypeArray();
68831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
68931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    DIType ATy(Args.getElement(i));
69031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    if (!ATy.Verify())
69131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel      continue;
692c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    addGlobalType(ATy);
69331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  }
69431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
69531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
696161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct basic type die from DIBasicType.
697161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
698161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
699161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = BTy.getName();
700161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
701161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
702390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
703734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
704734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
705734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    Buffer.setTag(dwarf::DW_TAG_unspecified_type);
706734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    // Unspecified types has only name, nothing else.
707734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    return;
708734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  }
709734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
710734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  Buffer.setTag(dwarf::DW_TAG_base_type);
711746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
71230d409ca097e35c51964c9dac642804e5e495906Devang Patel          BTy.getEncoding());
713734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
714161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = BTy.getSizeInBits() >> 3;
715161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
716161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
717161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
718161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct derived type die from DIDerivedType.
719161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
720161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
721161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DTy.getName();
722161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DTy.getSizeInBits() >> 3;
723161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = DTy.getTag();
724161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
725161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // FIXME - Workaround for templates.
726161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
727161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
728161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
729161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
730161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Map to main type, void will not have a type.
731161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType FromTy = DTy.getTypeDerivedFrom();
732161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, FromTy);
733161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
734161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
735161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
736390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
737161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
738161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add size if non-zero (derived types might be zero-sized.)
73935f225aa2c04ca2420161cca812cb3eb611bde51Eric Christopher  if (Size && Tag != dwarf::DW_TAG_pointer_type)
740161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
741161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
742161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add source line info if available and TyDesc is not a forward declaration.
743161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!DTy.isForwardDecl())
744161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addSourceLine(&Buffer, DTy);
745161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
746161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
747161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct type DIE from DICompositeType.
748161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
749161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
750161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = CTy.getName();
751161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
752161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = CTy.getSizeInBits() >> 3;
753161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = CTy.getTag();
754161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
755161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
756161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  switch (Tag) {
757161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_vector_type:
758161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_array_type:
759161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructArrayTypeDIE(Buffer, &CTy);
760161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
761161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_enumeration_type: {
762161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
763161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
764161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add enumerators to enumeration type.
765161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
766161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
767161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Enum(Elements.getElement(i));
768161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Enum.isEnumerator()) {
769161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
770161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(ElemDie);
771161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
772161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
773bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    DIType DTy = CTy.getTypeDerivedFrom();
774bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    if (DTy.Verify()) {
775bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher      addType(&Buffer, DTy);
776bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher      addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
777bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    }
778161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
779161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
780161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_subroutine_type: {
781161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add return type.
782161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
783161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor RTy = Elements.getElement(0);
784161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addType(&Buffer, DIType(RTy));
785161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
786161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    bool isPrototyped = true;
787161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add arguments.
788161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
789161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Ty = Elements.getElement(i);
790161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Ty.isUnspecifiedParameter()) {
791161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
792161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
793161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        isPrototyped = false;
794161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      } else {
795161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
796161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addType(Arg, DIType(Ty));
797161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
798161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
799161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
8008b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // Add prototype flag if we're dealing with a C language and the
8018b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // function has been prototyped.
8028b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    if (isPrototyped &&
8034d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        (Language == dwarf::DW_LANG_C89 ||
8044d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher         Language == dwarf::DW_LANG_C99 ||
8054d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher         Language == dwarf::DW_LANG_ObjC))
806873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_prototyped);
807161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
808161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
809161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_structure_type:
810161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_union_type:
811161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_class_type: {
812161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
813161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
814161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
815161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // A forward struct declared type may not have elements available.
816161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    unsigned N = Elements.getNumElements();
817161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (N == 0)
818161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      break;
819161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
820161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
821161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 0; i < N; ++i) {
822161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Element = Elements.getElement(i);
823161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
824161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Element.isSubprogram()) {
825161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DISubprogram SP(Element);
826dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
827161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isProtected())
82813aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
829161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_protected);
830161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        else if (SP.isPrivate())
83113aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
832161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_private);
833161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        else
83413aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
835161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
836161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isExplicit())
837873cf0a0d7906083578d9b793008348750636138Eric Christopher          addFlag(ElemDie, dwarf::DW_AT_explicit);
838161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
839161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      else if (Element.isVariable()) {
840161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIVariable DV(Element);
841161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        ElemDie = new DIE(dwarf::DW_TAG_variable);
842390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky        addString(ElemDie, dwarf::DW_AT_name, DV.getName());
843161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addType(ElemDie, DV.getType());
844873cf0a0d7906083578d9b793008348750636138Eric Christopher        addFlag(ElemDie, dwarf::DW_AT_declaration);
845873cf0a0d7906083578d9b793008348750636138Eric Christopher        addFlag(ElemDie, dwarf::DW_AT_external);
846161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addSourceLine(ElemDie, DV);
847663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isDerivedType()) {
8484d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        DIDerivedType DDTy(Element);
8494d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        if (DDTy.getTag() == dwarf::DW_TAG_friend) {
8504d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          ElemDie = new DIE(dwarf::DW_TAG_friend);
8514d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
8524d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        } else
8534d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          ElemDie = createMemberDIE(DIDerivedType(Element));
854663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isObjCProperty()) {
85530d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIObjCProperty Property(Element);
85630d409ca097e35c51964c9dac642804e5e495906Devang Patel        ElemDie = new DIE(Property.getTag());
85730d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef PropertyName = Property.getObjCPropertyName();
85830d409ca097e35c51964c9dac642804e5e495906Devang Patel        addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
8594d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        addType(ElemDie, Property.getType());
8604d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        addSourceLine(ElemDie, Property);
86130d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef GetterName = Property.getObjCPropertyGetterName();
86230d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!GetterName.empty())
86330d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
86430d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef SetterName = Property.getObjCPropertySetterName();
86530d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!SetterName.empty())
86630d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
86730d409ca097e35c51964c9dac642804e5e495906Devang Patel        unsigned PropertyAttributes = 0;
8689e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadOnlyObjCProperty())
8699e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
8709e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadWriteObjCProperty())
8719e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
8729e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isAssignObjCProperty())
8739e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
8749e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isRetainObjCProperty())
8759e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
8769e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isCopyObjCProperty())
8779e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
8789e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isNonAtomicObjCProperty())
8799e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
8809e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (PropertyAttributes)
8819e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
8829e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel                 PropertyAttributes);
8836588abf377b7381274236e651462ec83052f6013Devang Patel
88430d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIEEntry *Entry = getDIEEntry(Element);
88530d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!Entry) {
88630d409ca097e35c51964c9dac642804e5e495906Devang Patel          Entry = createDIEEntry(ElemDie);
88730d409ca097e35c51964c9dac642804e5e495906Devang Patel          insertDIEEntry(Element, Entry);
88830d409ca097e35c51964c9dac642804e5e495906Devang Patel        }
8899e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel      } else
890161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        continue;
891161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(ElemDie);
892161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
893161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
894161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (CTy.isAppleBlockExtension())
895873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
896161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
897161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DICompositeType ContainingType = CTy.getContainingType();
898161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (DIDescriptor(ContainingType).isCompositeType())
899161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
900161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  getOrCreateTypeDIE(DIType(ContainingType)));
901161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else {
902161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Context = CTy.getContext();
903161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addToContextOwner(&Buffer, Context);
904161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
905161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
906201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel    if (CTy.isObjcClassComplete())
907873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
908b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel
9091a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // Add template parameters to a class, structure or union types.
9101a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // FIXME: The support isn't in the metadata for this yet.
9111a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    if (Tag == dwarf::DW_TAG_class_type ||
9121a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_structure_type ||
9131a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_union_type)
914161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addTemplateParams(Buffer, CTy.getTemplateParams());
915161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
916161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
917161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
918161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  default:
919161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
920161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
921161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
922161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
923161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
924390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
925161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
9264a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher  if (Tag == dwarf::DW_TAG_enumeration_type ||
9274a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_class_type ||
9284a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_structure_type ||
9294a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_union_type) {
930161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add size if non-zero (derived types might be zero-sized.)
931fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // TODO: Do we care about size for enum forward declarations?
932161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Size)
933161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
934fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    else if (!CTy.isForwardDecl())
935161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      // Add zero size if it is not a forward declaration.
936fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
937fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher
938fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // If we're a forward decl, say so.
939fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    if (CTy.isForwardDecl())
940873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_declaration);
941161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
942161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add source line info if available.
943161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (!CTy.isForwardDecl())
944161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addSourceLine(&Buffer, CTy);
9458938895a8338e6084eb12a2bb4bf044928436173Eric Christopher
9468938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    // No harm in adding the runtime language to the declaration.
9478938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    unsigned RLang = CTy.getRunTimeLang();
9488938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    if (RLang)
9498938895a8338e6084eb12a2bb4bf044928436173Eric Christopher      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
9508938895a8338e6084eb12a2bb4bf044928436173Eric Christopher              dwarf::DW_FORM_data1, RLang);
951161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
952161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
953161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
954161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
955161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateTypeParameter.
956161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
957161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
958161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TP);
959161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
960161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
961161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
962161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
963161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TP.getType());
964390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
965161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
966161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
967161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
968161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
969161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateValueParameter.
970161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
9714d069bf8ec726570d668e59fda993a33dfb7cb0bEric ChristopherCompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){
972161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TPV);
973161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
974161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
975161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
976161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
977161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TPV.getType());
978161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!TPV.getName().empty())
979390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
980161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
981161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel          TPV.getValue());
982161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
983161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
984161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
98531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// getOrCreateNameSpace - Create a DIE for DINameSpace.
98631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang PatelDIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
98731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIE *NDie = getDIE(NS);
98831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (NDie)
98931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return NDie;
99031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  NDie = new DIE(dwarf::DW_TAG_namespace);
99131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  insertDIE(NS, NDie);
99209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  if (!NS.getName().empty()) {
993390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(NDie, dwarf::DW_AT_name, NS.getName());
99409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace(NS.getName(), NDie);
99509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  } else
99609ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace("(anonymous namespace)", NDie);
99731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addSourceLine(NDie, NS);
99831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addToContextOwner(NDie, NS.getContext());
99931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  return NDie;
100031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
100131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
1002dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1003dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// printer to not emit usual symbol prefix before the symbol name is used then
1004dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// return linkage name after skipping this special LLVM prefix.
1005dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelstatic StringRef getRealLinkageName(StringRef LinkageName) {
1006dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  char One = '\1';
1007dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (LinkageName.startswith(StringRef(&One, 1)))
1008dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return LinkageName.substr(1);
1009dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  return LinkageName;
1010dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1011dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1012dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getOrCreateSubprogramDIE - Create new DIE using SP.
1013dbc64af76d769596903485668a1dfc2d6640c4fbDevang PatelDIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1014dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DIE *SPDie = getDIE(SP);
1015dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SPDie)
1016dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
1017dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
101827302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  SPDie = new DIE(dwarf::DW_TAG_subprogram);
101927302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne
102027302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  // DW_TAG_inlined_subroutine may refer to this DIE.
102127302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  insertDIE(SP, SPDie);
102227302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne
102301b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DISubprogram SPDecl = SP.getFunctionDeclaration();
102401b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DIE *DeclDie = NULL;
102501b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (SPDecl.isSubprogram()) {
102601b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    DeclDie = getOrCreateSubprogramDIE(SPDecl);
102701b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
102801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1029dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add to context owner.
1030dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addToContextOwner(SPDie, SP.getContext());
1031dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1032dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add function template parameters.
1033dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addTemplateParams(*SPDie, SP.getTemplateParams());
1034dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1035e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher  // Unfortunately this code needs to stay here instead of below the
1036e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher  // AT_specification code in order to work around a bug in older
1037e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher  // gdbs that requires the linkage name to resolve multiple template
1038e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher  // functions.
1039cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  // TODO: Remove this set of code when we get rid of the old gdb
1040cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  // compatibility.
10418d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher  StringRef LinkageName = SP.getLinkageName();
1042cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  if (!LinkageName.empty() && DD->useDarwinGDBCompat())
10438d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
10448d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher              getRealLinkageName(LinkageName));
10458d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher
1046dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // If this DIE is going to refer declaration info using AT_specification
1047dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // then there is no need to add other attributes.
104801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (DeclDie) {
104901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    // Refer function declaration directly.
105001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
105101b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola                DeclDie);
105201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1053dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
105401b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
1055dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1056cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  // Add the linkage name if we have one.
1057cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
1058cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1059cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher              getRealLinkageName(LinkageName));
1060cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher
1061dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Constructors and operators for anonymous aggregates do not have names.
1062dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.getName().empty())
1063390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(SPDie, dwarf::DW_AT_name, SP.getName());
1064dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1065dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addSourceLine(SPDie, SP);
1066dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
10678b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // Add the prototype if we have a prototype and we have a C like
10688b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // language.
10698b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  if (SP.isPrototyped() &&
10708b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher      (Language == dwarf::DW_LANG_C89 ||
10718b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_C99 ||
10728b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_ObjC))
1073873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_prototyped);
1074dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1075dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add Return Type.
1076dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DICompositeType SPTy = SP.getType();
1077dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DIArray Args = SPTy.getTypeArray();
1078dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  unsigned SPTag = SPTy.getTag();
1079dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1080dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1081dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addType(SPDie, SPTy);
1082dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  else
1083dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addType(SPDie, DIType(Args.getElement(0)));
1084dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1085dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  unsigned VK = SP.getVirtuality();
1086dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (VK) {
1087798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1088dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIEBlock *Block = getDIEBlock();
1089dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1090dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1091dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1092dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    ContainingTypeMap.insert(std::make_pair(SPDie,
1093dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel                                            SP.getContainingType()));
1094dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1095dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1096dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isDefinition()) {
1097873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_declaration);
1098dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1099dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // Add arguments. Do not add arguments for subprogram definition. They will
1100dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // be handled while processing variables.
1101dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DICompositeType SPTy = SP.getType();
1102dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIArray Args = SPTy.getTypeArray();
1103dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    unsigned SPTag = SPTy.getTag();
1104dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1105dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (SPTag == dwarf::DW_TAG_subroutine_type)
1106dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel      for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1107dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1108dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        DIType ATy = DIType(DIType(Args.getElement(i)));
1109dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        addType(Arg, ATy);
1110dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        if (ATy.isArtificial())
1111873cf0a0d7906083578d9b793008348750636138Eric Christopher          addFlag(Arg, dwarf::DW_AT_artificial);
1112dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        SPDie->addChild(Arg);
1113dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel      }
1114dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1115dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1116dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isArtificial())
1117873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_artificial);
1118dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1119dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isLocalToUnit())
1120873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_external);
1121dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1122dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isOptimized())
1123873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1124dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1125dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (unsigned isa = Asm->getISAEncoding()) {
1126dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1127dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1128dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1129dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  return SPDie;
1130dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1131dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
11326f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// Return const expression if value is a GEP to access merged global
11336f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// constant. e.g.
11346f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
11356f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelstatic const ConstantExpr *getMergedGlobalExpr(const Value *V) {
11366f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
11376f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CE || CE->getNumOperands() != 3 ||
11386f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      CE->getOpcode() != Instruction::GetElementPtr)
11396f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11406f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11416f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // First operand points to a global struct.
11426f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  Value *Ptr = CE->getOperand(0);
11436f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<GlobalValue>(Ptr) ||
11446f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
11456f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11466f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11476f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Second operand is zero.
11486f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
11496f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CI || !CI->isZero())
11506f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11516f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11526f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Third operand is offset.
11536f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<ConstantInt>(CE->getOperand(2)))
11546f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11556f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11566f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  return CE;
11576f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
11586f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11596f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel/// createGlobalVariableDIE - create global variable DIE.
11606f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelvoid CompileUnit::createGlobalVariableDIE(const MDNode *N) {
11616f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Check for pre-existence.
116249e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  if (getDIE(N))
11636f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return;
11646f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
116549e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIGlobalVariable GV(N);
116628bea08e531452992ff1e25e8584883dfbd4c232Devang Patel  if (!GV.Verify())
116728bea08e531452992ff1e25e8584883dfbd4c232Devang Patel    return;
116828bea08e531452992ff1e25e8584883dfbd4c232Devang Patel
11696f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  DIE *VariableDIE = new DIE(GV.getTag());
117049e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  // Add to map.
117149e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  insertDIE(N, VariableDIE);
11726f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11736f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add name.
1174390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
11756f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  StringRef LinkageName = GV.getLinkageName();
117649e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  bool isGlobalVariable = GV.getGlobal() != NULL;
11776f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!LinkageName.empty() && isGlobalVariable)
1178746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky    addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1179390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky              getRealLinkageName(LinkageName));
11806f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add type.
118149e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIType GTy = GV.getType();
11826f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  addType(VariableDIE, GTy);
11836f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11846f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add scoping info.
1185dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher  if (!GV.isLocalToUnit())
1186873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(VariableDIE, dwarf::DW_AT_external);
1187dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher
11886f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add line number info.
11896f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  addSourceLine(VariableDIE, GV);
11906f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add to context owner.
11916f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  DIDescriptor GVContext = GV.getContext();
11926f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  addToContextOwner(VariableDIE, GVContext);
11936f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add location.
119409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  bool addToAccelTable = false;
1195d61c34ba30888c49f4f223422f30b018a41594daEric Christopher  DIE *VariableSpecDIE = NULL;
11966f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (isGlobalVariable) {
119709ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
11986f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
11996f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
12006f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addLabel(Block, 0, dwarf::DW_FORM_udata,
12016f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel             Asm->Mang->getSymbol(GV.getGlobal()));
12026f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // Do not create specification DIE if context is either compile unit
12036f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // or a subprogram.
12041dd4e56d5565d59e9d40ad9e088a05e06f4b70f8Devang Patel    if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
12056f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel        !GVContext.isFile() && !isSubprogramContext(GVContext)) {
12066f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      // Create specification DIE.
1207d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
12086f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
12096f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                  dwarf::DW_FORM_ref4, VariableDIE);
12106f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1211873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(VariableDIE, dwarf::DW_AT_declaration);
12126f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDie(VariableSpecDIE);
12136f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    } else {
12146f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
121509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    }
12166f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  } else if (const ConstantInt *CI =
12176f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel             dyn_cast_or_null<ConstantInt>(GV.getConstant()))
12186f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
12196f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
122009ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
12216f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // GV is a merged global.
12226f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
12236f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    Value *Ptr = CE->getOperand(0);
12246f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
12256f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addLabel(Block, 0, dwarf::DW_FORM_udata,
12266f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                    Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
12276f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
12286f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
12296f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata,
12306f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                   Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
12316f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
12326f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
12336f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  }
12346f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1235d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  if (addToAccelTable) {
1236d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1237d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    addAccelName(GV.getName(), AddrDIE);
123809ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher
1239d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // If the linkage name is different than the name, go ahead and output
1240d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // that as well into the name table.
1241d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1242d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      addAccelName(GV.getLinkageName(), AddrDIE);
1243d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  }
124474d8a87f40dd89ec263071c0af4d77104b166f4aEric Christopher
12456f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  return;
12466f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
12476f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1248161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
12494d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christophervoid CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
12504d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher                                       DIE *IndexTy) {
1251161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1252161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1253ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel  uint64_t L = SR.getLo();
1254ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel  uint64_t H = SR.getHi();
1255161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1256161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // The L value defines the lower bounds which is typically zero for C/C++. The
1257161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // H value is the upper bounds.  Values are 64 bit.  H - L + 1 is the size
1258161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // of the array. If L > H then do not emit DW_AT_lower_bound and
1259161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
1260161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // array has one element and in such case do not emit lower bound.
1261161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1262161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (L > H) {
1263161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    Buffer.addChild(DW_Subrange);
1264161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
1265161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1266161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (L)
1267ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel    addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1268ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel  addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1269161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.addChild(DW_Subrange);
1270161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1271161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1272161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1273161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1274161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                        DICompositeType *CTy) {
1275161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(dwarf::DW_TAG_array_type);
1276161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1277873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
1278161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1279161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Emit derived type.
1280161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, CTy->getTypeDerivedFrom());
1281161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Elements = CTy->getTypeArray();
1282161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1283161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get an anonymous type for index type.
1284161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *IdxTy = getIndexTyDie();
1285161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!IdxTy) {
1286161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Construct an anonymous type for index type.
1287161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    IdxTy = new DIE(dwarf::DW_TAG_base_type);
1288161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1289161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1290161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ATE_signed);
1291161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(IdxTy);
1292161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    setIndexTyDie(IdxTy);
1293161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1294161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1295161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add subranges to array type.
1296161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1297161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Elements.getElement(i);
1298161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1299161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1300161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1301161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1302161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1303161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1304161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1305161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1306161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = ETy.getName();
1307390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(Enumerator, dwarf::DW_AT_name, Name);
1308161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int64_t Value = ETy.getEnumValue();
1309161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1310161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Enumerator;
1311161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1312161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1313dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// constructContainingTypeDIEs - Construct DIEs for types that contain
1314dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// vtables.
1315dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelvoid CompileUnit::constructContainingTypeDIEs() {
1316dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1317dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1318dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *SPDie = CI->first;
1319dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    const MDNode *N = CI->second;
1320dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!N) continue;
1321dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *NDie = getDIE(N);
1322dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!NDie) continue;
1323dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1324dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1325dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1326dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1327d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1328d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang PatelDIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1329d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  StringRef Name = DV->getName();
1330d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (Name.empty())
1331d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return NULL;
1332d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1333d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Translate tag to proper Dwarf tag.
1334d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Tag = DV->getTag();
1335d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1336d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Define variable debug information entry.
1337d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *VariableDie = new DIE(Tag);
1338d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DbgVariable *AbsVar = DV->getAbstractVariable();
1339d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1340d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (AbsDIE)
1341d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1342d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                            dwarf::DW_FORM_ref4, AbsDIE);
1343d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  else {
1344390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(VariableDie, dwarf::DW_AT_name, Name);
1345d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addSourceLine(VariableDie, DV->getVariable());
1346d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addType(VariableDie, DV->getType());
1347d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1348d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1349d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (DV->isArtificial())
1350873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(VariableDie, dwarf::DW_AT_artificial);
1351d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1352d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (isScopeAbstract) {
1353d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1354d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1355d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1356d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1357d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Add variable address.
1358d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1359d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Offset = DV->getDotDebugLocOffset();
1360d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (Offset != ~0U) {
1361d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addLabel(VariableDie, dwarf::DW_AT_location,
1362d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                         dwarf::DW_FORM_data4,
1363d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                         Asm->GetTempSymbol("debug_loc", Offset));
1364d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1365d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1366d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1367d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
13688cf5e74a9cc7482901125b810f1e482d24e9404dEric Christopher  // Check if variable is described by a DBG_VALUE instruction.
1369d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (const MachineInstr *DVInsn = DV->getMInsn()) {
1370d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    bool updated = false;
1371d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (DVInsn->getNumOperands() == 3) {
1372d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      if (DVInsn->getOperand(0).isReg()) {
1373d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        const MachineOperand RegOp = DVInsn->getOperand(0);
1374d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1375d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        if (DVInsn->getOperand(1).isImm() &&
1376d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel            TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1377d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          unsigned FrameReg = 0;
1378d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1379d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          int Offset =
1380d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel            TFI->getFrameIndexReference(*Asm->MF,
1381d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                        DVInsn->getOperand(1).getImm(),
1382d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                        FrameReg);
1383d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          MachineLocation Location(FrameReg, Offset);
1384d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addVariableAddress(DV, VariableDie, Location);
1385d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1386d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        } else if (RegOp.getReg())
1387d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addVariableAddress(DV, VariableDie,
1388d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                         MachineLocation(RegOp.getReg()));
1389d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated = true;
1390d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      }
1391d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      else if (DVInsn->getOperand(0).isImm())
1392d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated =
1393d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addConstantValue(VariableDie, DVInsn->getOperand(0),
1394d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                       DV->getType());
1395d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      else if (DVInsn->getOperand(0).isFPImm())
1396d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated =
1397d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1398d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      else if (DVInsn->getOperand(0).isCImm())
1399d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated =
1400d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addConstantValue(VariableDie,
1401d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                       DVInsn->getOperand(0).getCImm(),
1402d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                       DV->getType().isUnsignedDIType());
1403d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    } else {
1404d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      addVariableAddress(DV, VariableDie,
1405d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                     Asm->getDebugValueLocation(DVInsn));
1406d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      updated = true;
1407d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1408d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (!updated) {
1409d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      // If variableDie is not updated then DBG_VALUE instruction does not
1410d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      // have valid variable info.
1411d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      delete VariableDie;
1412d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      return NULL;
1413d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1414d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1415d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1416d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  } else {
1417d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    // .. else use frame index.
1418d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    int FI = DV->getFrameIndex();
1419d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (FI != ~0) {
1420d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      unsigned FrameReg = 0;
1421d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1422d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      int Offset =
1423d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1424d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      MachineLocation Location(FrameReg, Offset);
1425d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      addVariableAddress(DV, VariableDie, Location);
1426d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1427d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1428d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1429d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DV->setDIE(VariableDie);
1430d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  return VariableDie;
1431d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel}
1432d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1433161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createMemberDIE - Create new member DIE.
1434161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1435161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *MemberDie = new DIE(DT.getTag());
1436161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DT.getName();
1437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
1438390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(MemberDie, dwarf::DW_AT_name, Name);
1439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1440161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(MemberDie, DT.getTypeDerivedFrom());
1441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSourceLine(MemberDie, DT);
1443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1446161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1447161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DT.getSizeInBits();
1448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t FieldSize = DT.getOriginalTypeSize();
1449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Size != FieldSize) {
1451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Handle bitfield.
1452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1454161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1455161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t Offset = DT.getOffsetInBits();
1456161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1457161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1458161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t FieldOffset = (HiMark - FieldSize);
1459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    Offset -= FieldOffset;
1460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Maybe we need to work from the other end.
1462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Asm->getTargetData().isLittleEndian())
1463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Offset = FieldSize - (Offset + Size);
1464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Here WD_AT_data_member_location points to the anonymous
1467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // field that includes this bit field.
1468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1469161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // This is not a bitfield.
1472161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.getTag() == dwarf::DW_TAG_inheritance
1475161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      && DT.isVirtual()) {
1476161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1477161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // For C++, virtual base classes are not at fixed offset. Use following
1478161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // expression to extract appropriate offset from vtable.
1479161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1480161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1481161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1482161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1483161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1484161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1487161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1488161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1490161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1491161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel             VBaseLocationDie);
1492161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1493161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1494161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isProtected())
149613aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1497161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_protected);
1498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (DT.isPrivate())
149913aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_private);
1501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Otherwise C++ member and base classes are considered public.
150294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  else
150313aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
1505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isVirtual())
1506798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_VIRTUALITY_virtual);
1508e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel
1509e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  // Objective-C properties.
15106588abf377b7381274236e651462ec83052f6013Devang Patel  if (MDNode *PNode = DT.getObjCProperty())
15116588abf377b7381274236e651462ec83052f6013Devang Patel    if (DIEEntry *PropertyDie = getDIEEntry(PNode))
15126588abf377b7381274236e651462ec83052f6013Devang Patel      MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
15136588abf377b7381274236e651462ec83052f6013Devang Patel                          PropertyDie);
15146588abf377b7381274236e651462ec83052f6013Devang Patel
15159e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel  // This is only for backward compatibility.
1516e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  StringRef PropertyName = DT.getObjCPropertyName();
1517e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  if (!PropertyName.empty()) {
1518390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1519e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    StringRef GetterName = DT.getObjCPropertyGetterName();
1520e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (!GetterName.empty())
1521390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky      addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1522e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    StringRef SetterName = DT.getObjCPropertySetterName();
1523e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (!SetterName.empty())
1524390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky      addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1525e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    unsigned PropertyAttributes = 0;
1526e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isReadOnlyObjCProperty())
1527e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1528e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isReadWriteObjCProperty())
1529e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1530e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isAssignObjCProperty())
1531e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1532e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isRetainObjCProperty())
1533e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1534e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isCopyObjCProperty())
1535e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1536e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isNonAtomicObjCProperty())
1537e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1538e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (PropertyAttributes)
1539e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1540e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel              PropertyAttributes);
1541e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  }
1542161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return MemberDie;
1543161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1544