DwarfCompileUnit.cpp revision f61dbc15750f0b1a9a089ac91e6f5e7235335c25
1161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
3161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//                     The LLVM Compiler Infrastructure
4161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
5161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// This file is distributed under the University of Illinois Open Source
6161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// License. See LICENSE.TXT for details.
7161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
8161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===//
9161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
10443c9ed7688e66c55c43819a75be681574b291deEric Christopher// This file contains support for constructing a dwarf compile unit.
11161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
12161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===//
13161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
14161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#define DEBUG_TYPE "dwarfdebug"
15161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
16161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfCompileUnit.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "DwarfAccelTable.h"
18161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfDebug.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/APFloat.h"
2016eeb6f5ebc978b03745177b9ac82684ab1c6932Bill Wendling#include "llvm/DIBuilder.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h"
240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
25d61c34ba30888c49f4f223422f30b018a41594daEric Christopher#include "llvm/Support/Debug.h"
26d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h"
276f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/Target/Mangler.h"
28161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetFrameLowering.h"
29161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetMachine.h"
30161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetRegisterInfo.h"
31161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
32161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelusing namespace llvm;
33161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
34161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// CompileUnit - Compile unit constructor.
359c57ad2381488b7cde7e3eb459d2ce3e447e93b7Eric ChristopherCompileUnit::CompileUnit(unsigned UID, unsigned L, DIE *D, const MDNode *N,
365592ba4775964ab5e15a4603249e6beadfa5ce7aEric Christopher                         AsmPrinter *A, DwarfDebug *DW, DwarfUnits *DWU)
372e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher  : UniqueID(UID), Language(L), CUDie(D), Asm(A), DD(DW), DU(DWU),
38bc3e96f17bb278358cd3976f35b87591a392f5afManman Ren    IndexTyDie(0), DebugInfoOffset(0) {
39161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
409c57ad2381488b7cde7e3eb459d2ce3e447e93b7Eric Christopher  insertDIE(N, D);
41161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
42161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
43161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// ~CompileUnit - Destructor for compile unit.
44161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::~CompileUnit() {
45161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
46161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlocks[j]->~DIEBlock();
47161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
48161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
49161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
50161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// information entry.
51161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
52161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
53161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Value;
54161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
55161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
566afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling/// getDefaultLowerBound - Return the default lower bound for an array. If the
57222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling/// DWARF version doesn't handle the language, return -1.
586afe478e005bf9f112b32b7ec25879475adc1915Bill Wendlingint64_t CompileUnit::getDefaultLowerBound() const {
59222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  switch (Language) {
60222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  default:
61222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
62222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
63222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C89:
64222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C99:
65222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C:
66222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C_plus_plus:
67222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_ObjC:
68222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_ObjC_plus_plus:
69222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    return 0;
70222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
71222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran77:
72222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran90:
73222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran95:
74222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    return 1;
75222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
76222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // The languages below have valid values only if the DWARF version >= 4.
77222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Java:
78222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Python:
79222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_UPC:
80222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_D:
81222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    if (dwarf::DWARF_VERSION >= 4)
82222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling      return 0;
83222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
84222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
85222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Ada83:
86222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Ada95:
87222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Cobol74:
88222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Cobol85:
89222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Modula2:
90222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Pascal83:
91222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_PLI:
92222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    if (dwarf::DWARF_VERSION >= 4)
93222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling      return 1;
94222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
95222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  }
96222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
97222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  return -1;
98222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling}
99222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
100873cf0a0d7906083578d9b793008348750636138Eric Christopher/// addFlag - Add a flag that is true.
101873cf0a0d7906083578d9b793008348750636138Eric Christophervoid CompileUnit::addFlag(DIE *Die, unsigned Attribute) {
102873cf0a0d7906083578d9b793008348750636138Eric Christopher  if (!DD->useDarwinGDBCompat())
103873cf0a0d7906083578d9b793008348750636138Eric Christopher    Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
104873cf0a0d7906083578d9b793008348750636138Eric Christopher                  DIEIntegerOne);
105873cf0a0d7906083578d9b793008348750636138Eric Christopher  else
106873cf0a0d7906083578d9b793008348750636138Eric Christopher    addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
107873cf0a0d7906083578d9b793008348750636138Eric Christopher}
108873cf0a0d7906083578d9b793008348750636138Eric Christopher
109161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addUInt - Add an unsigned integer attribute data and value.
110161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
111161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addUInt(DIE *Die, unsigned Attribute,
112161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, uint64_t Integer) {
113161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(false, Integer);
114161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = Integer == 1 ?
115161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
116161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
117161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
118161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
119161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSInt - Add an signed integer attribute data and value.
120161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
121161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSInt(DIE *Die, unsigned Attribute,
122161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, int64_t Integer) {
123161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(true, Integer);
124161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
125161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
126161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
127161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1286a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// addString - Add a string attribute data and value. We always emit a
1296a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// reference to the string pool instead of immediate strings so that DIEs have
1303cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// more predictable sizes. In the case of split dwarf we emit an index
1313cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// into another table which gets us the static offset into the string
1323cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// table.
133390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewyckyvoid CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
134dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher  if (!DD->useSplitDwarf()) {
135dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    MCSymbol *Symb = DU->getStringPoolEntry(String);
136dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    DIEValue *Value;
137dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    if (Asm->needsRelocationsForDwarfStringPool())
138dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher      Value = new (DIEValueAllocator) DIELabel(Symb);
139dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    else {
140dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher      MCSymbol *StringPool = DU->getStringPoolSym();
141dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher      Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
142dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    }
143dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
144dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher  } else {
145dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    unsigned idx = DU->getStringPoolIndex(String);
146dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
147dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    Die->addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Value);
148dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher  }
149dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher}
150dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher
151dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher/// addLocalString - Add a string attribute data and value. This is guaranteed
152dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher/// to be in the local string pool instead of indirected.
153dd8e9f395e881972b320d947de88102a0be04b70Eric Christophervoid CompileUnit::addLocalString(DIE *Die, unsigned Attribute,
154dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher                                 StringRef String) {
1552e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher  MCSymbol *Symb = DU->getStringPoolEntry(String);
1566a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  DIEValue *Value;
1576a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  if (Asm->needsRelocationsForDwarfStringPool())
1586a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    Value = new (DIEValueAllocator) DIELabel(Symb);
1596a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  else {
1602e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher    MCSymbol *StringPool = DU->getStringPoolSym();
1616a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
162390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  }
1636a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
164161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
165161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
166161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addLabel - Add a Dwarf label attribute data and value.
167161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
168161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
169161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           const MCSymbol *Label) {
170161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
171161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
172161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
173161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
17472f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher/// addLabelAddress - Add a dwarf label attribute data and value using
17572f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher/// DW_FORM_addr or DW_FORM_GNU_addr_index.
17672f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher///
17772f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christophervoid CompileUnit::addLabelAddress(DIE *Die, unsigned Attribute,
17872f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher                                  MCSymbol *Label) {
17972f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher  if (!DD->useSplitDwarf()) {
18072f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    if (Label != NULL) {
18172f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher      DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
18272f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher      Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
18372f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    } else {
18472f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher      DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
18572f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher      Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
18672f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    }
18772f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher  } else {
18872f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    unsigned idx = DU->getAddrPoolIndex(Label);
18972f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
19072f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
19172f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher  }
19272f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher}
19372f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher
1940969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher/// addOpAddress - Add a dwarf op address data and value using the
1950969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
1960969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher///
1970969ddf601c7cf9da2b01fe227005951c6af0cacEric Christophervoid CompileUnit::addOpAddress(DIE *Die, MCSymbol *Sym) {
1980969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher
1990969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher  if (!DD->useSplitDwarf()) {
2000969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2010969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
2020969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher  } else {
2030969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    unsigned idx = DU->getAddrPoolIndex(Sym);
2040969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
2050969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
2060969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    Die->addValue(0, dwarf::DW_FORM_GNU_addr_index, Value);
2070969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher  }
2080969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher}
2090969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher
210161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDelta - Add a label delta attribute data and value.
211161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
212161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
213161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           const MCSymbol *Hi, const MCSymbol *Lo) {
214161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
215161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
216161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
217161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
218161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDIEEntry - Add a DIE attribute data and value.
219161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
220161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
221161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                              DIE *Entry) {
222161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, createDIEEntry(Entry));
223161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
224161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
225161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlock - Add block data.
226161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
227161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
228161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           DIEBlock *Block) {
229161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Block->ComputeSize(Asm);
230161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
231161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Block->BestForm(), Block);
232161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
233161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
234161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
235161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
236161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
237161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify variable.
238161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!V.Verify())
239161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2408b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
241161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = V.getLineNumber();
242161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
243161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2447ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
2453de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            V.getContext().getDirectory(),
2463de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            getUniqueID());
247161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
248161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
249161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
250161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
251161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
252161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
253161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
254161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
255161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify global variable.
256161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!G.Verify())
257161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
258161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
259161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = G.getLineNumber();
260161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
261161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2623de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren  unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
2633de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            getUniqueID());
264161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
265161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
266161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
267161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
268161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
269161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
270161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
271161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
272161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify subprogram.
273161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!SP.Verify())
274161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
275161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
2762125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  // If the line number is 0, don't add it.
277161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = SP.getLineNumber();
2782125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
279161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2802125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher
2817ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
2823de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            SP.getDirectory(), getUniqueID());
283161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
284161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
285161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
286161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
287161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
288161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
289161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
290161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
291161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify type.
292161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Ty.Verify())
293161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
294161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
295161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = Ty.getLineNumber();
2962125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
297161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2987ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
2993de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            Ty.getDirectory(), getUniqueID());
300161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
301161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
302161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
303161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
304161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
305161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
306161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
307b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christophervoid CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
308b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  // Verify type.
309b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  if (!Ty.Verify())
310b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher    return;
311b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
312b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  unsigned Line = Ty.getLineNumber();
313b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  if (Line == 0)
314b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher    return;
315b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  DIFile File = Ty.getFile();
3167ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
3173de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            File.getDirectory(), getUniqueID());
318b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  assert(FileID && "Invalid file id");
319b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
320b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
321b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher}
322b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
323b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// addSourceLine - Add location information to specified debug information
324b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// entry.
325161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
326161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify namespace.
327161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!NS.Verify())
328161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
329161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
330161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = NS.getLineNumber();
331161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
332161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
333161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef FN = NS.getFilename();
334161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
3353de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren  unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
3363de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            getUniqueID());
337161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
338161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
339161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
340161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
341161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
3428b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher/// addVariableAddress - Add DW_AT_location attribute for a
343e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel/// DbgVariable based on provided MachineLocation.
344f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christophervoid CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
345e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel                                     MachineLocation Location) {
346f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  if (DV.variableHasComplexAddress())
347161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
348f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  else if (DV.isBlockByrefVariable())
349161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
350161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
3514532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie    addAddress(Die, dwarf::DW_AT_location, Location,
352f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher               DV.getVariable().isIndirect());
353161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
354161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
355116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOp - Add register operand.
356116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
357116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
358116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
359116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (DWReg < 32)
360116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
361116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
362116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
363116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
364116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
365116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
366116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
367116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOffset - Add register offset.
368116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
369116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel                                    int64_t Offset) {
370116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
371116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
372116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
373116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (Reg == TRI->getFrameRegister(*Asm->MF))
374116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    // If variable offset is based in frame register then use fbreg.
375116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
376116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else if (DWReg < 32)
377116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
378116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
379116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
380116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
381116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
382116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
383116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
384116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
385116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addAddress - Add an address attribute to a die based on the location
386116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// provided.
387116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addAddress(DIE *Die, unsigned Attribute,
3884532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie                             const MachineLocation &Location, bool Indirect) {
389116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
390116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
3914532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie  if (Location.isReg() && !Indirect)
392116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOp(Block, Location.getReg());
3934532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie  else {
394116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
3954532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie    if (Indirect && !Location.isReg()) {
3964532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
3974532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie    }
3984532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie  }
399116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
400116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  // Now attach the location information to the DIE.
401116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addBlock(Die, Attribute, 0, Block);
402116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
403116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
404161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addComplexAddress - Start with the address based on the location provided,
405161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// and generate the DWARF information necessary to find the actual variable
406161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given the extra address information encoded in the DIVariable, starting from
407161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// the starting location.  Add the DWARF information to the die.
408161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
409f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christophervoid CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
410161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    unsigned Attribute,
411161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    const MachineLocation &Location) {
412161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
413f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  unsigned N = DV.getNumAddrElements();
414c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  unsigned i = 0;
415c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  if (Location.isReg()) {
416f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher    if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
417c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // If first address element is OpPlus then emit
418c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
419f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher      addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
420c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      i = 2;
421c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel    } else
422c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      addRegisterOp(Block, Location.getReg());
423c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  }
424116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else
425116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
426161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
427c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  for (;i < N; ++i) {
428f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher    uint64_t Element = DV.getAddrElement(i);
429161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element == DIBuilder::OpPlus) {
430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
431f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher      addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
432161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else if (Element == DIBuilder::OpDeref) {
433501207676c78fefcfc9eeeaa1e3dbe9ea857d33fEric Christopher      if (!Location.isReg())
434501207676c78fefcfc9eeeaa1e3dbe9ea857d33fEric Christopher        addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
435161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else llvm_unreachable("unknown DIBuilder Opcode");
436161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
438161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
440161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/* Byref variables, in Blocks, are declared by the programmer as "SomeType
443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   gives the variable VarName either the struct, or a pointer to the struct, as
445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   its type.  This is necessary for various behind-the-scenes things the
446161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   compiler needs to do with by-reference variables in Blocks.
447161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However, as far as the original *programmer* is concerned, the variable
449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   should still have type 'SomeType', as originally declared.
450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The function getBlockByrefType dives into the __Block_byref_x_VarName
452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to find the original type of the variable, which is then assigned to
453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the variable's Debug Information Entry as its real type.  So far, so good.
454161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However now the debugger will expect the variable VarName to have the type
455161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   SomeType.  So we need the location attribute for the variable to be an
456161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   expression that explains to the debugger how to navigate through the
457161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   pointers and struct to find the actual variable of type SomeType.
458161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The following function does just that.  We start by getting
460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the "normal" location for the variable. This will be the location
461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   of either the struct __Block_byref_x_VarName or the pointer to the
462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName.
463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The struct will look something like:
465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName {
467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various fields>
468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     struct __Block_byref_x_VarName *forwarding;
469161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various other fields>
470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     SomeType VarName;
471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <maybe more fields>
472161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   };
473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we are given the struct directly (as our starting point) we
475161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   need to tell the debugger to:
476161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
477161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   1).  Add the offset of the forwarding field.
478161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
479161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   2).  Follow that pointer to get the real __Block_byref_x_VarName
480161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to use (the real one may have been copied onto the heap).
481161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
482161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   3).  Add the offset for the field VarName, to find the actual variable.
483161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
484161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we started with a pointer to the struct, then we need to
485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   dereference that pointer first, before the other steps.
486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   Translating this into DWARF ops, we will need to append the following
487161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   to the current location description for the variable:
488161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref                    -- optional, if we start with a pointer
490161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <forward_fld_offset>
491161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref
492161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <varName_fld_offset>
493161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
494161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   That is what this function does.  */
495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
496161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlockByrefAddress - Start with the address based on the location
497161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// provided, and generate the DWARF information necessary to find the
498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// actual Block variable (navigating the Block struct) based on the
499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// starting location.  Add the DWARF information to the die.  For
500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// more information, read large comment just above here.
501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
502f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christophervoid CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
503161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       unsigned Attribute,
504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       const MachineLocation &Location) {
505f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  DIType Ty = DV.getType();
506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType TmpTy = Ty;
507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = Ty.getTag();
508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool isPointer = false;
509161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
510f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  StringRef varName = DV.getName();
511161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
512161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_pointer_type) {
513161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DTy = DIDerivedType(Ty);
514161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    TmpTy = DTy.getTypeDerivedFrom();
515161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    isPointer = true;
516161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
517161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
518161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DICompositeType blockStruct = DICompositeType(TmpTy);
519161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
520161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Find the __forwarding field and the variable field in the __Block_byref
521161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct.
522161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Fields = blockStruct.getTypeArray();
523161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor varField = DIDescriptor();
524161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor forwardingField = DIDescriptor();
525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
526161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
527161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Fields.getElement(i);
528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DT = DIDerivedType(Element);
529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    StringRef fieldName = DT.getName();
530161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (fieldName == "__forwarding")
531161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      forwardingField = Element;
532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (fieldName == varName)
533161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      varField = Element;
534161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
535161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
536161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the offsets for the forwarding field and the variable field.
537161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned forwardingFieldOffset =
538161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(forwardingField).getOffsetInBits() >> 3;
539161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned varFieldOffset =
540161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(varField).getOffsetInBits() >> 3;
541161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
542161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Decode the original location, and use that as the start of the byref
543161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // variable's location.
544161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
545161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
546caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  if (Location.isReg())
547caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher    addRegisterOp(Block, Location.getReg());
548caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  else
549caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
550161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
551161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If we started with a pointer to the __Block_byref... struct, then
552161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // the first thing we need to do is dereference the pointer (DW_OP_deref).
553161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (isPointer)
554161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
555161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
556161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Next add the offset for the '__forwarding' field:
557161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
558161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // adding the offset if it's 0.
559161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (forwardingFieldOffset > 0) {
560161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
561161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
562161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
563161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
564161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now dereference the __forwarding field to get to the real __Block_byref
565161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct:  DW_OP_deref.
566161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
567161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
568161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now that we've got the real __Block_byref... struct, add the offset
569161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // for the variable's field to get to the location of the actual variable:
570161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
571161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (varFieldOffset > 0) {
572161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
573161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
574161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
575161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
576161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
577161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
578161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
579161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
5804ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel/// isTypeSigned - Return true if the type is signed.
5814ec14b0dee433a4f134d832e326a20839b1f777eDevang Patelstatic bool isTypeSigned(DIType Ty, int *SizeInBits) {
5824ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isDerivedType())
5834ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
5844ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isBasicType())
5854ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
5864ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel        || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
5874ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      *SizeInBits = Ty.getSizeInBits();
5884ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      return true;
5894ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    }
5904ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  return false;
5914ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel}
5924ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel
593161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
594b58128e2b2375173aafb07905bd53014d622e4baDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
595b58128e2b2375173aafb07905bd53014d622e4baDevang Patel                                   DIType Ty) {
5964de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  // FIXME: This is a bit conservative/simple - it emits negative values at
5974de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  // their maximum bit width which is a bit unfortunate (& doesn't prefer
5984de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  // udata/sdata over dataN as suggested by the DWARF spec)
599746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  assert(MO.isImm() && "Invalid machine operand!");
600161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
6014ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  int SizeInBits = -1;
6024ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
6034ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
6044ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  switch (SizeInBits) {
6054ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 8:  Form = dwarf::DW_FORM_data1; break;
6064ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 16: Form = dwarf::DW_FORM_data2; break;
6074ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 32: Form = dwarf::DW_FORM_data4; break;
6084ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 64: Form = dwarf::DW_FORM_data8; break;
609045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel    default: break;
610045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel  }
6118b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
6124ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    : addUInt(Block, 0, Form, MO.getImm());
61372f0d9cdefa3086715e1e2547a9843321690b4d9Devang Patel
614161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
615161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
616161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
617161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
618161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantFPValue - Add constant value entry in variable DIE.
619161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelbool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
620390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  assert (MO.isFPImm() && "Invalid machine operand!");
621161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
622161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  APFloat FPImm = MO.getFPImm()->getValueAPF();
623161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
624161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the floating point.
625161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const APInt FltVal = FPImm.bitcastToAPInt();
626161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const char *FltPtr = (const char*)FltVal.getRawData();
627161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
628161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
6293574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  bool LittleEndian = Asm->getDataLayout().isLittleEndian();
630161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Incr = (LittleEndian ? 1 : -1);
631161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Start = (LittleEndian ? 0 : NumBytes - 1);
632161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Stop = (LittleEndian ? NumBytes : -1);
633161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
634161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
635161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (; Start != Stop; Start += Incr)
636161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1,
637161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            (unsigned char)0xFF & FltPtr[Start]);
638161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
639161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
640161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
641161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
642161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
64314268416720155d63f190a6143ee40b3b850e409David Blaikie/// addConstantFPValue - Add constant value entry in variable DIE.
64414268416720155d63f190a6143ee40b3b850e409David Blaikiebool CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
64514268416720155d63f190a6143ee40b3b850e409David Blaikie  return addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), false);
64614268416720155d63f190a6143ee40b3b850e409David Blaikie}
64714268416720155d63f190a6143ee40b3b850e409David Blaikie
648161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
6498594d429e02c688d428036f8563f09572da3fbffDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
650161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                   bool Unsigned) {
65114268416720155d63f190a6143ee40b3b850e409David Blaikie  return addConstantValue(Die, CI->getValue(), Unsigned);
65214268416720155d63f190a6143ee40b3b850e409David Blaikie}
65314268416720155d63f190a6143ee40b3b850e409David Blaikie
65414268416720155d63f190a6143ee40b3b850e409David Blaikie// addConstantValue - Add constant value entry in variable DIE.
65514268416720155d63f190a6143ee40b3b850e409David Blaikiebool CompileUnit::addConstantValue(DIE *Die, const APInt &Val,
65614268416720155d63f190a6143ee40b3b850e409David Blaikie                                   bool Unsigned) {
65714268416720155d63f190a6143ee40b3b850e409David Blaikie  unsigned CIBitWidth = Val.getBitWidth();
658d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel  if (CIBitWidth <= 64) {
659d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    unsigned form = 0;
660d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    switch (CIBitWidth) {
661d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 8: form = dwarf::DW_FORM_data1; break;
662d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 16: form = dwarf::DW_FORM_data2; break;
663d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 32: form = dwarf::DW_FORM_data4; break;
664d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 64: form = dwarf::DW_FORM_data8; break;
6658b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher    default:
666d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
667d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    }
668161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Unsigned)
66914268416720155d63f190a6143ee40b3b850e409David Blaikie      addUInt(Die, dwarf::DW_AT_const_value, form, Val.getZExtValue());
670161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else
67114268416720155d63f190a6143ee40b3b850e409David Blaikie      addSInt(Die, dwarf::DW_AT_const_value, form, Val.getSExtValue());
672161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return true;
673161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
674161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
675161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
676161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
677161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the large APInt.
678c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  const uint64_t *Ptr64 = Val.getRawData();
679161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
680161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
6813574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  bool LittleEndian = Asm->getDataLayout().isLittleEndian();
682161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
683161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
684c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  for (int i = 0; i < NumBytes; i++) {
685c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    uint8_t c;
686c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    if (LittleEndian)
687c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[i / 8] >> (8 * (i & 7));
688c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    else
689c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
690c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    addUInt(Block, 0, dwarf::DW_FORM_data1, c);
691c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  }
692161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
693161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
694161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
695161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
696161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
6976c3bb94445305f8ee0be6d3c9457a411bf22b3ebEric Christopher/// addTemplateParams - Add template parameters into buffer.
698161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
699161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add template parameters.
700161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
701161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = TParams.getElement(i);
702161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.isTemplateTypeParameter())
703161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
704161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateTypeParameter(Element)));
705161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (Element.isTemplateValueParameter())
706161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateValueParameterDIE(
707161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateValueParameter(Element)));
708161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
709161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
710746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky
7116b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// getOrCreateContextDIE - Get context owner's DIE.
7126b6061f01171bd3d4e32022efa45428d4f9941eeEric ChristopherDIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
7136b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (Context.isType())
7146b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return getOrCreateTypeDIE(DIType(Context));
7156b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  else if (Context.isNameSpace())
7166b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return getOrCreateNameSpace(DINameSpace(Context));
7176b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  else if (Context.isSubprogram())
7186b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return getOrCreateSubprogramDIE(DISubprogram(Context));
7196c3bb94445305f8ee0be6d3c9457a411bf22b3ebEric Christopher  else
7206b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return getDIE(Context);
7216b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher}
7226b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
723161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addToContextOwner - Add Die into the list of its context owner's children.
724161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
7256b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (DIE *ContextDIE = getOrCreateContextDIE(Context))
726161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
727161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
728161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(Die);
729161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
730161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
731161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
732161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given DIType.
73394c7ddb6f52a5200983fed0ce74dc602a7737879Devang PatelDIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
73494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  DIType Ty(TyNode);
73594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  if (!Ty.Verify())
73694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel    return NULL;
737161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *TyDIE = getDIE(Ty);
738161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (TyDIE)
739161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return TyDIE;
740161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
741161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Create new type.
742161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  TyDIE = new DIE(dwarf::DW_TAG_base_type);
743161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIE(Ty, TyDIE);
744161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Ty.isBasicType())
745161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIBasicType(Ty));
746161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (Ty.isCompositeType())
747161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DICompositeType(Ty));
748161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else {
749161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    assert(Ty.isDerivedType() && "Unknown kind of DIType");
750161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIDerivedType(Ty));
751161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
7521b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // If this is a named finished type then include it in the list of types
7531b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // for the accelerator tables.
754c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
755c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    bool IsImplementation = 0;
756c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    if (Ty.isCompositeType()) {
757c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      DICompositeType CT(Ty);
758e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // A runtime language of 0 actually means C/C++ and that any
759e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // non-negative value is some version of Objective-C/C++.
760c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      IsImplementation = (CT.getRunTimeLang() == 0) ||
761e2dc9336d15ad3ca4f38d296d17f6682829b80b4Eric Christopher        CT.isObjcClassComplete();
762c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    }
763e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    unsigned Flags = IsImplementation ?
764e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher                     DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
765e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
766c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  }
7678b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
768161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addToContextOwner(TyDIE, Ty.getContext());
769161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return TyDIE;
770161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
771161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
772161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addType - Add a new type attribute to the specified entity.
7734d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christophervoid CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) {
774161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Ty.Verify())
775161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
776161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
777161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Check for pre-existence.
778161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Entry = getDIEEntry(Ty);
779161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If it exists then use the existing value.
780161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Entry) {
781663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher    Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
782161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
783161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
784161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
785161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Construct type.
786161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Buffer = getOrCreateTypeDIE(Ty);
787161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
788161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Set up proxy.
789161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Entry = createDIEEntry(Buffer);
790161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIEEntry(Ty, Entry);
791663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher  Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
792e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel
793e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // If this is a complete composite type then include it in the
794e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // list of global types.
795c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel  addGlobalType(Ty);
79666658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel}
79766658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel
79866658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel/// addGlobalType - Add a new global type to the compile unit.
79966658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel///
800c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patelvoid CompileUnit::addGlobalType(DIType Ty) {
801e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  DIDescriptor Context = Ty.getContext();
8028b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
8038b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      && (!Context || Context.isCompileUnit() || Context.isFile()
80494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel          || Context.isNameSpace()))
805c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    if (DIEEntry *Entry = getDIEEntry(Ty))
806c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel      GlobalTypes[Ty.getName()] = Entry->getEntry();
807161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
808161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
80931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// addPubTypes - Add type for pubtypes section.
81031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patelvoid CompileUnit::addPubTypes(DISubprogram SP) {
81131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DICompositeType SPTy = SP.getType();
81231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  unsigned SPTag = SPTy.getTag();
81331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (SPTag != dwarf::DW_TAG_subroutine_type)
81431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return;
81531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
81631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIArray Args = SPTy.getTypeArray();
81731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
81831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    DIType ATy(Args.getElement(i));
81931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    if (!ATy.Verify())
82031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel      continue;
821c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    addGlobalType(ATy);
82231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  }
82331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
82431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
825161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct basic type die from DIBasicType.
826161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
827161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
828161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = BTy.getName();
829161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
830161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
831390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
832734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
833734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
834734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    Buffer.setTag(dwarf::DW_TAG_unspecified_type);
835734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    // Unspecified types has only name, nothing else.
836734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    return;
837734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  }
838734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
839734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  Buffer.setTag(dwarf::DW_TAG_base_type);
840746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
84130d409ca097e35c51964c9dac642804e5e495906Devang Patel          BTy.getEncoding());
842734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
843161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = BTy.getSizeInBits() >> 3;
844161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
845161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
846161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
847161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct derived type die from DIDerivedType.
848161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
849161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
850161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DTy.getName();
851161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DTy.getSizeInBits() >> 3;
852161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = DTy.getTag();
853161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
854161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // FIXME - Workaround for templates.
855161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
856161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
857161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
858161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
859161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Map to main type, void will not have a type.
860161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType FromTy = DTy.getTypeDerivedFrom();
861161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, FromTy);
862161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
863161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
864161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
865390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
866161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
867161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add size if non-zero (derived types might be zero-sized.)
86835f225aa2c04ca2420161cca812cb3eb611bde51Eric Christopher  if (Size && Tag != dwarf::DW_TAG_pointer_type)
869161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
870161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
87162fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie  if (Tag == dwarf::DW_TAG_ptr_to_member_type)
87262fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
87362fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie                  getOrCreateTypeDIE(DTy.getClassType()));
874161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add source line info if available and TyDesc is not a forward declaration.
875161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!DTy.isForwardDecl())
876161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addSourceLine(&Buffer, DTy);
877161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
878161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
879161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct type DIE from DICompositeType.
880161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
881161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
882161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = CTy.getName();
883161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
884161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = CTy.getSizeInBits() >> 3;
885161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = CTy.getTag();
886161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
887161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
888161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  switch (Tag) {
889161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_array_type:
890161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructArrayTypeDIE(Buffer, &CTy);
891161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
892161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_enumeration_type: {
893161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
894161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
895161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add enumerators to enumeration type.
896161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
897161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
898161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Enum(Elements.getElement(i));
899161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Enum.isEnumerator()) {
900161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
901161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(ElemDie);
902161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
903161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
904bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    DIType DTy = CTy.getTypeDerivedFrom();
905bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    if (DTy.Verify()) {
906bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher      addType(&Buffer, DTy);
907bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher      addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
908bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    }
909161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
910161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
911161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_subroutine_type: {
912161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add return type.
913161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
914161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor RTy = Elements.getElement(0);
915161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addType(&Buffer, DIType(RTy));
916161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
917161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    bool isPrototyped = true;
918161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add arguments.
919161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
920161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Ty = Elements.getElement(i);
921161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Ty.isUnspecifiedParameter()) {
922161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
923161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
924161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        isPrototyped = false;
925161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      } else {
926161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
927161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addType(Arg, DIType(Ty));
928aaf2e639ecf2e5a1647e6d59ef53dc76da0a6102David Blaikie        if (DIType(Ty).isArtificial())
929aaf2e639ecf2e5a1647e6d59ef53dc76da0a6102David Blaikie          addFlag(Arg, dwarf::DW_AT_artificial);
930161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
931161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
932161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
9338b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // Add prototype flag if we're dealing with a C language and the
9348b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // function has been prototyped.
9358b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    if (isPrototyped &&
9364d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        (Language == dwarf::DW_LANG_C89 ||
9374d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher         Language == dwarf::DW_LANG_C99 ||
9384d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher         Language == dwarf::DW_LANG_ObjC))
939873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_prototyped);
940161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
941161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
942161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_structure_type:
943161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_union_type:
944161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_class_type: {
945161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
946161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
947161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
948161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // A forward struct declared type may not have elements available.
949161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    unsigned N = Elements.getNumElements();
950161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (N == 0)
951161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      break;
952161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
953161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
954161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 0; i < N; ++i) {
955161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Element = Elements.getElement(i);
956161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
957161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Element.isSubprogram()) {
958161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DISubprogram SP(Element);
959dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
960161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isProtected())
96113aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
962161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_protected);
963161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        else if (SP.isPrivate())
96413aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
965161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_private);
9668b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher        else
96713aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
968161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
969161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isExplicit())
970873cf0a0d7906083578d9b793008348750636138Eric Christopher          addFlag(ElemDie, dwarf::DW_AT_explicit);
971663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isDerivedType()) {
9724d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        DIDerivedType DDTy(Element);
9734d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        if (DDTy.getTag() == dwarf::DW_TAG_friend) {
9744d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          ElemDie = new DIE(dwarf::DW_TAG_friend);
9754d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
9766b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher        } else if (DDTy.isStaticMember())
9776b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher          ElemDie = createStaticMemberDIE(DDTy);
9786b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher        else
9796b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher          ElemDie = createMemberDIE(DDTy);
980663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isObjCProperty()) {
98130d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIObjCProperty Property(Element);
98230d409ca097e35c51964c9dac642804e5e495906Devang Patel        ElemDie = new DIE(Property.getTag());
98330d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef PropertyName = Property.getObjCPropertyName();
98430d409ca097e35c51964c9dac642804e5e495906Devang Patel        addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
9854d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        addType(ElemDie, Property.getType());
9864d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        addSourceLine(ElemDie, Property);
98730d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef GetterName = Property.getObjCPropertyGetterName();
98830d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!GetterName.empty())
98930d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
99030d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef SetterName = Property.getObjCPropertySetterName();
99130d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!SetterName.empty())
99230d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
99330d409ca097e35c51964c9dac642804e5e495906Devang Patel        unsigned PropertyAttributes = 0;
9949e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadOnlyObjCProperty())
9959e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
9969e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadWriteObjCProperty())
9979e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
9989e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isAssignObjCProperty())
9999e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
10009e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isRetainObjCProperty())
10019e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
10029e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isCopyObjCProperty())
10039e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
10049e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isNonAtomicObjCProperty())
10059e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
10069e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (PropertyAttributes)
10078b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher          addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
10089e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel                 PropertyAttributes);
10096588abf377b7381274236e651462ec83052f6013Devang Patel
101030d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIEEntry *Entry = getDIEEntry(Element);
101130d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!Entry) {
101230d409ca097e35c51964c9dac642804e5e495906Devang Patel          Entry = createDIEEntry(ElemDie);
101330d409ca097e35c51964c9dac642804e5e495906Devang Patel          insertDIEEntry(Element, Entry);
101430d409ca097e35c51964c9dac642804e5e495906Devang Patel        }
10159e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel      } else
1016161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        continue;
1017161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(ElemDie);
1018161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
1019161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1020161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (CTy.isAppleBlockExtension())
1021873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
1022161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1023161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DICompositeType ContainingType = CTy.getContainingType();
1024161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (DIDescriptor(ContainingType).isCompositeType())
1025161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1026161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  getOrCreateTypeDIE(DIType(ContainingType)));
1027161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else {
1028161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Context = CTy.getContext();
1029161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addToContextOwner(&Buffer, Context);
1030161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
1031161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1032201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel    if (CTy.isObjcClassComplete())
1033873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
1034b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel
10351a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // Add template parameters to a class, structure or union types.
10361a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // FIXME: The support isn't in the metadata for this yet.
10371a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    if (Tag == dwarf::DW_TAG_class_type ||
10381a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_structure_type ||
10391a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_union_type)
1040161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addTemplateParams(Buffer, CTy.getTemplateParams());
1041161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1042161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
1043161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1044161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  default:
1045161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
1046161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1047161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1048161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
1049161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
1050390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
1051161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
10524a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher  if (Tag == dwarf::DW_TAG_enumeration_type ||
10534a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_class_type ||
10544a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_structure_type ||
10554a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_union_type) {
1056161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add size if non-zero (derived types might be zero-sized.)
1057fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // TODO: Do we care about size for enum forward declarations?
1058161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Size)
1059161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1060fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    else if (!CTy.isForwardDecl())
1061161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      // Add zero size if it is not a forward declaration.
1062fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1063fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher
1064fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // If we're a forward decl, say so.
1065fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    if (CTy.isForwardDecl())
1066873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_declaration);
1067161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1068161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add source line info if available.
1069161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (!CTy.isForwardDecl())
1070161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addSourceLine(&Buffer, CTy);
10718938895a8338e6084eb12a2bb4bf044928436173Eric Christopher
10728938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    // No harm in adding the runtime language to the declaration.
10738938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    unsigned RLang = CTy.getRunTimeLang();
10748938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    if (RLang)
10758938895a8338e6084eb12a2bb4bf044928436173Eric Christopher      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
10768938895a8338e6084eb12a2bb4bf044928436173Eric Christopher              dwarf::DW_FORM_data1, RLang);
1077161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1078161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1079161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
10808b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1081161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateTypeParameter.
1082161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
1083161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1084161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TP);
1085161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
1086161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
1087161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1088161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1089161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TP.getType());
1090e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie  if (!TP.getName().empty())
1091e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie    addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
1092161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
1093161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1094161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
10958b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1096161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateValueParameter.
1097161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
10984d069bf8ec726570d668e59fda993a33dfb7cb0bEric ChristopherCompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){
1099161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TPV);
1100161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
1101161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
1102161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1103e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie  ParamDIE = new DIE(TPV.getTag());
1104161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TPV.getType());
1105161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!TPV.getName().empty())
1106390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
11074de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  if (Value *Val = TPV.getValue()) {
11084de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie    if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
11094de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      addConstantValue(ParamDIE, CI, TPV.getType().isUnsignedDIType());
11104de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie    else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
11114de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // For declaration non-type template parameters (such as global values and
11124de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // functions)
11134de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
11144de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      addOpAddress(Block, Asm->Mang->getSymbol(GV));
11154de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // Emit DW_OP_stack_value to use the address as the immediate value of the
11164de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // parameter, rather than a pointer to it.
11174de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
11184de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
1119e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie    } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1120e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      assert(isa<MDString>(Val));
1121e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1122e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie                cast<MDString>(Val)->getString());
1123e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie    } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1124e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      assert(isa<MDNode>(Val));
1125e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      DIArray A(cast<MDNode>(Val));
1126e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      addTemplateParams(*ParamDIE, A);
11274de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie    }
11284de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  }
11294de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie
1130161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
1131161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1132161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
113331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// getOrCreateNameSpace - Create a DIE for DINameSpace.
113431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang PatelDIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
113531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIE *NDie = getDIE(NS);
113631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (NDie)
113731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return NDie;
113831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  NDie = new DIE(dwarf::DW_TAG_namespace);
113931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  insertDIE(NS, NDie);
114009ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  if (!NS.getName().empty()) {
1141390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(NDie, dwarf::DW_AT_name, NS.getName());
114209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace(NS.getName(), NDie);
114309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  } else
114409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace("(anonymous namespace)", NDie);
114531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addSourceLine(NDie, NS);
114631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addToContextOwner(NDie, NS.getContext());
114731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  return NDie;
114831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
114931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
1150dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getOrCreateSubprogramDIE - Create new DIE using SP.
1151dbc64af76d769596903485668a1dfc2d6640c4fbDevang PatelDIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1152dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DIE *SPDie = getDIE(SP);
1153dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SPDie)
1154dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
1155dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
115627302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  SPDie = new DIE(dwarf::DW_TAG_subprogram);
115727302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne
115827302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  // DW_TAG_inlined_subroutine may refer to this DIE.
115927302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  insertDIE(SP, SPDie);
116027302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne
116101b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DISubprogram SPDecl = SP.getFunctionDeclaration();
116201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DIE *DeclDie = NULL;
116301b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (SPDecl.isSubprogram()) {
116401b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    DeclDie = getOrCreateSubprogramDIE(SPDecl);
116501b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
116601b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1167dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add to context owner.
1168dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addToContextOwner(SPDie, SP.getContext());
1169dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1170dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add function template parameters.
1171dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addTemplateParams(*SPDie, SP.getTemplateParams());
1172dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1173c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // Unfortunately this code needs to stay here instead of below the
1174c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // AT_specification code in order to work around a bug in older
1175c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // gdbs that requires the linkage name to resolve multiple template
1176c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // functions.
1177c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // TODO: Remove this set of code when we get rid of the old gdb
1178c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // compatibility.
11798d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher  StringRef LinkageName = SP.getLinkageName();
1180c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  if (!LinkageName.empty() && DD->useDarwinGDBCompat())
1181c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
11827c2b4be2a718b994298803dd09e81e49a016ffb2Benjamin Kramer              GlobalValue::getRealLinkageName(LinkageName));
11838d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher
1184dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // If this DIE is going to refer declaration info using AT_specification
1185c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // then there is no need to add other attributes.
118601b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (DeclDie) {
118701b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    // Refer function declaration directly.
118801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
118901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola                DeclDie);
119001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1191dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
119201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
1193dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1194cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  // Add the linkage name if we have one.
1195c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
1196cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
11977c2b4be2a718b994298803dd09e81e49a016ffb2Benjamin Kramer              GlobalValue::getRealLinkageName(LinkageName));
1198cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher
1199dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Constructors and operators for anonymous aggregates do not have names.
1200dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.getName().empty())
1201390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(SPDie, dwarf::DW_AT_name, SP.getName());
1202dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1203dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addSourceLine(SPDie, SP);
1204dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
12058b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // Add the prototype if we have a prototype and we have a C like
12068b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // language.
12078b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  if (SP.isPrototyped() &&
12088b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher      (Language == dwarf::DW_LANG_C89 ||
12098b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_C99 ||
12108b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_ObjC))
1211873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_prototyped);
1212dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1213dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add Return Type.
1214dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DICompositeType SPTy = SP.getType();
12153d33184d9da02fb699827249e0631106252f72faDavid Blaikie  assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
12163d33184d9da02fb699827249e0631106252f72faDavid Blaikie         "the type of a subprogram should be a subroutine");
1217dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
12183d33184d9da02fb699827249e0631106252f72faDavid Blaikie  DIArray Args = SPTy.getTypeArray();
12193d33184d9da02fb699827249e0631106252f72faDavid Blaikie  addType(SPDie, DIType(Args.getElement(0)));
1220dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1221dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  unsigned VK = SP.getVirtuality();
1222dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (VK) {
1223798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1224dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIEBlock *Block = getDIEBlock();
1225dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1226dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1227dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1228dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    ContainingTypeMap.insert(std::make_pair(SPDie,
1229dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel                                            SP.getContainingType()));
1230dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1231dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1232dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isDefinition()) {
1233873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_declaration);
12348b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
1235dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // Add arguments. Do not add arguments for subprogram definition. They will
1236dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // be handled while processing variables.
12373d33184d9da02fb699827249e0631106252f72faDavid Blaikie    for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
12383d33184d9da02fb699827249e0631106252f72faDavid Blaikie      DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
12393d33184d9da02fb699827249e0631106252f72faDavid Blaikie      DIType ATy = DIType(Args.getElement(i));
12403d33184d9da02fb699827249e0631106252f72faDavid Blaikie      addType(Arg, ATy);
12413d33184d9da02fb699827249e0631106252f72faDavid Blaikie      if (ATy.isArtificial())
12423d33184d9da02fb699827249e0631106252f72faDavid Blaikie        addFlag(Arg, dwarf::DW_AT_artificial);
12433d33184d9da02fb699827249e0631106252f72faDavid Blaikie      SPDie->addChild(Arg);
12443d33184d9da02fb699827249e0631106252f72faDavid Blaikie    }
1245dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1246dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1247dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isArtificial())
1248873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_artificial);
1249dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1250dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isLocalToUnit())
1251873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_external);
1252dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1253dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isOptimized())
1254873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1255dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1256dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (unsigned isa = Asm->getISAEncoding()) {
1257dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1258dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1259dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1260dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  return SPDie;
1261dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1262dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
12636f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// Return const expression if value is a GEP to access merged global
12646f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// constant. e.g.
12656f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
12666f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelstatic const ConstantExpr *getMergedGlobalExpr(const Value *V) {
12676f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
12686f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CE || CE->getNumOperands() != 3 ||
12696f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      CE->getOpcode() != Instruction::GetElementPtr)
12706f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
12716f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12726f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // First operand points to a global struct.
12736f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  Value *Ptr = CE->getOperand(0);
12746f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<GlobalValue>(Ptr) ||
12756f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
12766f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
12776f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12786f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Second operand is zero.
12796f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
12806f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CI || !CI->isZero())
12816f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
12826f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12836f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Third operand is offset.
12846f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<ConstantInt>(CE->getOperand(2)))
12856f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
12866f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12876f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  return CE;
12886f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
12896f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12906f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel/// createGlobalVariableDIE - create global variable DIE.
12916f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelvoid CompileUnit::createGlobalVariableDIE(const MDNode *N) {
12926f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Check for pre-existence.
129349e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  if (getDIE(N))
12946f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return;
12956f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
129649e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIGlobalVariable GV(N);
129728bea08e531452992ff1e25e8584883dfbd4c232Devang Patel  if (!GV.Verify())
129828bea08e531452992ff1e25e8584883dfbd4c232Devang Patel    return;
129928bea08e531452992ff1e25e8584883dfbd4c232Devang Patel
13006b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIDescriptor GVContext = GV.getContext();
130149e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIType GTy = GV.getType();
13026f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
13036b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // If this is a static data member definition, some attributes belong
13046b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // to the declaration DIE.
13056b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIE *VariableDIE = NULL;
1306945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren  bool IsStaticMember = false;
13076b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
13086b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (SDMDecl.Verify()) {
13096b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    assert(SDMDecl.isStaticMember() && "Expected static member decl");
13106b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // We need the declaration DIE that is in the static member's class.
13116b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // But that class might not exist in the DWARF yet.
13126b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Creating the class will create the static member decl DIE.
13136b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    getOrCreateContextDIE(SDMDecl.getContext());
13146b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    VariableDIE = getDIE(SDMDecl);
13156b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    assert(VariableDIE && "Static member decl has no context?");
1316945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren    IsStaticMember = true;
13176b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  }
13186b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
13196b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // If this is not a static data member definition, create the variable
13206b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // DIE and add the initial set of attributes to it.
13216b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (!VariableDIE) {
13226b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    VariableDIE = new DIE(GV.getTag());
13236b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add to map.
13246b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    insertDIE(N, VariableDIE);
13256b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
13266b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add name and type.
13276b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
13286b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addType(VariableDIE, GTy);
13296b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
13306b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add scoping info.
1331c5ef7eee3c412b0f334e395b0cf7c363200c2f79Krzysztof Parzyszek    if (!GV.isLocalToUnit()) {
13326b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher      addFlag(VariableDIE, dwarf::DW_AT_external);
1333c5ef7eee3c412b0f334e395b0cf7c363200c2f79Krzysztof Parzyszek      addGlobalName(GV.getName(), VariableDIE);
1334c5ef7eee3c412b0f334e395b0cf7c363200c2f79Krzysztof Parzyszek    }
13356b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
13366b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add line number info.
13376b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addSourceLine(VariableDIE, GV);
13386b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add to context owner.
13396b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addToContextOwner(VariableDIE, GVContext);
13406b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  }
1341dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher
13426f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add location.
134309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  bool addToAccelTable = false;
1344d61c34ba30888c49f4f223422f30b018a41594daEric Christopher  DIE *VariableSpecDIE = NULL;
13456b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  bool isGlobalVariable = GV.getGlobal() != NULL;
13466f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (isGlobalVariable) {
134709ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
13486f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
13490969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    addOpAddress(Block, Asm->Mang->getSymbol(GV.getGlobal()));
13506f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // Do not create specification DIE if context is either compile unit
13516f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // or a subprogram.
13521dd4e56d5565d59e9d40ad9e088a05e06f4b70f8Devang Patel    if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
13536f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel        !GVContext.isFile() && !isSubprogramContext(GVContext)) {
13546f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      // Create specification DIE.
1355d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
13566f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
13576f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                  dwarf::DW_FORM_ref4, VariableDIE);
13586f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
13596b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher      // A static member's declaration is already flagged as such.
13606b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher      if (!SDMDecl.Verify())
13616b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher        addFlag(VariableDIE, dwarf::DW_AT_declaration);
13626f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDie(VariableSpecDIE);
13636f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    } else {
13646f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
136509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    }
13666b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add linkage name.
13676b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    StringRef LinkageName = GV.getLinkageName();
1368a8ada25afdb74a1cc53c183348ad9a424501dc96Eric Christopher    if (!LinkageName.empty()) {
13698d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
13708d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
13718d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // TAG_variable.
137221a08a1189df7922de3a89432cf896ed681db5d5Manman Ren      addString(IsStaticMember && VariableSpecDIE ?
137321a08a1189df7922de3a89432cf896ed681db5d5Manman Ren                VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
13747c2b4be2a718b994298803dd09e81e49a016ffb2Benjamin Kramer                GlobalValue::getRealLinkageName(LinkageName));
13758d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // In compatibility mode with older gdbs we put the linkage name on both
13768d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // the TAG_variable DIE and on the TAG_member DIE.
137721a08a1189df7922de3a89432cf896ed681db5d5Manman Ren      if (IsStaticMember && VariableSpecDIE && DD->useDarwinGDBCompat())
137821a08a1189df7922de3a89432cf896ed681db5d5Manman Ren        addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
13797c2b4be2a718b994298803dd09e81e49a016ffb2Benjamin Kramer                  GlobalValue::getRealLinkageName(LinkageName));
138006df83c25a7b07b3a19a40bd680c0a205bcc0b9aManman Ren    }
13818b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  } else if (const ConstantInt *CI =
1382945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren             dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
13832e892e4e27ecb6b1af757796841db5ff18df99a9Adrian Prantl    // AT_const_value was added when the static member was created. To avoid
1384945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren    // emitting AT_const_value multiple times, we only add AT_const_value when
1385945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren    // it is not a static member.
1386945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren    if (!IsStaticMember)
1387945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren      addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1388945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren  } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
138909ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
13906f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // GV is a merged global.
13916f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
13926f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    Value *Ptr = CE->getOperand(0);
13930969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
13946f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
13956f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
13968b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher    addUInt(Block, 0, dwarf::DW_FORM_udata,
13973574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow                   Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
13986f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
13996f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
14006f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  }
14016f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1402d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  if (addToAccelTable) {
1403d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1404d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    addAccelName(GV.getName(), AddrDIE);
140509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher
1406d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // If the linkage name is different than the name, go ahead and output
1407d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // that as well into the name table.
1408d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1409d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      addAccelName(GV.getLinkageName(), AddrDIE);
1410d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  }
141174d8a87f40dd89ec263071c0af4d77104b166f4aEric Christopher
14126f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  return;
14136f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
14146f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1415161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
14164d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christophervoid CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
14174d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher                                       DIE *IndexTy) {
1418161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1419161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
14209493dae613847b01b79914502f337814fe3e00acBill Wendling
1421222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // The LowerBound value defines the lower bounds which is typically zero for
1422222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // C/C++. The Count value is the number of elements.  Values are 64 bit. If
1423222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // Count == -1 then the array is unbounded and we do not emit
1424222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1425222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // Count == 0, then the array has zero elements in which case we do not emit
1426222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // an upper bound.
1427222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  int64_t LowerBound = SR.getLo();
14286afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling  int64_t DefaultLowerBound = getDefaultLowerBound();
1429a7645a3c66668da5e2bc772a8e5ab03dc301610cBill Wendling  int64_t Count = SR.getCount();
1430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
14316afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling  if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
1432222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1433222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
1434222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  if (Count != -1 && Count != 0)
14359493dae613847b01b79914502f337814fe3e00acBill Wendling    // FIXME: An unbounded array should reference the expression that defines
14369493dae613847b01b79914502f337814fe3e00acBill Wendling    // the array.
1437222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
14389493dae613847b01b79914502f337814fe3e00acBill Wendling
1439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.addChild(DW_Subrange);
1440161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                        DICompositeType *CTy) {
1445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(dwarf::DW_TAG_array_type);
14469a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher  if (CTy->isVector())
1447873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
1448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Emit derived type.
1450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, CTy->getTypeDerivedFrom());
1451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Elements = CTy->getTypeArray();
1452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get an anonymous type for index type.
14548cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher  // FIXME: This type should be passed down from the front end
14558cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher  // as different languages may have different sizes for indexes.
1456161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *IdxTy = getIndexTyDie();
1457161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!IdxTy) {
1458161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Construct an anonymous type for index type.
1459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    IdxTy = new DIE(dwarf::DW_TAG_base_type);
14608cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher    addString(IdxTy, dwarf::DW_AT_name, "int");
1461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ATE_signed);
1464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(IdxTy);
1465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    setIndexTyDie(IdxTy);
1466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add subranges to array type.
1469161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Elements.getElement(i);
1471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1472161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1475161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1476161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1477161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1478161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1479161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = ETy.getName();
1480390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(Enumerator, dwarf::DW_AT_name, Name);
1481161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int64_t Value = ETy.getEnumValue();
1482161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1483161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Enumerator;
1484161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1486dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// constructContainingTypeDIEs - Construct DIEs for types that contain
1487dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// vtables.
1488dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelvoid CompileUnit::constructContainingTypeDIEs() {
1489dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1490dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1491dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *SPDie = CI->first;
1492dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    const MDNode *N = CI->second;
1493dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!N) continue;
1494dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *NDie = getDIE(N);
1495dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!NDie) continue;
1496dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1497dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1498dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1499dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1500d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1501f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric ChristopherDIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1502f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher                                       bool isScopeAbstract) {
1503d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  StringRef Name = DV->getName();
1504d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1505d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Translate tag to proper Dwarf tag.
1506d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Tag = DV->getTag();
1507d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1508d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Define variable debug information entry.
1509d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *VariableDie = new DIE(Tag);
1510d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DbgVariable *AbsVar = DV->getAbstractVariable();
1511d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1512742671bf8e422aadcf3b7697a8844b9eb6f566f2Manman Ren  if (AbsDIE)
1513d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1514742671bf8e422aadcf3b7697a8844b9eb6f566f2Manman Ren                            dwarf::DW_FORM_ref4, AbsDIE);
1515d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  else {
1516390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(VariableDie, dwarf::DW_AT_name, Name);
1517d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addSourceLine(VariableDie, DV->getVariable());
1518d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addType(VariableDie, DV->getType());
1519d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1520d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1521d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (DV->isArtificial())
1522873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(VariableDie, dwarf::DW_AT_artificial);
1523d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1524d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (isScopeAbstract) {
1525d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1526d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1527d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1528d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1529d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Add variable address.
1530d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1531d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Offset = DV->getDotDebugLocOffset();
1532d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (Offset != ~0U) {
1533d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addLabel(VariableDie, dwarf::DW_AT_location,
1534d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                         dwarf::DW_FORM_data4,
1535d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                         Asm->GetTempSymbol("debug_loc", Offset));
1536d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1537d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1538d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1539d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
15408cf5e74a9cc7482901125b810f1e482d24e9404dEric Christopher  // Check if variable is described by a DBG_VALUE instruction.
1541d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (const MachineInstr *DVInsn = DV->getMInsn()) {
1542d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    bool updated = false;
15436d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    assert(DVInsn->getNumOperands() == 3);
15446d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    if (DVInsn->getOperand(0).isReg()) {
15456d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie      const MachineOperand RegOp = DVInsn->getOperand(0);
15466d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie      if (int64_t Offset = DVInsn->getOperand(1).getImm()) {
15476d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie        MachineLocation Location(RegOp.getReg(), Offset);
1548f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher        addVariableAddress(*DV, VariableDie, Location);
15496d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie      } else if (RegOp.getReg())
1550f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher        addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
1551d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      updated = true;
15526d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    } else if (DVInsn->getOperand(0).isImm())
15536d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie      updated =
15546d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie          addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
15556d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    else if (DVInsn->getOperand(0).isFPImm())
15566d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie      updated = addConstantFPValue(VariableDie, DVInsn->getOperand(0));
15576d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    else if (DVInsn->getOperand(0).isCImm())
15586d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie      updated = addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
15596d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie                                 DV->getType().isUnsignedDIType());
1560d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (!updated) {
1561d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      // If variableDie is not updated then DBG_VALUE instruction does not
1562d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      // have valid variable info.
1563d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      delete VariableDie;
1564d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      return NULL;
1565d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1566d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1567d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1568d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  } else {
1569d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    // .. else use frame index.
1570d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    int FI = DV->getFrameIndex();
1571d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (FI != ~0) {
1572d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      unsigned FrameReg = 0;
1573d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
15748b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      int Offset =
1575d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1576d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      MachineLocation Location(FrameReg, Offset);
1577f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher      addVariableAddress(*DV, VariableDie, Location);
1578d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1579d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1580d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1581d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DV->setDIE(VariableDie);
1582d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  return VariableDie;
1583d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel}
1584d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1585161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createMemberDIE - Create new member DIE.
1586161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1587161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *MemberDie = new DIE(DT.getTag());
1588161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DT.getName();
1589161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
1590390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(MemberDie, dwarf::DW_AT_name, Name);
1591161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1592161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(MemberDie, DT.getTypeDerivedFrom());
1593161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1594161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSourceLine(MemberDie, DT);
1595161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1596161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1597161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1598161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1599161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DT.getSizeInBits();
1600161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t FieldSize = DT.getOriginalTypeSize();
1601161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1602161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Size != FieldSize) {
1603161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Handle bitfield.
1604161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1605161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1606161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1607161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t Offset = DT.getOffsetInBits();
1608161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1609161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1610161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t FieldOffset = (HiMark - FieldSize);
1611161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    Offset -= FieldOffset;
1612161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1613161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Maybe we need to work from the other end.
16143574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow    if (Asm->getDataLayout().isLittleEndian())
1615161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Offset = FieldSize - (Offset + Size);
1616161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1617161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1618161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Here WD_AT_data_member_location points to the anonymous
1619161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // field that includes this bit field.
1620161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1621161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1622161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1623161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // This is not a bitfield.
1624161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1625161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1626161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.getTag() == dwarf::DW_TAG_inheritance
1627161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      && DT.isVirtual()) {
1628161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1629161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // For C++, virtual base classes are not at fixed offset. Use following
1630161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // expression to extract appropriate offset from vtable.
1631161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1632161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1633161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1634161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1635161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1636161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1637161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1638161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1639161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1640161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1641161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1642161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1643161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel             VBaseLocationDie);
1644161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1645161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1646161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1647161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isProtected())
164813aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1649161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_protected);
1650161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (DT.isPrivate())
165113aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1652161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_private);
1653161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Otherwise C++ member and base classes are considered public.
16548b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  else
165513aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1656161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
1657161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isVirtual())
1658798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1659161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_VIRTUALITY_virtual);
1660e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel
1661e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  // Objective-C properties.
16626588abf377b7381274236e651462ec83052f6013Devang Patel  if (MDNode *PNode = DT.getObjCProperty())
16636588abf377b7381274236e651462ec83052f6013Devang Patel    if (DIEEntry *PropertyDie = getDIEEntry(PNode))
16648b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
16656588abf377b7381274236e651462ec83052f6013Devang Patel                          PropertyDie);
16666588abf377b7381274236e651462ec83052f6013Devang Patel
166701bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie  if (DT.isArtificial())
166801bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie    addFlag(MemberDie, dwarf::DW_AT_artificial);
166901bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie
1670161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return MemberDie;
1671161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
16726b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
16736b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// createStaticMemberDIE - Create new DIE for C++ static member.
16746b6061f01171bd3d4e32022efa45428d4f9941eeEric ChristopherDIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
16756b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (!DT.Verify())
16766b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return NULL;
16776b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
16786b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIE *StaticMemberDIE = new DIE(DT.getTag());
16796b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIType Ty = DT.getTypeDerivedFrom();
16806b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
16816b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
16826b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addType(StaticMemberDIE, Ty);
16836b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addSourceLine(StaticMemberDIE, DT);
16846b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addFlag(StaticMemberDIE, dwarf::DW_AT_external);
16856b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
16866b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
16876b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // FIXME: We could omit private if the parent is a class_type, and
16886b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // public if the parent is something else.
16896b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (DT.isProtected())
16906b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
16916b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher            dwarf::DW_ACCESS_protected);
16926b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  else if (DT.isPrivate())
16936b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
16946b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher            dwarf::DW_ACCESS_private);
16956b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  else
16966b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
16976b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher            dwarf::DW_ACCESS_public);
16986b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
16996b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
17006b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
170114268416720155d63f190a6143ee40b3b850e409David Blaikie  if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
170214268416720155d63f190a6143ee40b3b850e409David Blaikie    addConstantFPValue(StaticMemberDIE, CFP);
17036b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
17046b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  insertDIE(DT, StaticMemberDIE);
17056b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  return StaticMemberDIE;
17066b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher}
1707