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"
3059eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie#include "llvm/Target/TargetLoweringObjectFile.h"
31161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetRegisterInfo.h"
32161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
33161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelusing namespace llvm;
34161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
35161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// CompileUnit - Compile unit constructor.
369c57ad2381488b7cde7e3eb459d2ce3e447e93b7Eric ChristopherCompileUnit::CompileUnit(unsigned UID, unsigned L, DIE *D, const MDNode *N,
375592ba4775964ab5e15a4603249e6beadfa5ce7aEric Christopher                         AsmPrinter *A, DwarfDebug *DW, DwarfUnits *DWU)
382e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher  : UniqueID(UID), Language(L), CUDie(D), Asm(A), DD(DW), DU(DWU),
39bc3e96f17bb278358cd3976f35b87591a392f5afManman Ren    IndexTyDie(0), DebugInfoOffset(0) {
40161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
419c57ad2381488b7cde7e3eb459d2ce3e447e93b7Eric Christopher  insertDIE(N, D);
42161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
43161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
44161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// ~CompileUnit - Destructor for compile unit.
45161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::~CompileUnit() {
46161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
47161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlocks[j]->~DIEBlock();
48161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
49161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
50161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
51161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// information entry.
52161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
53161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
54161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Value;
55161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
56161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
576afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling/// getDefaultLowerBound - Return the default lower bound for an array. If the
58222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling/// DWARF version doesn't handle the language, return -1.
596afe478e005bf9f112b32b7ec25879475adc1915Bill Wendlingint64_t CompileUnit::getDefaultLowerBound() const {
60222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  switch (Language) {
61222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  default:
62222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
63222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
64222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C89:
65222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C99:
66222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C:
67222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C_plus_plus:
68222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_ObjC:
69222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_ObjC_plus_plus:
70222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    return 0;
71222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
72222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran77:
73222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran90:
74222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran95:
75222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    return 1;
76222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
77222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // The languages below have valid values only if the DWARF version >= 4.
78222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Java:
79222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Python:
80222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_UPC:
81222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_D:
82222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    if (dwarf::DWARF_VERSION >= 4)
83222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling      return 0;
84222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
85222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
86222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Ada83:
87222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Ada95:
88222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Cobol74:
89222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Cobol85:
90222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Modula2:
91222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Pascal83:
92222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_PLI:
93222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    if (dwarf::DWARF_VERSION >= 4)
94222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling      return 1;
95222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
96222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  }
97222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
98222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  return -1;
99222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling}
100222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
101873cf0a0d7906083578d9b793008348750636138Eric Christopher/// addFlag - Add a flag that is true.
102873cf0a0d7906083578d9b793008348750636138Eric Christophervoid CompileUnit::addFlag(DIE *Die, unsigned Attribute) {
103873cf0a0d7906083578d9b793008348750636138Eric Christopher  if (!DD->useDarwinGDBCompat())
104873cf0a0d7906083578d9b793008348750636138Eric Christopher    Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
105873cf0a0d7906083578d9b793008348750636138Eric Christopher                  DIEIntegerOne);
106873cf0a0d7906083578d9b793008348750636138Eric Christopher  else
107873cf0a0d7906083578d9b793008348750636138Eric Christopher    addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
108873cf0a0d7906083578d9b793008348750636138Eric Christopher}
109873cf0a0d7906083578d9b793008348750636138Eric Christopher
110161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addUInt - Add an unsigned integer attribute data and value.
111161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
112161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addUInt(DIE *Die, unsigned Attribute,
113161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, uint64_t Integer) {
114161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(false, Integer);
115161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = Integer == 1 ?
116161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
117161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
118161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
119161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
120161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSInt - Add an signed integer attribute data and value.
121161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
122161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSInt(DIE *Die, unsigned Attribute,
123161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, int64_t Integer) {
124161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(true, Integer);
125161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
126161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
127161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
128161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1296a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// addString - Add a string attribute data and value. We always emit a
1306a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// reference to the string pool instead of immediate strings so that DIEs have
1313cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// more predictable sizes. In the case of split dwarf we emit an index
1323cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// into another table which gets us the static offset into the string
1333cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// table.
134390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewyckyvoid CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
1353dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  DIEValue *Value;
1363dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  unsigned Form;
137dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher  if (!DD->useSplitDwarf()) {
138dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    MCSymbol *Symb = DU->getStringPoolEntry(String);
139dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    if (Asm->needsRelocationsForDwarfStringPool())
1401f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand      Value = new (DIEValueAllocator) DIELabel(Symb);
141dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    else {
142dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher      MCSymbol *StringPool = DU->getStringPoolSym();
143dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher      Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
144dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    }
1453dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    Form = dwarf::DW_FORM_strp;
146dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher  } else {
147dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher    unsigned idx = DU->getStringPoolIndex(String);
1483dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    Value = new (DIEValueAllocator) DIEInteger(idx);
1493dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    Form = dwarf::DW_FORM_GNU_str_index;
150dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher  }
1513dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
1523dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  Die->addValue(Attribute, Form, Str);
153dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher}
154dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher
155dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher/// addLocalString - Add a string attribute data and value. This is guaranteed
156dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher/// to be in the local string pool instead of indirected.
157dd8e9f395e881972b320d947de88102a0be04b70Eric Christophervoid CompileUnit::addLocalString(DIE *Die, unsigned Attribute,
158dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher                                 StringRef String) {
1592e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher  MCSymbol *Symb = DU->getStringPoolEntry(String);
1606a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  DIEValue *Value;
1616a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  if (Asm->needsRelocationsForDwarfStringPool())
1621f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand    Value = new (DIEValueAllocator) DIELabel(Symb);
1636a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  else {
1642e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher    MCSymbol *StringPool = DU->getStringPoolSym();
1656a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
166390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  }
1676a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
168161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
169161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1701f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand/// addExpr - Add a Dwarf expression attribute data and value.
171161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
1721f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigandvoid CompileUnit::addExpr(DIE *Die, unsigned Attribute, unsigned Form,
1731f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand                          const MCExpr *Expr) {
1741f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand  DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
175161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
176161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
177161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1781f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand/// addLabel - Add a Dwarf label attribute data and value.
1791f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand///
18095e72c90e4e2ee64e12d898f6495e796ebcadaf8David Blaikievoid CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
18195e72c90e4e2ee64e12d898f6495e796ebcadaf8David Blaikie                           const MCSymbol *Label) {
1821f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand  DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
1831f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand  Die->addValue(Attribute, Form, Value);
18495e72c90e4e2ee64e12d898f6495e796ebcadaf8David Blaikie}
18595e72c90e4e2ee64e12d898f6495e796ebcadaf8David Blaikie
18672f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher/// addLabelAddress - Add a dwarf label attribute data and value using
18772f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher/// DW_FORM_addr or DW_FORM_GNU_addr_index.
18872f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher///
18972f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christophervoid CompileUnit::addLabelAddress(DIE *Die, unsigned Attribute,
19072f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher                                  MCSymbol *Label) {
19172f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher  if (!DD->useSplitDwarf()) {
19272f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    if (Label != NULL) {
1931f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand      DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
19472f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher      Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
19572f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    } else {
19672f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher      DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
19772f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher      Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
19872f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    }
19972f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher  } else {
20072f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    unsigned idx = DU->getAddrPoolIndex(Label);
20172f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
20272f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher    Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
20372f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher  }
20472f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher}
20572f7bfbf0e02bb11d3e7cca1f9598c5f9d9fa2caEric Christopher
2060969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher/// addOpAddress - Add a dwarf op address data and value using the
2070969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
2080969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher///
20995e72c90e4e2ee64e12d898f6495e796ebcadaf8David Blaikievoid CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
2100969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher  if (!DD->useSplitDwarf()) {
2110969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2120969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
2130969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher  } else {
2140969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
2158fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie    addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
2160969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher  }
2170969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher}
2180969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher
219161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDelta - Add a label delta attribute data and value.
220161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
221161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
222161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           const MCSymbol *Hi, const MCSymbol *Lo) {
223161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
224161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
225161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
226161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
227161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDIEEntry - Add a DIE attribute data and value.
228161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
229161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
230161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                              DIE *Entry) {
231161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, createDIEEntry(Entry));
232161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
233161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
234161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlock - Add block data.
235161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
236161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
237161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           DIEBlock *Block) {
238161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Block->ComputeSize(Asm);
239161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
240161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Block->BestForm(), Block);
241161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
242161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
243161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
244161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
245161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
246161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify variable.
247d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren  if (!V.isVariable())
248161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2498b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
250161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = V.getLineNumber();
251161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
252161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2537ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
2543de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            V.getContext().getDirectory(),
2553de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            getUniqueID());
256161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
257161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
258161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
259161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
260161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
261161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
262161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
263161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
264161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify global variable.
265d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren  if (!G.isGlobalVariable())
266161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
267161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
268161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = G.getLineNumber();
269161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
270161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2713de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren  unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
2723de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            getUniqueID());
273161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
274161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
275161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
276161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
277161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
278161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
279161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
280161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
281161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify subprogram.
282d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren  if (!SP.isSubprogram())
283161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
284161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
2852125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  // If the line number is 0, don't add it.
286161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = SP.getLineNumber();
2872125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
288161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2892125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher
2907ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
2913de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            SP.getDirectory(), getUniqueID());
292161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
293161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
294161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
295161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
296161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
297161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
298161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
299161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
300161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify type.
301d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren  if (!Ty.isType())
302161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
303161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
304161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = Ty.getLineNumber();
3052125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
306161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
3077ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
3083de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            Ty.getDirectory(), getUniqueID());
309161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
310161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
311161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
312161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
313161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
314161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
315161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
316b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christophervoid CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
317b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  // Verify type.
318d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren  if (!Ty.isObjCProperty())
319b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher    return;
320b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
321b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  unsigned Line = Ty.getLineNumber();
322b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  if (Line == 0)
323b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher    return;
324b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  DIFile File = Ty.getFile();
3257ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
3263de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            File.getDirectory(), getUniqueID());
327b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  assert(FileID && "Invalid file id");
328b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
329b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
330b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher}
331b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
332b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// addSourceLine - Add location information to specified debug information
333b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// entry.
334161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
335161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify namespace.
336161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!NS.Verify())
337161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
338161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
339161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = NS.getLineNumber();
340161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
341161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
342161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef FN = NS.getFilename();
343161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
3443de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren  unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
3453de61b4c0144748e4b9157e2c22fe4ea685981a2Manman Ren                                            getUniqueID());
346161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
347161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
348161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
349161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
350161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
3518b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher/// addVariableAddress - Add DW_AT_location attribute for a
352e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel/// DbgVariable based on provided MachineLocation.
353f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christophervoid CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
354e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel                                     MachineLocation Location) {
355f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  if (DV.variableHasComplexAddress())
356161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
357f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  else if (DV.isBlockByrefVariable())
358161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
359161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
3604532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie    addAddress(Die, dwarf::DW_AT_location, Location,
361f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher               DV.getVariable().isIndirect());
362161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
363161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
364116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOp - Add register operand.
365116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
366116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
367116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
368116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (DWReg < 32)
369116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
370116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
371116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
372116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
373116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
374116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
375116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
376116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOffset - Add register offset.
377116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
378116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel                                    int64_t Offset) {
379116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
380116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
381116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
382116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (Reg == TRI->getFrameRegister(*Asm->MF))
383116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    // If variable offset is based in frame register then use fbreg.
384116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
385116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else if (DWReg < 32)
386116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
387116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
388116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
389116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
390116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
391116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
392116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
393116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
394116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addAddress - Add an address attribute to a die based on the location
395116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// provided.
396116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addAddress(DIE *Die, unsigned Attribute,
3974532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie                             const MachineLocation &Location, bool Indirect) {
398116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
399116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
4004532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie  if (Location.isReg() && !Indirect)
401116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOp(Block, Location.getReg());
4024532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie  else {
403116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
4044532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie    if (Indirect && !Location.isReg()) {
4054532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
4064532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie    }
4074532c280f540de22c83ca2525f1a9a7722b4d7e3David Blaikie  }
408116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
409116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  // Now attach the location information to the DIE.
410116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addBlock(Die, Attribute, 0, Block);
411116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
412116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
413161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addComplexAddress - Start with the address based on the location provided,
414161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// and generate the DWARF information necessary to find the actual variable
415161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given the extra address information encoded in the DIVariable, starting from
416161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// the starting location.  Add the DWARF information to the die.
417161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
418f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christophervoid CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
419161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    unsigned Attribute,
420161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    const MachineLocation &Location) {
421161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
422f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  unsigned N = DV.getNumAddrElements();
423c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  unsigned i = 0;
424c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  if (Location.isReg()) {
425f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher    if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
426c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // If first address element is OpPlus then emit
427c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
428f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher      addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
429c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      i = 2;
430c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel    } else
431c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      addRegisterOp(Block, Location.getReg());
432c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  }
433116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else
434116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
435161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
436c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  for (;i < N; ++i) {
437f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher    uint64_t Element = DV.getAddrElement(i);
438161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element == DIBuilder::OpPlus) {
439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
440f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher      addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else if (Element == DIBuilder::OpDeref) {
442501207676c78fefcfc9eeeaa1e3dbe9ea857d33fEric Christopher      if (!Location.isReg())
443501207676c78fefcfc9eeeaa1e3dbe9ea857d33fEric Christopher        addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else llvm_unreachable("unknown DIBuilder Opcode");
445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
446161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
447161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/* Byref variables, in Blocks, are declared by the programmer as "SomeType
452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   gives the variable VarName either the struct, or a pointer to the struct, as
454161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   its type.  This is necessary for various behind-the-scenes things the
455161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   compiler needs to do with by-reference variables in Blocks.
456161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
457161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However, as far as the original *programmer* is concerned, the variable
458161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   should still have type 'SomeType', as originally declared.
459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The function getBlockByrefType dives into the __Block_byref_x_VarName
461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to find the original type of the variable, which is then assigned to
462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the variable's Debug Information Entry as its real type.  So far, so good.
463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However now the debugger will expect the variable VarName to have the type
464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   SomeType.  So we need the location attribute for the variable to be an
465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   expression that explains to the debugger how to navigate through the
466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   pointers and struct to find the actual variable of type SomeType.
467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The following function does just that.  We start by getting
469161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the "normal" location for the variable. This will be the location
470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   of either the struct __Block_byref_x_VarName or the pointer to the
471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName.
472161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The struct will look something like:
474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
475161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName {
476161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various fields>
477161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     struct __Block_byref_x_VarName *forwarding;
478161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various other fields>
479161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     SomeType VarName;
480161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <maybe more fields>
481161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   };
482161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
483161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we are given the struct directly (as our starting point) we
484161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   need to tell the debugger to:
485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   1).  Add the offset of the forwarding field.
487161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
488161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   2).  Follow that pointer to get the real __Block_byref_x_VarName
489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to use (the real one may have been copied onto the heap).
490161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
491161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   3).  Add the offset for the field VarName, to find the actual variable.
492161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
493161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we started with a pointer to the struct, then we need to
494161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   dereference that pointer first, before the other steps.
495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   Translating this into DWARF ops, we will need to append the following
496161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   to the current location description for the variable:
497161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref                    -- optional, if we start with a pointer
499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <forward_fld_offset>
500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref
501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <varName_fld_offset>
502161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
503161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   That is what this function does.  */
504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlockByrefAddress - Start with the address based on the location
506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// provided, and generate the DWARF information necessary to find the
507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// actual Block variable (navigating the Block struct) based on the
508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// starting location.  Add the DWARF information to the die.  For
509161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// more information, read large comment just above here.
510161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
511f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christophervoid CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
512161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       unsigned Attribute,
513161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       const MachineLocation &Location) {
514f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  DIType Ty = DV.getType();
515161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType TmpTy = Ty;
516161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = Ty.getTag();
517161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool isPointer = false;
518161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
519f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  StringRef varName = DV.getName();
520161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
521161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_pointer_type) {
522161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DTy = DIDerivedType(Ty);
523161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    TmpTy = DTy.getTypeDerivedFrom();
524161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    isPointer = true;
525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
526161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
527161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DICompositeType blockStruct = DICompositeType(TmpTy);
528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Find the __forwarding field and the variable field in the __Block_byref
530161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct.
531161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Fields = blockStruct.getTypeArray();
532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor varField = DIDescriptor();
533161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor forwardingField = DIDescriptor();
534161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
535161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
536161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Fields.getElement(i);
537161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DT = DIDerivedType(Element);
538161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    StringRef fieldName = DT.getName();
539161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (fieldName == "__forwarding")
540161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      forwardingField = Element;
541161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (fieldName == varName)
542161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      varField = Element;
543161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
544161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
545161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the offsets for the forwarding field and the variable field.
546161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned forwardingFieldOffset =
547161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(forwardingField).getOffsetInBits() >> 3;
548161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned varFieldOffset =
549161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(varField).getOffsetInBits() >> 3;
550161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
551161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Decode the original location, and use that as the start of the byref
552161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // variable's location.
553161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
554161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
555caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  if (Location.isReg())
556caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher    addRegisterOp(Block, Location.getReg());
557caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  else
558caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
559161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
560161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If we started with a pointer to the __Block_byref... struct, then
561161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // the first thing we need to do is dereference the pointer (DW_OP_deref).
562161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (isPointer)
563161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
564161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
565161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Next add the offset for the '__forwarding' field:
566161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
567161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // adding the offset if it's 0.
568161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (forwardingFieldOffset > 0) {
569161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
570161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
571161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
572161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
573161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now dereference the __forwarding field to get to the real __Block_byref
574161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct:  DW_OP_deref.
575161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
576161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
577161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now that we've got the real __Block_byref... struct, add the offset
578161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // for the variable's field to get to the location of the actual variable:
579161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
580161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (varFieldOffset > 0) {
581161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
582161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
583161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
584161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
585161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
586161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
587161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
588161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
5894ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel/// isTypeSigned - Return true if the type is signed.
5904ec14b0dee433a4f134d832e326a20839b1f777eDevang Patelstatic bool isTypeSigned(DIType Ty, int *SizeInBits) {
5914ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isDerivedType())
5924ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
5934ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isBasicType())
5944ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
5954ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel        || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
5964ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      *SizeInBits = Ty.getSizeInBits();
5974ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      return true;
5984ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    }
5994ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  return false;
6004ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel}
6014ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel
602161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
603e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christophervoid CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
604b58128e2b2375173aafb07905bd53014d622e4baDevang Patel                                   DIType Ty) {
6054de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  // FIXME: This is a bit conservative/simple - it emits negative values at
6064de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  // their maximum bit width which is a bit unfortunate (& doesn't prefer
6074de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  // udata/sdata over dataN as suggested by the DWARF spec)
608746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  assert(MO.isImm() && "Invalid machine operand!");
609161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
6104ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  int SizeInBits = -1;
6114ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
6124ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
6134ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  switch (SizeInBits) {
6144ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 8:  Form = dwarf::DW_FORM_data1; break;
6154ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 16: Form = dwarf::DW_FORM_data2; break;
6164ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 32: Form = dwarf::DW_FORM_data4; break;
6174ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 64: Form = dwarf::DW_FORM_data8; break;
618045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel    default: break;
619045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel  }
6208b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
6214ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    : addUInt(Block, 0, Form, MO.getImm());
62272f0d9cdefa3086715e1e2547a9843321690b4d9Devang Patel
623161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
624161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
625161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
626161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantFPValue - Add constant value entry in variable DIE.
627e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christophervoid CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
628390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  assert (MO.isFPImm() && "Invalid machine operand!");
629161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
630161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  APFloat FPImm = MO.getFPImm()->getValueAPF();
631161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
632161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the floating point.
633161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const APInt FltVal = FPImm.bitcastToAPInt();
634161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const char *FltPtr = (const char*)FltVal.getRawData();
635161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
636161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
6373574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  bool LittleEndian = Asm->getDataLayout().isLittleEndian();
638161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Incr = (LittleEndian ? 1 : -1);
639161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Start = (LittleEndian ? 0 : NumBytes - 1);
640161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Stop = (LittleEndian ? NumBytes : -1);
641161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
642161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
643161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (; Start != Stop; Start += Incr)
644161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1,
645161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            (unsigned char)0xFF & FltPtr[Start]);
646161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
647161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
648161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
649161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
65014268416720155d63f190a6143ee40b3b850e409David Blaikie/// addConstantFPValue - Add constant value entry in variable DIE.
651e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christophervoid CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
652e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher  addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), false);
65314268416720155d63f190a6143ee40b3b850e409David Blaikie}
65414268416720155d63f190a6143ee40b3b850e409David Blaikie
655161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
656e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christophervoid CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
657161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                   bool Unsigned) {
658e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher  addConstantValue(Die, CI->getValue(), Unsigned);
65914268416720155d63f190a6143ee40b3b850e409David Blaikie}
66014268416720155d63f190a6143ee40b3b850e409David Blaikie
66114268416720155d63f190a6143ee40b3b850e409David Blaikie// addConstantValue - Add constant value entry in variable DIE.
662e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christophervoid CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
66314268416720155d63f190a6143ee40b3b850e409David Blaikie  unsigned CIBitWidth = Val.getBitWidth();
664d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel  if (CIBitWidth <= 64) {
665d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    unsigned form = 0;
666d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    switch (CIBitWidth) {
667d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 8: form = dwarf::DW_FORM_data1; break;
668d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 16: form = dwarf::DW_FORM_data2; break;
669d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 32: form = dwarf::DW_FORM_data4; break;
670d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 64: form = dwarf::DW_FORM_data8; break;
6718b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher    default:
672d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
673d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    }
674161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Unsigned)
67514268416720155d63f190a6143ee40b3b850e409David Blaikie      addUInt(Die, dwarf::DW_AT_const_value, form, Val.getZExtValue());
676161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else
67714268416720155d63f190a6143ee40b3b850e409David Blaikie      addSInt(Die, dwarf::DW_AT_const_value, form, Val.getSExtValue());
678e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher    return;
679161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
680161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
681161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
682161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
683161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the large APInt.
684c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  const uint64_t *Ptr64 = Val.getRawData();
685161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
686161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
6873574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  bool LittleEndian = Asm->getDataLayout().isLittleEndian();
688161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
689161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
690c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  for (int i = 0; i < NumBytes; i++) {
691c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    uint8_t c;
692c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    if (LittleEndian)
693c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[i / 8] >> (8 * (i & 7));
694c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    else
695c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
696c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    addUInt(Block, 0, dwarf::DW_FORM_data1, c);
697c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  }
698161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
699161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
700161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
701161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
7026c3bb94445305f8ee0be6d3c9457a411bf22b3ebEric Christopher/// addTemplateParams - Add template parameters into buffer.
703161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
704161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add template parameters.
705161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
706161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = TParams.getElement(i);
707161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.isTemplateTypeParameter())
708161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
709161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateTypeParameter(Element)));
710161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (Element.isTemplateValueParameter())
711161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateValueParameterDIE(
712161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateValueParameter(Element)));
713161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
714161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
715746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky
7166b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// getOrCreateContextDIE - Get context owner's DIE.
7176b6061f01171bd3d4e32022efa45428d4f9941eeEric ChristopherDIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
7186b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (Context.isType())
7196b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return getOrCreateTypeDIE(DIType(Context));
7206b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  else if (Context.isNameSpace())
7216b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return getOrCreateNameSpace(DINameSpace(Context));
7226b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  else if (Context.isSubprogram())
7236b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return getOrCreateSubprogramDIE(DISubprogram(Context));
7246c3bb94445305f8ee0be6d3c9457a411bf22b3ebEric Christopher  else
7256b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return getDIE(Context);
7266b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher}
7276b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
728161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addToContextOwner - Add Die into the list of its context owner's children.
729161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
7306b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (DIE *ContextDIE = getOrCreateContextDIE(Context))
731161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
732161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
733161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(Die);
734161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
735161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
736161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
737161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given DIType.
73894c7ddb6f52a5200983fed0ce74dc602a7737879Devang PatelDIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
73994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  DIType Ty(TyNode);
740d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren  if (!Ty.isType())
74194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel    return NULL;
742161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *TyDIE = getDIE(Ty);
743161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (TyDIE)
744161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return TyDIE;
745161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
746161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Create new type.
747161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  TyDIE = new DIE(dwarf::DW_TAG_base_type);
748161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIE(Ty, TyDIE);
749161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Ty.isBasicType())
750161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIBasicType(Ty));
751161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (Ty.isCompositeType())
752161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DICompositeType(Ty));
753161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else {
754161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    assert(Ty.isDerivedType() && "Unknown kind of DIType");
755161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIDerivedType(Ty));
756161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
7571b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // If this is a named finished type then include it in the list of types
7581b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // for the accelerator tables.
759c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
760c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    bool IsImplementation = 0;
761c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    if (Ty.isCompositeType()) {
762c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      DICompositeType CT(Ty);
763e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // A runtime language of 0 actually means C/C++ and that any
764e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // non-negative value is some version of Objective-C/C++.
765c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      IsImplementation = (CT.getRunTimeLang() == 0) ||
766e2dc9336d15ad3ca4f38d296d17f6682829b80b4Eric Christopher        CT.isObjcClassComplete();
767c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    }
768e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    unsigned Flags = IsImplementation ?
769e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher                     DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
770e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
771c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  }
7728b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
773161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addToContextOwner(TyDIE, Ty.getContext());
774161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return TyDIE;
775161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
776161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
777161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addType - Add a new type attribute to the specified entity.
7784d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christophervoid CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) {
779d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren  if (!Ty.isType())
780161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
781161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
782161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Check for pre-existence.
783161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Entry = getDIEEntry(Ty);
784161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If it exists then use the existing value.
785161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Entry) {
786663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher    Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
787161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
788161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
789161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
790161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Construct type.
791161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Buffer = getOrCreateTypeDIE(Ty);
792161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
793161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Set up proxy.
794161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Entry = createDIEEntry(Buffer);
795161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIEEntry(Ty, Entry);
796663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher  Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
797e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel
798e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // If this is a complete composite type then include it in the
799e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // list of global types.
800c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel  addGlobalType(Ty);
80166658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel}
80266658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel
80366658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel/// addGlobalType - Add a new global type to the compile unit.
80466658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel///
805c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patelvoid CompileUnit::addGlobalType(DIType Ty) {
806e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  DIDescriptor Context = Ty.getContext();
8078b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
8088b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      && (!Context || Context.isCompileUnit() || Context.isFile()
80994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel          || Context.isNameSpace()))
810c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    if (DIEEntry *Entry = getDIEEntry(Ty))
811c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel      GlobalTypes[Ty.getName()] = Entry->getEntry();
812161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
813161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
81431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// addPubTypes - Add type for pubtypes section.
81531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patelvoid CompileUnit::addPubTypes(DISubprogram SP) {
81631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DICompositeType SPTy = SP.getType();
81731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  unsigned SPTag = SPTy.getTag();
81831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (SPTag != dwarf::DW_TAG_subroutine_type)
81931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return;
82031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
82131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIArray Args = SPTy.getTypeArray();
82231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
82331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    DIType ATy(Args.getElement(i));
824d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren    if (!ATy.isType())
82531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel      continue;
826c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    addGlobalType(ATy);
82731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  }
82831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
82931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
830161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct basic type die from DIBasicType.
831161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
832161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
833161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = BTy.getName();
834161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
835161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
836390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
837734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
838734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
839734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    Buffer.setTag(dwarf::DW_TAG_unspecified_type);
84061c91d5d7c3b40837e5512b53b15b3e3a65833faEric Christopher    // An unspecified type only has a name attribute.
841734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    return;
842734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  }
843734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
844734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  Buffer.setTag(dwarf::DW_TAG_base_type);
845746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
84630d409ca097e35c51964c9dac642804e5e495906Devang Patel          BTy.getEncoding());
847734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
848161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = BTy.getSizeInBits() >> 3;
849161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
850161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
851161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
852161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct derived type die from DIDerivedType.
853161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
854161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
855161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DTy.getName();
856161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DTy.getSizeInBits() >> 3;
857161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = DTy.getTag();
858161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
859161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // FIXME - Workaround for templates.
860161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
861161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
862161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
863161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
864161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Map to main type, void will not have a type.
865161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType FromTy = DTy.getTypeDerivedFrom();
866161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, FromTy);
867161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
868161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
869161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
870390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
871161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
872161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add size if non-zero (derived types might be zero-sized.)
87335f225aa2c04ca2420161cca812cb3eb611bde51Eric Christopher  if (Size && Tag != dwarf::DW_TAG_pointer_type)
874161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
875161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
87662fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie  if (Tag == dwarf::DW_TAG_ptr_to_member_type)
87762fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
87862fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie                  getOrCreateTypeDIE(DTy.getClassType()));
879161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add source line info if available and TyDesc is not a forward declaration.
880161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!DTy.isForwardDecl())
881161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addSourceLine(&Buffer, DTy);
882161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
883161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
8843dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher/// Return true if the type is appropriately scoped to be contained inside
8853dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher/// its own type unit.
8863dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopherstatic bool isTypeUnitScoped(DIType Ty) {
8873dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  DIScope Parent = Ty.getContext();
8883dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  while (Parent) {
8893dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    // Don't generate a hash for anything scoped inside a function.
8903dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    if (Parent.isSubprogram())
8913dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher      return false;
8923dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    Parent = Parent.getContext();
8933dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  }
8943dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  return true;
8953dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher}
8963dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher
8973dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher/// Return true if the type should be split out into a type unit.
8983dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopherstatic bool shouldCreateTypeUnit(DICompositeType CTy) {
8993dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  unsigned Tag = CTy.getTag();
9003dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher
9013dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  switch (Tag) {
9023dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  case dwarf::DW_TAG_structure_type:
9033dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  case dwarf::DW_TAG_union_type:
9043dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  case dwarf::DW_TAG_enumeration_type:
9053dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  case dwarf::DW_TAG_class_type:
9063dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    // If this is a class, structure, union, or enumeration type
9073dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    // that is not a declaration, is a type definition, and not scoped
9083dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    // inside a function then separate this out as a type unit.
9093dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy))
9103dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher      return 0;
9113dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    return 1;
9123dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  default:
9133dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    return 0;
9143dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  }
9153dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher}
9163dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher
917161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct type DIE from DICompositeType.
918161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
919161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
920161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = CTy.getName();
921161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
922161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = CTy.getSizeInBits() >> 3;
923161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = CTy.getTag();
924161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
925161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
926161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  switch (Tag) {
927161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_array_type:
928161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructArrayTypeDIE(Buffer, &CTy);
929161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
930161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_enumeration_type: {
931161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
932161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
933161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add enumerators to enumeration type.
934161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
935161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
936161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Enum(Elements.getElement(i));
937161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Enum.isEnumerator()) {
938161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
939161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(ElemDie);
940161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
941161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
942bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    DIType DTy = CTy.getTypeDerivedFrom();
943d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren    if (DTy.isType()) {
944bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher      addType(&Buffer, DTy);
945bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher      addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
946bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    }
947161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
948161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
949161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_subroutine_type: {
950161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add return type.
951161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
952161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor RTy = Elements.getElement(0);
953161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addType(&Buffer, DIType(RTy));
954161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
955161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    bool isPrototyped = true;
956161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add arguments.
957161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
958161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Ty = Elements.getElement(i);
959161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Ty.isUnspecifiedParameter()) {
960161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
961161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
962161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        isPrototyped = false;
963161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      } else {
964161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
965161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addType(Arg, DIType(Ty));
966aaf2e639ecf2e5a1647e6d59ef53dc76da0a6102David Blaikie        if (DIType(Ty).isArtificial())
967aaf2e639ecf2e5a1647e6d59ef53dc76da0a6102David Blaikie          addFlag(Arg, dwarf::DW_AT_artificial);
968161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
969161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
970161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
9718b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // Add prototype flag if we're dealing with a C language and the
9728b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // function has been prototyped.
9738b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    if (isPrototyped &&
9744d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        (Language == dwarf::DW_LANG_C89 ||
9754d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher         Language == dwarf::DW_LANG_C99 ||
9764d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher         Language == dwarf::DW_LANG_ObjC))
977873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_prototyped);
978161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
979161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
980161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_structure_type:
981161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_union_type:
982161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_class_type: {
983c8b93557da150e051c273701652a2db328708708David Blaikie    if (CTy.isForwardDecl())
984161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      break;
985161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
986161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
987c8b93557da150e051c273701652a2db328708708David Blaikie    DIArray Elements = CTy.getTypeArray();
988c8b93557da150e051c273701652a2db328708708David Blaikie    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
989161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Element = Elements.getElement(i);
990161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
991161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Element.isSubprogram()) {
992161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DISubprogram SP(Element);
993dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
994161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isProtected())
99513aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
996161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_protected);
997161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        else if (SP.isPrivate())
99813aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
999161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_private);
10008b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher        else
100113aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1002161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
1003161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isExplicit())
1004873cf0a0d7906083578d9b793008348750636138Eric Christopher          addFlag(ElemDie, dwarf::DW_AT_explicit);
1005663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isDerivedType()) {
10064d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        DIDerivedType DDTy(Element);
10074d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        if (DDTy.getTag() == dwarf::DW_TAG_friend) {
10084d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          ElemDie = new DIE(dwarf::DW_TAG_friend);
10094d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
10106b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher        } else if (DDTy.isStaticMember())
10116b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher          ElemDie = createStaticMemberDIE(DDTy);
10126b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher        else
10136b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher          ElemDie = createMemberDIE(DDTy);
1014663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isObjCProperty()) {
101530d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIObjCProperty Property(Element);
101630d409ca097e35c51964c9dac642804e5e495906Devang Patel        ElemDie = new DIE(Property.getTag());
101730d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef PropertyName = Property.getObjCPropertyName();
101830d409ca097e35c51964c9dac642804e5e495906Devang Patel        addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
10194d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        addType(ElemDie, Property.getType());
10204d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        addSourceLine(ElemDie, Property);
102130d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef GetterName = Property.getObjCPropertyGetterName();
102230d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!GetterName.empty())
102330d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
102430d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef SetterName = Property.getObjCPropertySetterName();
102530d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!SetterName.empty())
102630d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
102730d409ca097e35c51964c9dac642804e5e495906Devang Patel        unsigned PropertyAttributes = 0;
10289e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadOnlyObjCProperty())
10299e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
10309e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadWriteObjCProperty())
10319e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
10329e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isAssignObjCProperty())
10339e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
10349e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isRetainObjCProperty())
10359e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
10369e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isCopyObjCProperty())
10379e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
10389e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isNonAtomicObjCProperty())
10399e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
10409e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (PropertyAttributes)
10418b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher          addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
10429e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel                 PropertyAttributes);
10436588abf377b7381274236e651462ec83052f6013Devang Patel
104430d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIEEntry *Entry = getDIEEntry(Element);
104530d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!Entry) {
104630d409ca097e35c51964c9dac642804e5e495906Devang Patel          Entry = createDIEEntry(ElemDie);
104730d409ca097e35c51964c9dac642804e5e495906Devang Patel          insertDIEEntry(Element, Entry);
104830d409ca097e35c51964c9dac642804e5e495906Devang Patel        }
10499e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel      } else
1050161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        continue;
1051161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(ElemDie);
1052161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
1053161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1054161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (CTy.isAppleBlockExtension())
1055873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
1056161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1057161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DICompositeType ContainingType = CTy.getContainingType();
1058161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (DIDescriptor(ContainingType).isCompositeType())
1059161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1060161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  getOrCreateTypeDIE(DIType(ContainingType)));
1061010dbfdf9357f7db9dd93af35d6454919f7988f9Eric Christopher    else
1062010dbfdf9357f7db9dd93af35d6454919f7988f9Eric Christopher      addToContextOwner(&Buffer, CTy.getContext());
1063161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1064201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel    if (CTy.isObjcClassComplete())
1065873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
1066b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel
10671a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // Add template parameters to a class, structure or union types.
10681a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // FIXME: The support isn't in the metadata for this yet.
10691a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    if (Tag == dwarf::DW_TAG_class_type ||
10701a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_structure_type ||
10711a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_union_type)
1072161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addTemplateParams(Buffer, CTy.getTemplateParams());
1073161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1074161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
1075161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1076161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  default:
1077161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
1078161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1079161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1080161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
1081161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
1082390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
1083161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
10844a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher  if (Tag == dwarf::DW_TAG_enumeration_type ||
10854a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_class_type ||
10864a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_structure_type ||
10874a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_union_type) {
1088161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add size if non-zero (derived types might be zero-sized.)
1089fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // TODO: Do we care about size for enum forward declarations?
1090161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Size)
1091161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1092fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    else if (!CTy.isForwardDecl())
1093161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      // Add zero size if it is not a forward declaration.
1094fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1095fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher
1096fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // If we're a forward decl, say so.
1097fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    if (CTy.isForwardDecl())
1098873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_declaration);
1099161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1100161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add source line info if available.
1101161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (!CTy.isForwardDecl())
1102161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addSourceLine(&Buffer, CTy);
11038938895a8338e6084eb12a2bb4bf044928436173Eric Christopher
11048938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    // No harm in adding the runtime language to the declaration.
11058938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    unsigned RLang = CTy.getRunTimeLang();
11068938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    if (RLang)
11078938895a8338e6084eb12a2bb4bf044928436173Eric Christopher      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
11088938895a8338e6084eb12a2bb4bf044928436173Eric Christopher              dwarf::DW_FORM_data1, RLang);
1109161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
11103dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  // If this is a type applicable to a type unit it then add it to the
11113dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  // list of types we'll compute a hash for later.
11123dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  if (shouldCreateTypeUnit(CTy))
11133dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher    DD->addTypeUnitType(&Buffer);
1114161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1115161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
11168b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1117161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateTypeParameter.
1118161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
1119161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1120161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TP);
1121161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
1122161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
1123161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1124161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1125161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TP.getType());
1126e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie  if (!TP.getName().empty())
1127e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie    addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
1128161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
1129161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1130161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
11318b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1132161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateValueParameter.
1133161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
11344d069bf8ec726570d668e59fda993a33dfb7cb0bEric ChristopherCompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){
1135161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TPV);
1136161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
1137161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
1138161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1139e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie  ParamDIE = new DIE(TPV.getTag());
1140161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TPV.getType());
1141161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!TPV.getName().empty())
1142390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
11434de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  if (Value *Val = TPV.getValue()) {
11444de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie    if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
11454de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      addConstantValue(ParamDIE, CI, TPV.getType().isUnsignedDIType());
11464de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie    else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
11474de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // For declaration non-type template parameters (such as global values and
11484de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // functions)
11494de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
11504de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      addOpAddress(Block, Asm->Mang->getSymbol(GV));
11514de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // Emit DW_OP_stack_value to use the address as the immediate value of the
11524de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // parameter, rather than a pointer to it.
11534de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
11544de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
1155e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie    } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1156e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      assert(isa<MDString>(Val));
1157e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1158e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie                cast<MDString>(Val)->getString());
1159e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie    } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1160e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      assert(isa<MDNode>(Val));
1161e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      DIArray A(cast<MDNode>(Val));
1162e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      addTemplateParams(*ParamDIE, A);
11634de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie    }
11644de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  }
11654de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie
1166161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
1167161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1168161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
116931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// getOrCreateNameSpace - Create a DIE for DINameSpace.
117031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang PatelDIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
117131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIE *NDie = getDIE(NS);
117231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (NDie)
117331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return NDie;
117431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  NDie = new DIE(dwarf::DW_TAG_namespace);
117531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  insertDIE(NS, NDie);
117609ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  if (!NS.getName().empty()) {
1177390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(NDie, dwarf::DW_AT_name, NS.getName());
117809ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace(NS.getName(), NDie);
117909ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  } else
118009ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace("(anonymous namespace)", NDie);
118131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addSourceLine(NDie, NS);
118231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addToContextOwner(NDie, NS.getContext());
118331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  return NDie;
118431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
118531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
1186dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getOrCreateSubprogramDIE - Create new DIE using SP.
1187dbc64af76d769596903485668a1dfc2d6640c4fbDevang PatelDIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1188dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DIE *SPDie = getDIE(SP);
1189dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SPDie)
1190dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
1191dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
119227302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  SPDie = new DIE(dwarf::DW_TAG_subprogram);
119327302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne
119427302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  // DW_TAG_inlined_subroutine may refer to this DIE.
119527302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  insertDIE(SP, SPDie);
119627302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne
119701b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DISubprogram SPDecl = SP.getFunctionDeclaration();
119801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DIE *DeclDie = NULL;
119901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (SPDecl.isSubprogram()) {
120001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    DeclDie = getOrCreateSubprogramDIE(SPDecl);
120101b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
120201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1203dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add to context owner.
1204dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addToContextOwner(SPDie, SP.getContext());
1205dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1206dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add function template parameters.
1207dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addTemplateParams(*SPDie, SP.getTemplateParams());
1208dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1209c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // Unfortunately this code needs to stay here instead of below the
1210c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // AT_specification code in order to work around a bug in older
1211c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // gdbs that requires the linkage name to resolve multiple template
1212c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // functions.
1213c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // TODO: Remove this set of code when we get rid of the old gdb
1214c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // compatibility.
12158d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher  StringRef LinkageName = SP.getLinkageName();
1216c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  if (!LinkageName.empty() && DD->useDarwinGDBCompat())
1217c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
12187c2b4be2a718b994298803dd09e81e49a016ffb2Benjamin Kramer              GlobalValue::getRealLinkageName(LinkageName));
12198d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher
1220dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // If this DIE is going to refer declaration info using AT_specification
1221c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  // then there is no need to add other attributes.
122201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (DeclDie) {
122301b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    // Refer function declaration directly.
122401b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
122501b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola                DeclDie);
122601b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1227dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
122801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
1229dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1230cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  // Add the linkage name if we have one.
1231c496875f0c205ffadcec8060e1170e1c58e4eb55Eric Christopher  if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
1232cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
12337c2b4be2a718b994298803dd09e81e49a016ffb2Benjamin Kramer              GlobalValue::getRealLinkageName(LinkageName));
1234cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher
1235dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Constructors and operators for anonymous aggregates do not have names.
1236dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.getName().empty())
1237390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(SPDie, dwarf::DW_AT_name, SP.getName());
1238dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1239dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addSourceLine(SPDie, SP);
1240dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
12418b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // Add the prototype if we have a prototype and we have a C like
12428b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // language.
12438b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  if (SP.isPrototyped() &&
12448b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher      (Language == dwarf::DW_LANG_C89 ||
12458b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_C99 ||
12468b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_ObjC))
1247873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_prototyped);
1248dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1249dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add Return Type.
1250dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DICompositeType SPTy = SP.getType();
12513d33184d9da02fb699827249e0631106252f72faDavid Blaikie  assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
12523d33184d9da02fb699827249e0631106252f72faDavid Blaikie         "the type of a subprogram should be a subroutine");
1253dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
12543d33184d9da02fb699827249e0631106252f72faDavid Blaikie  DIArray Args = SPTy.getTypeArray();
12553d33184d9da02fb699827249e0631106252f72faDavid Blaikie  addType(SPDie, DIType(Args.getElement(0)));
1256dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1257dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  unsigned VK = SP.getVirtuality();
1258dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (VK) {
1259798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1260dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIEBlock *Block = getDIEBlock();
1261dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1262dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1263dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1264dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    ContainingTypeMap.insert(std::make_pair(SPDie,
1265dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel                                            SP.getContainingType()));
1266dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1267dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1268dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isDefinition()) {
1269873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_declaration);
12708b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
1271dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // Add arguments. Do not add arguments for subprogram definition. They will
1272dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // be handled while processing variables.
12733d33184d9da02fb699827249e0631106252f72faDavid Blaikie    for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
12743d33184d9da02fb699827249e0631106252f72faDavid Blaikie      DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
12753d33184d9da02fb699827249e0631106252f72faDavid Blaikie      DIType ATy = DIType(Args.getElement(i));
12763d33184d9da02fb699827249e0631106252f72faDavid Blaikie      addType(Arg, ATy);
12773d33184d9da02fb699827249e0631106252f72faDavid Blaikie      if (ATy.isArtificial())
12783d33184d9da02fb699827249e0631106252f72faDavid Blaikie        addFlag(Arg, dwarf::DW_AT_artificial);
12793d33184d9da02fb699827249e0631106252f72faDavid Blaikie      SPDie->addChild(Arg);
12803d33184d9da02fb699827249e0631106252f72faDavid Blaikie    }
1281dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1282dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1283dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isArtificial())
1284873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_artificial);
1285dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1286dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isLocalToUnit())
1287873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_external);
1288dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1289dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isOptimized())
1290873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1291dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1292dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (unsigned isa = Asm->getISAEncoding()) {
1293dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1294dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1295dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1296dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  return SPDie;
1297dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1298dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
12996f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// Return const expression if value is a GEP to access merged global
13006f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// constant. e.g.
13016f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
13026f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelstatic const ConstantExpr *getMergedGlobalExpr(const Value *V) {
13036f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
13046f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CE || CE->getNumOperands() != 3 ||
13056f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      CE->getOpcode() != Instruction::GetElementPtr)
13066f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
13076f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
13086f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // First operand points to a global struct.
13096f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  Value *Ptr = CE->getOperand(0);
13106f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<GlobalValue>(Ptr) ||
13116f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
13126f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
13136f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
13146f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Second operand is zero.
13156f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
13166f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CI || !CI->isZero())
13176f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
13186f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
13196f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Third operand is offset.
13206f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<ConstantInt>(CE->getOperand(2)))
13216f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
13226f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
13236f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  return CE;
13246f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
13256f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
13266f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel/// createGlobalVariableDIE - create global variable DIE.
13276f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelvoid CompileUnit::createGlobalVariableDIE(const MDNode *N) {
13286f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Check for pre-existence.
132949e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  if (getDIE(N))
13306f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return;
13316f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
133249e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIGlobalVariable GV(N);
1333d03d2b243a1c3b32a19ed4f387ac9d66febf8c2cManman Ren  if (!GV.isGlobalVariable())
133428bea08e531452992ff1e25e8584883dfbd4c232Devang Patel    return;
133528bea08e531452992ff1e25e8584883dfbd4c232Devang Patel
13366b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIDescriptor GVContext = GV.getContext();
133749e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIType GTy = GV.getType();
13386f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
13396b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // If this is a static data member definition, some attributes belong
13406b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // to the declaration DIE.
13416b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIE *VariableDIE = NULL;
1342945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren  bool IsStaticMember = false;
13436b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
13446b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (SDMDecl.Verify()) {
13456b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    assert(SDMDecl.isStaticMember() && "Expected static member decl");
13466b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // We need the declaration DIE that is in the static member's class.
13476b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // But that class might not exist in the DWARF yet.
13486b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Creating the class will create the static member decl DIE.
13496b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    getOrCreateContextDIE(SDMDecl.getContext());
13506b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    VariableDIE = getDIE(SDMDecl);
13516b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    assert(VariableDIE && "Static member decl has no context?");
1352945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren    IsStaticMember = true;
13536b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  }
13546b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
13556b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // If this is not a static data member definition, create the variable
13566b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // DIE and add the initial set of attributes to it.
13576b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (!VariableDIE) {
13586b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    VariableDIE = new DIE(GV.getTag());
13596b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add to map.
13606b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    insertDIE(N, VariableDIE);
13616b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
13626b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add name and type.
13636b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
13646b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addType(VariableDIE, GTy);
13656b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
13666b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add scoping info.
1367c5ef7eee3c412b0f334e395b0cf7c363200c2f79Krzysztof Parzyszek    if (!GV.isLocalToUnit()) {
13686b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher      addFlag(VariableDIE, dwarf::DW_AT_external);
1369c5ef7eee3c412b0f334e395b0cf7c363200c2f79Krzysztof Parzyszek      addGlobalName(GV.getName(), VariableDIE);
1370c5ef7eee3c412b0f334e395b0cf7c363200c2f79Krzysztof Parzyszek    }
13716b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
13726b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add line number info.
13736b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addSourceLine(VariableDIE, GV);
13746b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add to context owner.
13756b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addToContextOwner(VariableDIE, GVContext);
13766b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  }
1377dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher
13786f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add location.
137909ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  bool addToAccelTable = false;
1380d61c34ba30888c49f4f223422f30b018a41594daEric Christopher  DIE *VariableSpecDIE = NULL;
13816b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  bool isGlobalVariable = GV.getGlobal() != NULL;
13826f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (isGlobalVariable) {
138309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
13846f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
138559eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie    const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
138659eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie    if (GV.getGlobal()->isThreadLocal()) {
138759eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie      // FIXME: Make this work with -gsplit-dwarf.
138859eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie      unsigned PointerSize = Asm->getDataLayout().getPointerSize();
138959eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie      assert((PointerSize == 4 || PointerSize == 8) &&
139059eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie             "Add support for other sizes if necessary");
1391716a94f0c96d6bef575cd286bafb2cc507adc6b0Ulrich Weigand      const MCExpr *Expr =
13928fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie          Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
139359eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie      // Based on GCC's support for TLS:
13948fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie      if (!DD->useSplitDwarf()) {
13958fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie        // 1) Start with a constNu of the appropriate pointer size
13968fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie        addUInt(Block, 0, dwarf::DW_FORM_data1,
13978fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie                PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
13988fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie        // 2) containing the (relocated) address of the TLS variable
1399716a94f0c96d6bef575cd286bafb2cc507adc6b0Ulrich Weigand        addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
14008fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie      } else {
14018fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie        addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1402716a94f0c96d6bef575cd286bafb2cc507adc6b0Ulrich Weigand        addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
14038fed05ec1ba90c688d71323fe8a1c3070adf58cfDavid Blaikie      }
140459eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie      // 3) followed by a custom OP to tell the debugger about TLS (presumably)
140559eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
140659eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie    } else
140759eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie      addOpAddress(Block, Sym);
14086f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // Do not create specification DIE if context is either compile unit
14096f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // or a subprogram.
14101dd4e56d5565d59e9d40ad9e088a05e06f4b70f8Devang Patel    if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
14116f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel        !GVContext.isFile() && !isSubprogramContext(GVContext)) {
14126f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      // Create specification DIE.
1413d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
14146f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
14156f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                  dwarf::DW_FORM_ref4, VariableDIE);
14166f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
14176b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher      // A static member's declaration is already flagged as such.
14186b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher      if (!SDMDecl.Verify())
14196b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher        addFlag(VariableDIE, dwarf::DW_AT_declaration);
14206f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDie(VariableSpecDIE);
14216f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    } else {
14226f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
142309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    }
14246b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    // Add linkage name.
14256b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    StringRef LinkageName = GV.getLinkageName();
1426a8ada25afdb74a1cc53c183348ad9a424501dc96Eric Christopher    if (!LinkageName.empty()) {
14278d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
14288d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
14298d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // TAG_variable.
143021a08a1189df7922de3a89432cf896ed681db5d5Manman Ren      addString(IsStaticMember && VariableSpecDIE ?
143121a08a1189df7922de3a89432cf896ed681db5d5Manman Ren                VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
14327c2b4be2a718b994298803dd09e81e49a016ffb2Benjamin Kramer                GlobalValue::getRealLinkageName(LinkageName));
14338d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // In compatibility mode with older gdbs we put the linkage name on both
14348d45a98eb14338428155be70681a42dccc03a5ceEric Christopher      // the TAG_variable DIE and on the TAG_member DIE.
143521a08a1189df7922de3a89432cf896ed681db5d5Manman Ren      if (IsStaticMember && VariableSpecDIE && DD->useDarwinGDBCompat())
143621a08a1189df7922de3a89432cf896ed681db5d5Manman Ren        addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
14377c2b4be2a718b994298803dd09e81e49a016ffb2Benjamin Kramer                  GlobalValue::getRealLinkageName(LinkageName));
143806df83c25a7b07b3a19a40bd680c0a205bcc0b9aManman Ren    }
14398b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  } else if (const ConstantInt *CI =
1440945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren             dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
14412e892e4e27ecb6b1af757796841db5ff18df99a9Adrian Prantl    // AT_const_value was added when the static member was created. To avoid
1442945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren    // emitting AT_const_value multiple times, we only add AT_const_value when
1443945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren    // it is not a static member.
1444945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren    if (!IsStaticMember)
1445945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren      addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1446945e828003b746f6bbe86390940cf1433d18b0a1Manman Ren  } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
144709ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
14486f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // GV is a merged global.
14496f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
14506f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    Value *Ptr = CE->getOperand(0);
14510969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher    addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
14526f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
14536f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
14548b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher    addUInt(Block, 0, dwarf::DW_FORM_udata,
14553574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow                   Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
14566f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
14576f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
14586f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  }
14596f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1460d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  if (addToAccelTable) {
1461d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1462d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    addAccelName(GV.getName(), AddrDIE);
146309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher
1464d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // If the linkage name is different than the name, go ahead and output
1465d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // that as well into the name table.
1466d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1467d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      addAccelName(GV.getLinkageName(), AddrDIE);
1468d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  }
14696f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
14706f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
14724d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christophervoid CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
14734d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher                                       DIE *IndexTy) {
1474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1475161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
14769493dae613847b01b79914502f337814fe3e00acBill Wendling
1477222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // The LowerBound value defines the lower bounds which is typically zero for
1478222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // C/C++. The Count value is the number of elements.  Values are 64 bit. If
1479222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // Count == -1 then the array is unbounded and we do not emit
1480222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1481222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // Count == 0, then the array has zero elements in which case we do not emit
1482222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // an upper bound.
1483222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  int64_t LowerBound = SR.getLo();
14846afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling  int64_t DefaultLowerBound = getDefaultLowerBound();
1485a7645a3c66668da5e2bc772a8e5ab03dc301610cBill Wendling  int64_t Count = SR.getCount();
1486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
14876afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling  if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
1488222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1489222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
1490222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  if (Count != -1 && Count != 0)
14919493dae613847b01b79914502f337814fe3e00acBill Wendling    // FIXME: An unbounded array should reference the expression that defines
14929493dae613847b01b79914502f337814fe3e00acBill Wendling    // the array.
1493222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
14949493dae613847b01b79914502f337814fe3e00acBill Wendling
1495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.addChild(DW_Subrange);
1496161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1497161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                        DICompositeType *CTy) {
1501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(dwarf::DW_TAG_array_type);
15029a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher  if (CTy->isVector())
1503873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
1504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Emit derived type.
1506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, CTy->getTypeDerivedFrom());
1507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Elements = CTy->getTypeArray();
1508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1509161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get an anonymous type for index type.
15108cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher  // FIXME: This type should be passed down from the front end
15118cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher  // as different languages may have different sizes for indexes.
1512161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *IdxTy = getIndexTyDie();
1513161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!IdxTy) {
1514161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Construct an anonymous type for index type.
1515161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    IdxTy = new DIE(dwarf::DW_TAG_base_type);
15168cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher    addString(IdxTy, dwarf::DW_AT_name, "int");
1517161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1518161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1519161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ATE_signed);
1520161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(IdxTy);
1521161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    setIndexTyDie(IdxTy);
1522161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1523161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1524161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add subranges to array type.
1525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1526161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Elements.getElement(i);
1527161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1530161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1531161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1533161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1534161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1535161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = ETy.getName();
1536390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(Enumerator, dwarf::DW_AT_name, Name);
1537161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int64_t Value = ETy.getEnumValue();
1538161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1539161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Enumerator;
1540161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1541161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1542dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// constructContainingTypeDIEs - Construct DIEs for types that contain
1543dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// vtables.
1544dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelvoid CompileUnit::constructContainingTypeDIEs() {
1545dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1546dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1547dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *SPDie = CI->first;
1548dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    const MDNode *N = CI->second;
1549dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!N) continue;
1550dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *NDie = getDIE(N);
1551dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!NDie) continue;
1552dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1553dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1554dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1555dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1556d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1557f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric ChristopherDIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1558f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher                                       bool isScopeAbstract) {
1559d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  StringRef Name = DV->getName();
1560d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1561d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Translate tag to proper Dwarf tag.
1562d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Tag = DV->getTag();
1563d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1564d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Define variable debug information entry.
1565d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *VariableDie = new DIE(Tag);
1566d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DbgVariable *AbsVar = DV->getAbstractVariable();
1567d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1568742671bf8e422aadcf3b7697a8844b9eb6f566f2Manman Ren  if (AbsDIE)
1569d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1570742671bf8e422aadcf3b7697a8844b9eb6f566f2Manman Ren                            dwarf::DW_FORM_ref4, AbsDIE);
1571d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  else {
1572390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(VariableDie, dwarf::DW_AT_name, Name);
1573d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addSourceLine(VariableDie, DV->getVariable());
1574d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addType(VariableDie, DV->getType());
1575d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1576d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1577d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (DV->isArtificial())
1578873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(VariableDie, dwarf::DW_AT_artificial);
1579d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1580d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (isScopeAbstract) {
1581d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1582d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1583d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1584d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1585d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Add variable address.
1586d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1587d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Offset = DV->getDotDebugLocOffset();
1588d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (Offset != ~0U) {
1589afbe0e266cc3bcb6dcb318166f4a2f998cefd9b1Eric Christopher    addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1590afbe0e266cc3bcb6dcb318166f4a2f998cefd9b1Eric Christopher             Asm->GetTempSymbol("debug_loc", Offset));
1591d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1592d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1593d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1594d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
15958cf5e74a9cc7482901125b810f1e482d24e9404dEric Christopher  // Check if variable is described by a DBG_VALUE instruction.
1596d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (const MachineInstr *DVInsn = DV->getMInsn()) {
15976d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    assert(DVInsn->getNumOperands() == 3);
15986d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    if (DVInsn->getOperand(0).isReg()) {
15996d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie      const MachineOperand RegOp = DVInsn->getOperand(0);
1600b2754919ca52316755f5ce70f53db9966bee42b5Adrian Prantl      // If the second operand is an immediate, this is an indirect value.
16013517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl      if (DVInsn->getOperand(1).isImm()) {
16023517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl        MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
1603f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher        addVariableAddress(*DV, VariableDie, Location);
16046d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie      } else if (RegOp.getReg())
1605f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher        addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
16066d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    } else if (DVInsn->getOperand(0).isImm())
1607e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher      addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
16086d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    else if (DVInsn->getOperand(0).isFPImm())
1609e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher      addConstantFPValue(VariableDie, DVInsn->getOperand(0));
16106d9dbd5526e3161db884fc4fe99c278bb59ccc19David Blaikie    else if (DVInsn->getOperand(0).isCImm())
1611e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher      addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
1612e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher                       DV->getType().isUnsignedDIType());
1613e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher
1614d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1615d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1616d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  } else {
1617d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    // .. else use frame index.
1618d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    int FI = DV->getFrameIndex();
1619d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (FI != ~0) {
1620d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      unsigned FrameReg = 0;
1621d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
16228b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      int Offset =
1623d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1624d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      MachineLocation Location(FrameReg, Offset);
1625f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher      addVariableAddress(*DV, VariableDie, Location);
1626d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1627d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1628d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1629d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DV->setDIE(VariableDie);
1630d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  return VariableDie;
1631d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel}
1632d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1633161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createMemberDIE - Create new member DIE.
1634161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1635161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *MemberDie = new DIE(DT.getTag());
1636161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DT.getName();
1637161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
1638390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(MemberDie, dwarf::DW_AT_name, Name);
1639161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1640161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(MemberDie, DT.getTypeDerivedFrom());
1641161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1642161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSourceLine(MemberDie, DT);
1643161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1644161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1645161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1646161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1647161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DT.getSizeInBits();
1648161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t FieldSize = DT.getOriginalTypeSize();
1649161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1650161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Size != FieldSize) {
1651161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Handle bitfield.
1652161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1653161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1654161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1655161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t Offset = DT.getOffsetInBits();
1656161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1657161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1658161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t FieldOffset = (HiMark - FieldSize);
1659161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    Offset -= FieldOffset;
1660161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1661161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Maybe we need to work from the other end.
16623574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow    if (Asm->getDataLayout().isLittleEndian())
1663161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Offset = FieldSize - (Offset + Size);
1664161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1665161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1666161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Here WD_AT_data_member_location points to the anonymous
1667161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // field that includes this bit field.
1668161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1669161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1670161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1671161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // This is not a bitfield.
1672161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1673161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1674161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.getTag() == dwarf::DW_TAG_inheritance
1675161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      && DT.isVirtual()) {
1676161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1677161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // For C++, virtual base classes are not at fixed offset. Use following
1678161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // expression to extract appropriate offset from vtable.
1679161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1680161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1681161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1682161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1683161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1684161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1685161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1686161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1687161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1688161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1689161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1690161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1691161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel             VBaseLocationDie);
1692161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1693161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1694161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1695161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isProtected())
169613aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1697161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_protected);
1698161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (DT.isPrivate())
169913aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1700161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_private);
1701161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Otherwise C++ member and base classes are considered public.
17028b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  else
170313aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1704161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
1705161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isVirtual())
1706798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1707161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_VIRTUALITY_virtual);
1708e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel
1709e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  // Objective-C properties.
17106588abf377b7381274236e651462ec83052f6013Devang Patel  if (MDNode *PNode = DT.getObjCProperty())
17116588abf377b7381274236e651462ec83052f6013Devang Patel    if (DIEEntry *PropertyDie = getDIEEntry(PNode))
17128b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
17136588abf377b7381274236e651462ec83052f6013Devang Patel                          PropertyDie);
17146588abf377b7381274236e651462ec83052f6013Devang Patel
171501bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie  if (DT.isArtificial())
171601bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie    addFlag(MemberDie, dwarf::DW_AT_artificial);
171701bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie
1718161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return MemberDie;
1719161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
17206b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
17216b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// createStaticMemberDIE - Create new DIE for C++ static member.
17226b6061f01171bd3d4e32022efa45428d4f9941eeEric ChristopherDIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
17236b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (!DT.Verify())
17246b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    return NULL;
17256b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
17266b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIE *StaticMemberDIE = new DIE(DT.getTag());
17276b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  DIType Ty = DT.getTypeDerivedFrom();
17286b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
17296b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
17306b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addType(StaticMemberDIE, Ty);
17316b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addSourceLine(StaticMemberDIE, DT);
17326b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addFlag(StaticMemberDIE, dwarf::DW_AT_external);
17336b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
17346b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
17356b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // FIXME: We could omit private if the parent is a class_type, and
17366b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // public if the parent is something else.
17376b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (DT.isProtected())
17386b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
17396b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher            dwarf::DW_ACCESS_protected);
17406b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  else if (DT.isPrivate())
17416b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
17426b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher            dwarf::DW_ACCESS_private);
17436b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  else
17446b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
17456b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher            dwarf::DW_ACCESS_public);
17466b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
17476b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
17486b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
174914268416720155d63f190a6143ee40b3b850e409David Blaikie  if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
175014268416720155d63f190a6143ee40b3b850e409David Blaikie    addConstantFPValue(StaticMemberDIE, CFP);
17516b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
17526b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  insertDIE(DT, StaticMemberDIE);
17536b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  return StaticMemberDIE;
17546b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher}
1755