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