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