DwarfCompileUnit.cpp revision e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370
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// 10161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// This file contains support for writing dwarf compile unit. 11161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// 12161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===// 13161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 14161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#define DEBUG_TYPE "dwarfdebug" 15161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 16c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher#include "DwarfAccelTable.h" 17161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfCompileUnit.h" 18161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfDebug.h" 19161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Constants.h" 206f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/GlobalVariable.h" 216f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/Instructions.h" 22161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Analysis/DIBuilder.h" 23d61c34ba30888c49f4f223422f30b018a41594daEric Christopher#include "llvm/Support/Debug.h" 246f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/Target/Mangler.h" 25161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetData.h" 26161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetFrameLowering.h" 27161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetMachine.h" 28161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetRegisterInfo.h" 29161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/ADT/APFloat.h" 30161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Support/ErrorHandling.h" 31161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 32161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelusing namespace llvm; 33161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 34161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// CompileUnit - Compile unit constructor. 35438b092a4bba8d766316542ced10b7b028bad82cEric ChristopherCompileUnit::CompileUnit(unsigned I, unsigned L, DIE *D, AsmPrinter *A, 36438b092a4bba8d766316542ced10b7b028bad82cEric Christopher DwarfDebug *DW) 37438b092a4bba8d766316542ced10b7b028bad82cEric Christopher : ID(I), Language(L), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) { 38161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1); 39161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 40161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 41161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// ~CompileUnit - Destructor for compile unit. 42161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::~CompileUnit() { 43161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j) 44161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlocks[j]->~DIEBlock(); 45161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 46161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 47161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug 48161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// information entry. 49161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIEEntry *CompileUnit::createDIEEntry(DIE *Entry) { 50161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry); 51161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return Value; 52161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 53161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 54161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addUInt - Add an unsigned integer attribute data and value. 55161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 56161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addUInt(DIE *Die, unsigned Attribute, 57161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Form, uint64_t Integer) { 58161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Form) Form = DIEInteger::BestForm(false, Integer); 59161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEValue *Value = Integer == 1 ? 60161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer); 61161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Die->addValue(Attribute, Form, Value); 62161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 63161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 64161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSInt - Add an signed integer attribute data and value. 65161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 66161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSInt(DIE *Die, unsigned Attribute, 67161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Form, int64_t Integer) { 68161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Form) Form = DIEInteger::BestForm(true, Integer); 69161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer); 70161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Die->addValue(Attribute, Form, Value); 71161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 72161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 736a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// addString - Add a string attribute data and value. We always emit a 746a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// reference to the string pool instead of immediate strings so that DIEs have 756a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// more predictable sizes. 76390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewyckyvoid CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) { 776a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky MCSymbol *Symb = DD->getStringPoolEntry(String); 786a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky DIEValue *Value; 796a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky if (Asm->needsRelocationsForDwarfStringPool()) 806a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky Value = new (DIEValueAllocator) DIELabel(Symb); 816a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky else { 826a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky MCSymbol *StringPool = DD->getStringPool(); 836a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool); 84390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky } 856a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky Die->addValue(Attribute, dwarf::DW_FORM_strp, Value); 86161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 87161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 88161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addLabel - Add a Dwarf label attribute data and value. 89161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 90161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form, 91161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel const MCSymbol *Label) { 92161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); 93161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Die->addValue(Attribute, Form, Value); 94161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 95161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 96161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDelta - Add a label delta attribute data and value. 97161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 98161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form, 99161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel const MCSymbol *Hi, const MCSymbol *Lo) { 100161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo); 101161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Die->addValue(Attribute, Form, Value); 102161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 103161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 104161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDIEEntry - Add a DIE attribute data and value. 105161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 106161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form, 107161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *Entry) { 108161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Die->addValue(Attribute, Form, createDIEEntry(Entry)); 109161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 110161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 111161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlock - Add block data. 112161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 113161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form, 114161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *Block) { 115161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Block->ComputeSize(Asm); 116161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on. 117161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Die->addValue(Attribute, Block->BestForm(), Block); 118161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 119161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 120161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 121161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 122161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIVariable V) { 123161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Verify variable. 124161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!V.Verify()) 125161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 126161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 127161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Line = V.getLineNumber(); 128161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Line == 0) 129161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 130161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(), 131161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel V.getContext().getDirectory()); 132161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel assert(FileID && "Invalid file id"); 133161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 134161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 135161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 136161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 137161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 138161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 139161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) { 140161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Verify global variable. 141161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!G.Verify()) 142161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 143161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 144161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Line = G.getLineNumber(); 145161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Line == 0) 146161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 147746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky unsigned FileID = DD->GetOrCreateSourceID(G.getFilename(), G.getDirectory()); 148161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel assert(FileID && "Invalid file id"); 149161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 150161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 151161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 152161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 153161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 154161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 155161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) { 156161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Verify subprogram. 157161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!SP.Verify()) 158161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 159161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1602125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher // If the line number is 0, don't add it. 161161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Line = SP.getLineNumber(); 1622125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher if (Line == 0) 163161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 1642125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher 165746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(), 166746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky SP.getDirectory()); 167161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel assert(FileID && "Invalid file id"); 168161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 169161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 170161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 171161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 172161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 173161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 174161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIType Ty) { 175161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Verify type. 176161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Ty.Verify()) 177161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 178161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 179161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Line = Ty.getLineNumber(); 1802125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher if (Line == 0) 181161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 182746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(), 183746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky Ty.getDirectory()); 184161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel assert(FileID && "Invalid file id"); 185161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 186161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 187161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 188161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 189161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 190161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 191b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christophervoid CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) { 192b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher // Verify type. 193b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher if (!Ty.Verify()) 194b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return; 195b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher 196b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher unsigned Line = Ty.getLineNumber(); 197b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher if (Line == 0) 198b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return; 199b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher DIFile File = Ty.getFile(); 200b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher unsigned FileID = DD->GetOrCreateSourceID(File.getFilename(), 201b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher File.getDirectory()); 202b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher assert(FileID && "Invalid file id"); 203b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 204b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 205b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher} 206b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher 207b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// addSourceLine - Add location information to specified debug information 208b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// entry. 209161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) { 210161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Verify namespace. 211161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!NS.Verify()) 212161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 213161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 214161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Line = NS.getLineNumber(); 215161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Line == 0) 216161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 217161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel StringRef FN = NS.getFilename(); 218161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 219161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory()); 220161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel assert(FileID && "Invalid file id"); 221161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 222161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 223161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 224161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 225e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel/// addVariableAddress - Add DW_AT_location attribute for a 226e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel/// DbgVariable based on provided MachineLocation. 227e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patelvoid CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die, 228e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel MachineLocation Location) { 229161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (DV->variableHasComplexAddress()) 230161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addComplexAddress(DV, Die, dwarf::DW_AT_location, Location); 231161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else if (DV->isBlockByrefVariable()) 232161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location); 233161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else 234161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addAddress(Die, dwarf::DW_AT_location, Location); 235161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 236161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 237116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOp - Add register operand. 238116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) { 239116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 240116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel unsigned DWReg = RI->getDwarfRegNum(Reg, false); 241116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel if (DWReg < 32) 242116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg); 243116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel else { 244116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx); 245116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg); 246116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel } 247116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel} 248116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel 249116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOffset - Add register offset. 250116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg, 251116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel int64_t Offset) { 252116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 253116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel unsigned DWReg = RI->getDwarfRegNum(Reg, false); 254116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 255116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel if (Reg == TRI->getFrameRegister(*Asm->MF)) 256116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel // If variable offset is based in frame register then use fbreg. 257116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg); 258116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel else if (DWReg < 32) 259116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg); 260116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel else { 261116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx); 262116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg); 263116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel } 264116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset); 265116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel} 266116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel 267116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addAddress - Add an address attribute to a die based on the location 268116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// provided. 269116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addAddress(DIE *Die, unsigned Attribute, 270116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel const MachineLocation &Location) { 271116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 272116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel 273116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel if (Location.isReg()) 274116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addRegisterOp(Block, Location.getReg()); 275116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel else 276116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addRegisterOffset(Block, Location.getReg(), Location.getOffset()); 277116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel 278116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel // Now attach the location information to the DIE. 279116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addBlock(Die, Attribute, 0, Block); 280116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel} 281116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel 282161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addComplexAddress - Start with the address based on the location provided, 283161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// and generate the DWARF information necessary to find the actual variable 284161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given the extra address information encoded in the DIVariable, starting from 285161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// the starting location. Add the DWARF information to the die. 286161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 287161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die, 288161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Attribute, 289161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel const MachineLocation &Location) { 290161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 291c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel unsigned N = DV->getNumAddrElements(); 292c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel unsigned i = 0; 293c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel if (Location.isReg()) { 294c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) { 295c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel // If first address element is OpPlus then emit 296c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel // DW_OP_breg + Offset instead of DW_OP_reg + Offset. 297c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1)); 298c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel i = 2; 299c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel } else 300c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel addRegisterOp(Block, Location.getReg()); 301c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel } 302116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel else 303116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel addRegisterOffset(Block, Location.getReg(), Location.getOffset()); 304161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 305c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel for (;i < N; ++i) { 306161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t Element = DV->getAddrElement(i); 307161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Element == DIBuilder::OpPlus) { 308161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 309161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i)); 310161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } else if (Element == DIBuilder::OpDeref) { 311161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 312161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } else llvm_unreachable("unknown DIBuilder Opcode"); 313161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 314161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 315161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Now attach the location information to the DIE. 316161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addBlock(Die, Attribute, 0, Block); 317161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 318161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 319161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/* Byref variables, in Blocks, are declared by the programmer as "SomeType 320161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel VarName;", but the compiler creates a __Block_byref_x_VarName struct, and 321161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel gives the variable VarName either the struct, or a pointer to the struct, as 322161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel its type. This is necessary for various behind-the-scenes things the 323161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel compiler needs to do with by-reference variables in Blocks. 324161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 325161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel However, as far as the original *programmer* is concerned, the variable 326161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel should still have type 'SomeType', as originally declared. 327161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 328161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel The function getBlockByrefType dives into the __Block_byref_x_VarName 329161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct to find the original type of the variable, which is then assigned to 330161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel the variable's Debug Information Entry as its real type. So far, so good. 331161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel However now the debugger will expect the variable VarName to have the type 332161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel SomeType. So we need the location attribute for the variable to be an 333161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel expression that explains to the debugger how to navigate through the 334161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel pointers and struct to find the actual variable of type SomeType. 335161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 336161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel The following function does just that. We start by getting 337161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel the "normal" location for the variable. This will be the location 338161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel of either the struct __Block_byref_x_VarName or the pointer to the 339161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct __Block_byref_x_VarName. 340161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 341161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel The struct will look something like: 342161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 343161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct __Block_byref_x_VarName { 344161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ... <various fields> 345161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct __Block_byref_x_VarName *forwarding; 346161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ... <various other fields> 347161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel SomeType VarName; 348161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ... <maybe more fields> 349161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel }; 350161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 351161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel If we are given the struct directly (as our starting point) we 352161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel need to tell the debugger to: 353161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 354161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1). Add the offset of the forwarding field. 355161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 356161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 2). Follow that pointer to get the real __Block_byref_x_VarName 357161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct to use (the real one may have been copied onto the heap). 358161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 359161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 3). Add the offset for the field VarName, to find the actual variable. 360161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 361161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel If we started with a pointer to the struct, then we need to 362161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dereference that pointer first, before the other steps. 363161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Translating this into DWARF ops, we will need to append the following 364161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel to the current location description for the variable: 365161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 366161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DW_OP_deref -- optional, if we start with a pointer 367161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DW_OP_plus_uconst <forward_fld_offset> 368161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DW_OP_deref 369161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DW_OP_plus_uconst <varName_fld_offset> 370161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 371161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel That is what this function does. */ 372161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 373161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlockByrefAddress - Start with the address based on the location 374161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// provided, and generate the DWARF information necessary to find the 375161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// actual Block variable (navigating the Block struct) based on the 376161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// starting location. Add the DWARF information to the die. For 377161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// more information, read large comment just above here. 378161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 379161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die, 380161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Attribute, 381161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel const MachineLocation &Location) { 382161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIType Ty = DV->getType(); 383161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIType TmpTy = Ty; 384161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Tag = Ty.getTag(); 385161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel bool isPointer = false; 386161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 387161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel StringRef varName = DV->getName(); 388161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 389161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Tag == dwarf::DW_TAG_pointer_type) { 390161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDerivedType DTy = DIDerivedType(Ty); 391161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel TmpTy = DTy.getTypeDerivedFrom(); 392161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel isPointer = true; 393161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 394161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 395161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DICompositeType blockStruct = DICompositeType(TmpTy); 396161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 397161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Find the __forwarding field and the variable field in the __Block_byref 398161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // struct. 399161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIArray Fields = blockStruct.getTypeArray(); 400161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor varField = DIDescriptor(); 401161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor forwardingField = DIDescriptor(); 402161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 403161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) { 404161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor Element = Fields.getElement(i); 405161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDerivedType DT = DIDerivedType(Element); 406161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel StringRef fieldName = DT.getName(); 407161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (fieldName == "__forwarding") 408161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel forwardingField = Element; 409161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else if (fieldName == varName) 410161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel varField = Element; 411161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 412161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 413161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get the offsets for the forwarding field and the variable field. 414161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned forwardingFieldOffset = 415161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDerivedType(forwardingField).getOffsetInBits() >> 3; 416161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned varFieldOffset = 417161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDerivedType(varField).getOffsetInBits() >> 3; 418161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 419161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Decode the original location, and use that as the start of the byref 420161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // variable's location. 421161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 422161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); 423161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 424161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 425161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Location.isReg()) { 426161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Reg < 32) 427161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg); 428161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else { 429161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx); 430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_udata, Reg); 431161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 432161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } else { 433161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Reg < 32) 434161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg); 435161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else { 436161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx); 437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_udata, Reg); 438161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 440161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset()); 441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // If we started with a pointer to the __Block_byref... struct, then 444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // the first thing we need to do is dereference the pointer (DW_OP_deref). 445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (isPointer) 446161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 447161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Next add the offset for the '__forwarding' field: 449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in 450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // adding the offset if it's 0. 451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (forwardingFieldOffset > 0) { 452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset); 454161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 455161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 456161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Now dereference the __forwarding field to get to the real __Block_byref 457161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // struct: DW_OP_deref. 458161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Now that we've got the real __Block_byref... struct, add the offset 461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // for the variable's field to get to the location of the actual variable: 462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0. 463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (varFieldOffset > 0) { 464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset); 466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Now attach the location information to the DIE. 469161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addBlock(Die, Attribute, 0, Block); 470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 4724ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel/// isTypeSigned - Return true if the type is signed. 4734ec14b0dee433a4f134d832e326a20839b1f777eDevang Patelstatic bool isTypeSigned(DIType Ty, int *SizeInBits) { 4744ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel if (Ty.isDerivedType()) 4754ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits); 4764ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel if (Ty.isBasicType()) 4774ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed 4784ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) { 4794ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel *SizeInBits = Ty.getSizeInBits(); 4804ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel return true; 4814ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel } 4824ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel return false; 4834ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel} 4844ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel 485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE. 486b58128e2b2375173aafb07905bd53014d622e4baDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO, 487b58128e2b2375173aafb07905bd53014d622e4baDevang Patel DIType Ty) { 488746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky assert(MO.isImm() && "Invalid machine operand!"); 489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 4904ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel int SizeInBits = -1; 4914ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel bool SignedConstant = isTypeSigned(Ty, &SizeInBits); 4924ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata; 4934ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel switch (SizeInBits) { 4944ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel case 8: Form = dwarf::DW_FORM_data1; break; 4954ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel case 16: Form = dwarf::DW_FORM_data2; break; 4964ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel case 32: Form = dwarf::DW_FORM_data4; break; 4974ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel case 64: Form = dwarf::DW_FORM_data8; break; 498045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel default: break; 499045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel } 5004ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel SignedConstant ? addSInt(Block, 0, Form, MO.getImm()) 5014ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel : addUInt(Block, 0, Form, MO.getImm()); 50272f0d9cdefa3086715e1e2547a9843321690b4d9Devang Patel 503161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return true; 505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantFPValue - Add constant value entry in variable DIE. 508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelbool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) { 509390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky assert (MO.isFPImm() && "Invalid machine operand!"); 510161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 511161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel APFloat FPImm = MO.getFPImm()->getValueAPF(); 512161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 513161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get the raw data form of the floating point. 514161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel const APInt FltVal = FPImm.bitcastToAPInt(); 515161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel const char *FltPtr = (const char*)FltVal.getRawData(); 516161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 517161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte. 518161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel bool LittleEndian = Asm->getTargetData().isLittleEndian(); 519161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int Incr = (LittleEndian ? 1 : -1); 520161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int Start = (LittleEndian ? 0 : NumBytes - 1); 521161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int Stop = (LittleEndian ? NumBytes : -1); 522161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 523161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Output the constant to DWARF one byte at a time. 524161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (; Start != Stop; Start += Incr) 525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, 526161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel (unsigned char)0xFF & FltPtr[Start]); 527161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return true; 530161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 531161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE. 5338594d429e02c688d428036f8563f09572da3fbffDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI, 534161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel bool Unsigned) { 535d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel unsigned CIBitWidth = CI->getBitWidth(); 536d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel if (CIBitWidth <= 64) { 537d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel unsigned form = 0; 538d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel switch (CIBitWidth) { 539d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel case 8: form = dwarf::DW_FORM_data1; break; 540d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel case 16: form = dwarf::DW_FORM_data2; break; 541d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel case 32: form = dwarf::DW_FORM_data4; break; 542d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel case 64: form = dwarf::DW_FORM_data8; break; 543d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel default: 544d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata; 545d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel } 546161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Unsigned) 547d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue()); 548161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else 549d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue()); 550161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return true; 551161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 552161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 553161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 554161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 555161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get the raw data form of the large APInt. 556161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel const APInt Val = CI->getValue(); 557c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi const uint64_t *Ptr64 = Val.getRawData(); 558161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 559161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte. 560161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel bool LittleEndian = Asm->getTargetData().isLittleEndian(); 561161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 562161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Output the constant to DWARF one byte at a time. 563c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi for (int i = 0; i < NumBytes; i++) { 564c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi uint8_t c; 565c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi if (LittleEndian) 566c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi c = Ptr64[i / 8] >> (8 * (i & 7)); 567c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi else 568c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7)); 569c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi addUInt(Block, 0, dwarf::DW_FORM_data1, c); 570c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi } 571161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 572161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 573161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return true; 574161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 575161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 576161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addTemplateParams - Add template parameters in buffer. 577161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) { 578161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add template parameters. 579161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) { 580161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor Element = TParams.getElement(i); 581161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Element.isTemplateTypeParameter()) 582161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.addChild(getOrCreateTemplateTypeParameterDIE( 583161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DITemplateTypeParameter(Element))); 584161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else if (Element.isTemplateValueParameter()) 585161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.addChild(getOrCreateTemplateValueParameterDIE( 586161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DITemplateValueParameter(Element))); 587161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 588161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 589746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky 590161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addToContextOwner - Add Die into the list of its context owner's children. 591161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) { 592161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Context.isType()) { 593161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context)); 594161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ContextDIE->addChild(Die); 595161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } else if (Context.isNameSpace()) { 596161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context)); 597161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ContextDIE->addChild(Die); 598161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } else if (Context.isSubprogram()) { 599dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context)); 600161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ContextDIE->addChild(Die); 601161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } else if (DIE *ContextDIE = getDIE(Context)) 602161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ContextDIE->addChild(Die); 603161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else 604161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addDie(Die); 605161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 606161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 607161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 608161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given DIType. 60994c7ddb6f52a5200983fed0ce74dc602a7737879Devang PatelDIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) { 61094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIType Ty(TyNode); 61194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel if (!Ty.Verify()) 61294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel return NULL; 613161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *TyDIE = getDIE(Ty); 614161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (TyDIE) 615161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return TyDIE; 616161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 617161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Create new type. 618161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel TyDIE = new DIE(dwarf::DW_TAG_base_type); 619161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel insertDIE(Ty, TyDIE); 620161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Ty.isBasicType()) 621161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel constructTypeDIE(*TyDIE, DIBasicType(Ty)); 622161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else if (Ty.isCompositeType()) 623161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel constructTypeDIE(*TyDIE, DICompositeType(Ty)); 624161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else { 625161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel assert(Ty.isDerivedType() && "Unknown kind of DIType"); 626161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel constructTypeDIE(*TyDIE, DIDerivedType(Ty)); 627161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 6281b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher // If this is a named finished type then include it in the list of types 6291b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher // for the accelerator tables. 630c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher if (!Ty.getName().empty() && !Ty.isForwardDecl()) { 631c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher bool IsImplementation = 0; 632c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher if (Ty.isCompositeType()) { 633c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher DICompositeType CT(Ty); 634e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher // A runtime language of 0 actually means C/C++ and that any 635e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher // non-negative value is some version of Objective-C/C++. 636c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher IsImplementation = (CT.getRunTimeLang() == 0) || 637e2dc9336d15ad3ca4f38d296d17f6682829b80b4Eric Christopher CT.isObjcClassComplete(); 638c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher } 639e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher unsigned Flags = IsImplementation ? 640e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher DwarfAccelTable::eTypeFlagClassIsImplementation : 0; 641e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags)); 642c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher } 6431b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher 644161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addToContextOwner(TyDIE, Ty.getContext()); 645161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return TyDIE; 646161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 647161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 648161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addType - Add a new type attribute to the specified entity. 649663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christophervoid CompileUnit::addType(DIE *Entity, DIType Ty, 650663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher unsigned Attribute) { 651161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Ty.Verify()) 652161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 653161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 654161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Check for pre-existence. 655161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEEntry *Entry = getDIEEntry(Ty); 656161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // If it exists then use the existing value. 657161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Entry) { 658663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry); 659161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 660161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 661161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 662161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Construct type. 663161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *Buffer = getOrCreateTypeDIE(Ty); 664161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 665161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Set up proxy. 666161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Entry = createDIEEntry(Buffer); 667161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel insertDIEEntry(Ty, Entry); 668663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry); 669e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel 670e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel // If this is a complete composite type then include it in the 671e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel // list of global types. 672c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel addGlobalType(Ty); 67366658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel} 67466658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel 67566658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel/// addGlobalType - Add a new global type to the compile unit. 67666658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel/// 677c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patelvoid CompileUnit::addGlobalType(DIType Ty) { 678e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel DIDescriptor Context = Ty.getContext(); 679e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl() 68094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel && (!Context || Context.isCompileUnit() || Context.isFile() 68194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel || Context.isNameSpace())) 682c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel if (DIEEntry *Entry = getDIEEntry(Ty)) 683c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel GlobalTypes[Ty.getName()] = Entry->getEntry(); 684161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 685161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 68631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// addPubTypes - Add type for pubtypes section. 68731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patelvoid CompileUnit::addPubTypes(DISubprogram SP) { 68831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel DICompositeType SPTy = SP.getType(); 68931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel unsigned SPTag = SPTy.getTag(); 69031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel if (SPTag != dwarf::DW_TAG_subroutine_type) 69131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel return; 69231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel 69331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel DIArray Args = SPTy.getTypeArray(); 69431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) { 69531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel DIType ATy(Args.getElement(i)); 69631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel if (!ATy.Verify()) 69731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel continue; 698c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel addGlobalType(ATy); 69931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel } 70031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel} 70131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel 702161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct basic type die from DIBasicType. 703161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) { 704161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get core information. 705161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel StringRef Name = BTy.getName(); 706161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add name if not anonymous or intermediate type. 707161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Name.empty()) 708390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(&Buffer, dwarf::DW_AT_name, Name); 709734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel 710734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) { 711734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel Buffer.setTag(dwarf::DW_TAG_unspecified_type); 712734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel // Unspecified types has only name, nothing else. 713734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel return; 714734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel } 715734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel 716734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel Buffer.setTag(dwarf::DW_TAG_base_type); 717746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 71830d409ca097e35c51964c9dac642804e5e495906Devang Patel BTy.getEncoding()); 719734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel 720161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t Size = BTy.getSizeInBits() >> 3; 721161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 722161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 723161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 724161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct derived type die from DIDerivedType. 725161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) { 726161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get core information. 727161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel StringRef Name = DTy.getName(); 728161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t Size = DTy.getSizeInBits() >> 3; 729161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Tag = DTy.getTag(); 730161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 731161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // FIXME - Workaround for templates. 732161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type; 733161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 734161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.setTag(Tag); 735161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 736161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Map to main type, void will not have a type. 737161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIType FromTy = DTy.getTypeDerivedFrom(); 738161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addType(&Buffer, FromTy); 739161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 740161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add name if not anonymous or intermediate type. 741161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Name.empty()) 742390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(&Buffer, dwarf::DW_AT_name, Name); 743161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 744161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add size if non-zero (derived types might be zero-sized.) 74535f225aa2c04ca2420161cca812cb3eb611bde51Eric Christopher if (Size && Tag != dwarf::DW_TAG_pointer_type) 746161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 747161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 748161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add source line info if available and TyDesc is not a forward declaration. 749161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!DTy.isForwardDecl()) 750161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addSourceLine(&Buffer, DTy); 751161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 752161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 753161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct type DIE from DICompositeType. 754161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { 755161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get core information. 756161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel StringRef Name = CTy.getName(); 757161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 758161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t Size = CTy.getSizeInBits() >> 3; 759161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned Tag = CTy.getTag(); 760161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.setTag(Tag); 761161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 762161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel switch (Tag) { 763161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_vector_type: 764161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_array_type: 765161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel constructArrayTypeDIE(Buffer, &CTy); 766161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel break; 767161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_enumeration_type: { 768161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIArray Elements = CTy.getTypeArray(); 769161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 770161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add enumerators to enumeration type. 771161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 772161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *ElemDie = NULL; 773161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor Enum(Elements.getElement(i)); 774161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Enum.isEnumerator()) { 775161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ElemDie = constructEnumTypeDIE(DIEnumerator(Enum)); 776161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.addChild(ElemDie); 777161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 778161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 779161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 780161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel break; 781161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_subroutine_type: { 782161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add return type. 783161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIArray Elements = CTy.getTypeArray(); 784161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor RTy = Elements.getElement(0); 785161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addType(&Buffer, DIType(RTy)); 786161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 787161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel bool isPrototyped = true; 788161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add arguments. 789161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) { 790161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor Ty = Elements.getElement(i); 791161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Ty.isUnspecifiedParameter()) { 792161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters); 793161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.addChild(Arg); 794161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel isPrototyped = false; 795161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } else { 796161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 797161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addType(Arg, DIType(Ty)); 798161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.addChild(Arg); 799161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 800161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 8018b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher // Add prototype flag if we're dealing with a C language and the 8028b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher // function has been prototyped. 8038b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher if (isPrototyped && 8048b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher (Language == dwarf::DW_LANG_C89 || 8058b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher Language == dwarf::DW_LANG_C99 || 8068b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher Language == dwarf::DW_LANG_ObjC)) 807161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1); 808161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 809161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel break; 810161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_structure_type: 811161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_union_type: 812161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_class_type: { 813161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add elements to structure type. 814161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIArray Elements = CTy.getTypeArray(); 815161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 816161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // A forward struct declared type may not have elements available. 817161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel unsigned N = Elements.getNumElements(); 818161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (N == 0) 819161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel break; 820161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 821161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add elements to structure type. 822161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (unsigned i = 0; i < N; ++i) { 823161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor Element = Elements.getElement(i); 824161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *ElemDie = NULL; 825161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Element.isSubprogram()) { 826161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DISubprogram SP(Element); 827dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element)); 828161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (SP.isProtected()) 82913aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 830161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ACCESS_protected); 831161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else if (SP.isPrivate()) 83213aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 833161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ACCESS_private); 834161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else 83513aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 836161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ACCESS_public); 837161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (SP.isExplicit()) 838161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1); 839161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 840161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else if (Element.isVariable()) { 841161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIVariable DV(Element); 842161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ElemDie = new DIE(dwarf::DW_TAG_variable); 843390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(ElemDie, dwarf::DW_AT_name, DV.getName()); 844161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addType(ElemDie, DV.getType()); 845161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 846161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 847161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addSourceLine(ElemDie, DV); 848663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher } else if (Element.isDerivedType()) { 849663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher DIDerivedType DDTy(Element); 850663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher if (DDTy.getTag() == dwarf::DW_TAG_friend) { 851663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher ElemDie = new DIE(dwarf::DW_TAG_friend); 852663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend); 853663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher } else 854663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher ElemDie = createMemberDIE(DIDerivedType(Element)); 855663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher } else if (Element.isObjCProperty()) { 85630d409ca097e35c51964c9dac642804e5e495906Devang Patel DIObjCProperty Property(Element); 85730d409ca097e35c51964c9dac642804e5e495906Devang Patel ElemDie = new DIE(Property.getTag()); 85830d409ca097e35c51964c9dac642804e5e495906Devang Patel StringRef PropertyName = Property.getObjCPropertyName(); 85930d409ca097e35c51964c9dac642804e5e495906Devang Patel addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName); 860b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher addType(ElemDie, Property.getType()); 861b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher addSourceLine(ElemDie, Property); 86230d409ca097e35c51964c9dac642804e5e495906Devang Patel StringRef GetterName = Property.getObjCPropertyGetterName(); 86330d409ca097e35c51964c9dac642804e5e495906Devang Patel if (!GetterName.empty()) 86430d409ca097e35c51964c9dac642804e5e495906Devang Patel addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName); 86530d409ca097e35c51964c9dac642804e5e495906Devang Patel StringRef SetterName = Property.getObjCPropertySetterName(); 86630d409ca097e35c51964c9dac642804e5e495906Devang Patel if (!SetterName.empty()) 86730d409ca097e35c51964c9dac642804e5e495906Devang Patel addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName); 86830d409ca097e35c51964c9dac642804e5e495906Devang Patel unsigned PropertyAttributes = 0; 8699e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel if (Property.isReadOnlyObjCProperty()) 8709e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly; 8719e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel if (Property.isReadWriteObjCProperty()) 8729e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite; 8739e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel if (Property.isAssignObjCProperty()) 8749e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign; 8759e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel if (Property.isRetainObjCProperty()) 8769e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain; 8779e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel if (Property.isCopyObjCProperty()) 8789e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy; 8799e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel if (Property.isNonAtomicObjCProperty()) 8809e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic; 8819e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel if (PropertyAttributes) 8829e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0, 8839e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel PropertyAttributes); 8846588abf377b7381274236e651462ec83052f6013Devang Patel 88530d409ca097e35c51964c9dac642804e5e495906Devang Patel DIEEntry *Entry = getDIEEntry(Element); 88630d409ca097e35c51964c9dac642804e5e495906Devang Patel if (!Entry) { 88730d409ca097e35c51964c9dac642804e5e495906Devang Patel Entry = createDIEEntry(ElemDie); 88830d409ca097e35c51964c9dac642804e5e495906Devang Patel insertDIEEntry(Element, Entry); 88930d409ca097e35c51964c9dac642804e5e495906Devang Patel } 8909e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel } else 891161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel continue; 892161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.addChild(ElemDie); 893161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 894161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 895161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (CTy.isAppleBlockExtension()) 896161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1); 897161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 898161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DICompositeType ContainingType = CTy.getContainingType(); 899161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (DIDescriptor(ContainingType).isCompositeType()) 900161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 901161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel getOrCreateTypeDIE(DIType(ContainingType))); 902161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else { 903161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor Context = CTy.getContext(); 904161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addToContextOwner(&Buffer, Context); 905161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 906161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 907201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel if (CTy.isObjcClassComplete()) 908201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type, 909b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel dwarf::DW_FORM_flag, 1); 910b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel 9111a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher // Add template parameters to a class, structure or union types. 9121a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher // FIXME: The support isn't in the metadata for this yet. 9131a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher if (Tag == dwarf::DW_TAG_class_type || 9141a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher Tag == dwarf::DW_TAG_structure_type || 9151a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher Tag == dwarf::DW_TAG_union_type) 916161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addTemplateParams(Buffer, CTy.getTemplateParams()); 917161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 918161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel break; 919161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 920161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel default: 921161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel break; 922161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 923161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 924161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add name if not anonymous or intermediate type. 925161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Name.empty()) 926390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(&Buffer, dwarf::DW_AT_name, Name); 927161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 928161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type 929161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) 930746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky { 931161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add size if non-zero (derived types might be zero-sized.) 932161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Size) 933161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 934161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else { 935161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add zero size if it is not a forward declaration. 936161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (CTy.isForwardDecl()) 937161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 938161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else 939161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0); 940161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 941161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 942161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add source line info if available. 943161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!CTy.isForwardDecl()) 944161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addSourceLine(&Buffer, CTy); 9458938895a8338e6084eb12a2bb4bf044928436173Eric Christopher 9468938895a8338e6084eb12a2bb4bf044928436173Eric Christopher // No harm in adding the runtime language to the declaration. 9478938895a8338e6084eb12a2bb4bf044928436173Eric Christopher unsigned RLang = CTy.getRunTimeLang(); 9488938895a8338e6084eb12a2bb4bf044928436173Eric Christopher if (RLang) 9498938895a8338e6084eb12a2bb4bf044928436173Eric Christopher addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, 9508938895a8338e6084eb12a2bb4bf044928436173Eric Christopher dwarf::DW_FORM_data1, RLang); 951161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 952161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 953161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 954161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE 955161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateTypeParameter. 956161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE * 957161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) { 958161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *ParamDIE = getDIE(TP); 959161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (ParamDIE) 960161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return ParamDIE; 961161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 962161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter); 963161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addType(ParamDIE, TP.getType()); 964390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(ParamDIE, dwarf::DW_AT_name, TP.getName()); 965161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return ParamDIE; 966161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 967161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 968161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE 969161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateValueParameter. 970161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE * 971161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) { 972161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *ParamDIE = getDIE(TPV); 973161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (ParamDIE) 974161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return ParamDIE; 975161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 976161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter); 977161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addType(ParamDIE, TPV.getType()); 978161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!TPV.getName().empty()) 979390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(ParamDIE, dwarf::DW_AT_name, TPV.getName()); 980161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata, 981161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel TPV.getValue()); 982161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return ParamDIE; 983161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 984161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 98531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// getOrCreateNameSpace - Create a DIE for DINameSpace. 98631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang PatelDIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) { 98731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel DIE *NDie = getDIE(NS); 98831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel if (NDie) 98931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel return NDie; 99031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel NDie = new DIE(dwarf::DW_TAG_namespace); 99131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel insertDIE(NS, NDie); 99209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher if (!NS.getName().empty()) { 993390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(NDie, dwarf::DW_AT_name, NS.getName()); 99409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher addAccelNamespace(NS.getName(), NDie); 99509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher } else 99609ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher addAccelNamespace("(anonymous namespace)", NDie); 99731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel addSourceLine(NDie, NS); 99831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel addToContextOwner(NDie, NS.getContext()); 99931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel return NDie; 100031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel} 100131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel 1002dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getRealLinkageName - If special LLVM prefix that is used to inform the asm 1003dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// printer to not emit usual symbol prefix before the symbol name is used then 1004dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// return linkage name after skipping this special LLVM prefix. 1005dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelstatic StringRef getRealLinkageName(StringRef LinkageName) { 1006dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel char One = '\1'; 1007dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (LinkageName.startswith(StringRef(&One, 1))) 1008dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel return LinkageName.substr(1); 1009dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel return LinkageName; 1010dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel} 1011dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1012dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getOrCreateSubprogramDIE - Create new DIE using SP. 1013dbc64af76d769596903485668a1dfc2d6640c4fbDevang PatelDIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) { 1014dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIE *SPDie = getDIE(SP); 1015dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (SPDie) 1016dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel return SPDie; 1017dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 101801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola DISubprogram SPDecl = SP.getFunctionDeclaration(); 101901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola DIE *DeclDie = NULL; 102001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola if (SPDecl.isSubprogram()) { 102101b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola DeclDie = getOrCreateSubprogramDIE(SPDecl); 102201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola } 102301b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola 1024dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel SPDie = new DIE(dwarf::DW_TAG_subprogram); 1025dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1026dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // DW_TAG_inlined_subroutine may refer to this DIE. 1027dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel insertDIE(SP, SPDie); 1028dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1029dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // Add to context owner. 1030dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addToContextOwner(SPDie, SP.getContext()); 1031dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1032dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // Add function template parameters. 1033dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addTemplateParams(*SPDie, SP.getTemplateParams()); 1034dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1035e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher // Unfortunately this code needs to stay here instead of below the 1036e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher // AT_specification code in order to work around a bug in older 1037e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher // gdbs that requires the linkage name to resolve multiple template 1038e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher // functions. 10398d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher StringRef LinkageName = SP.getLinkageName(); 10408d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher if (!LinkageName.empty()) 10418d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, 10428d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher getRealLinkageName(LinkageName)); 10438d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher 1044dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // If this DIE is going to refer declaration info using AT_specification 1045dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // then there is no need to add other attributes. 104601b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola if (DeclDie) { 104701b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola // Refer function declaration directly. 104801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 104901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola DeclDie); 105001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola 1051dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel return SPDie; 105201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola } 1053dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1054dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // Constructors and operators for anonymous aggregates do not have names. 1055dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (!SP.getName().empty()) 1056390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(SPDie, dwarf::DW_AT_name, SP.getName()); 1057dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1058dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addSourceLine(SPDie, SP); 1059dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 10608b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher // Add the prototype if we have a prototype and we have a C like 10618b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher // language. 10628b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher if (SP.isPrototyped() && 10638b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher (Language == dwarf::DW_LANG_C89 || 10648b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher Language == dwarf::DW_LANG_C99 || 10658b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher Language == dwarf::DW_LANG_ObjC)) 1066dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1); 1067dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1068dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // Add Return Type. 1069dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DICompositeType SPTy = SP.getType(); 1070dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIArray Args = SPTy.getTypeArray(); 1071dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel unsigned SPTag = SPTy.getTag(); 1072dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1073dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type) 1074dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addType(SPDie, SPTy); 1075dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel else 1076dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addType(SPDie, DIType(Args.getElement(0))); 1077dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1078dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel unsigned VK = SP.getVirtuality(); 1079dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (VK) { 1080798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK); 1081dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIEBlock *Block = getDIEBlock(); 1082dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1083dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex()); 1084dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block); 1085dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel ContainingTypeMap.insert(std::make_pair(SPDie, 1086dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel SP.getContainingType())); 1087dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel } 1088dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1089dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (!SP.isDefinition()) { 1090dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1091dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1092dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // Add arguments. Do not add arguments for subprogram definition. They will 1093dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // be handled while processing variables. 1094dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DICompositeType SPTy = SP.getType(); 1095dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIArray Args = SPTy.getTypeArray(); 1096dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel unsigned SPTag = SPTy.getTag(); 1097dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1098dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (SPTag == dwarf::DW_TAG_subroutine_type) 1099dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1100dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1101dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIType ATy = DIType(DIType(Args.getElement(i))); 1102dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addType(Arg, ATy); 1103dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (ATy.isArtificial()) 1104dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); 1105dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel SPDie->addChild(Arg); 1106dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel } 1107dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel } 1108dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1109dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (SP.isArtificial()) 1110dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); 1111dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1112dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (!SP.isLocalToUnit()) 1113dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 1114dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1115dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (SP.isOptimized()) 1116dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1); 1117dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1118dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (unsigned isa = Asm->getISAEncoding()) { 1119dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa); 1120dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel } 1121dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1122dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel return SPDie; 1123dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel} 1124dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 11256f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// Return const expression if value is a GEP to access merged global 11266f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// constant. e.g. 11276f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0) 11286f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelstatic const ConstantExpr *getMergedGlobalExpr(const Value *V) { 11296f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V); 11306f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel if (!CE || CE->getNumOperands() != 3 || 11316f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel CE->getOpcode() != Instruction::GetElementPtr) 11326f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel return NULL; 11336f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 11346f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // First operand points to a global struct. 11356f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel Value *Ptr = CE->getOperand(0); 11366f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel if (!isa<GlobalValue>(Ptr) || 11376f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType())) 11386f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel return NULL; 11396f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 11406f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Second operand is zero. 11416f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1)); 11426f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel if (!CI || !CI->isZero()) 11436f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel return NULL; 11446f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 11456f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Third operand is offset. 11466f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel if (!isa<ConstantInt>(CE->getOperand(2))) 11476f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel return NULL; 11486f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 11496f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel return CE; 11506f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel} 11516f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 11526f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel/// createGlobalVariableDIE - create global variable DIE. 11536f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelvoid CompileUnit::createGlobalVariableDIE(const MDNode *N) { 11546f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Check for pre-existence. 115549e2f03849064d9dc26db3865ae419f17daadca6Devang Patel if (getDIE(N)) 11566f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel return; 11576f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 115849e2f03849064d9dc26db3865ae419f17daadca6Devang Patel DIGlobalVariable GV(N); 115928bea08e531452992ff1e25e8584883dfbd4c232Devang Patel if (!GV.Verify()) 116028bea08e531452992ff1e25e8584883dfbd4c232Devang Patel return; 116128bea08e531452992ff1e25e8584883dfbd4c232Devang Patel 11626f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel DIE *VariableDIE = new DIE(GV.getTag()); 116349e2f03849064d9dc26db3865ae419f17daadca6Devang Patel // Add to map. 116449e2f03849064d9dc26db3865ae419f17daadca6Devang Patel insertDIE(N, VariableDIE); 11656f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 11666f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Add name. 1167390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName()); 11686f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel StringRef LinkageName = GV.getLinkageName(); 116949e2f03849064d9dc26db3865ae419f17daadca6Devang Patel bool isGlobalVariable = GV.getGlobal() != NULL; 11706f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel if (!LinkageName.empty() && isGlobalVariable) 1171746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, 1172390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky getRealLinkageName(LinkageName)); 11736f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Add type. 117449e2f03849064d9dc26db3865ae419f17daadca6Devang Patel DIType GTy = GV.getType(); 11756f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addType(VariableDIE, GTy); 11766f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 11776f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Add scoping info. 1178dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher if (!GV.isLocalToUnit()) 11796f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 1180dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher 11816f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Add line number info. 11826f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addSourceLine(VariableDIE, GV); 11836f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Add to context owner. 11846f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel DIDescriptor GVContext = GV.getContext(); 11856f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addToContextOwner(VariableDIE, GVContext); 11866f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Add location. 118709ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher bool addToAccelTable = false; 1188d61c34ba30888c49f4f223422f30b018a41594daEric Christopher DIE *VariableSpecDIE = NULL; 11896f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel if (isGlobalVariable) { 119009ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher addToAccelTable = true; 11916f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 11926f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 11936f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addLabel(Block, 0, dwarf::DW_FORM_udata, 11946f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel Asm->Mang->getSymbol(GV.getGlobal())); 11956f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Do not create specification DIE if context is either compile unit 11966f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // or a subprogram. 11971dd4e56d5565d59e9d40ad9e088a05e06f4b70f8Devang Patel if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() && 11986f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel !GVContext.isFile() && !isSubprogramContext(GVContext)) { 11996f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // Create specification DIE. 1200d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher VariableSpecDIE = new DIE(dwarf::DW_TAG_variable); 12016f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, 12026f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel dwarf::DW_FORM_ref4, VariableDIE); 12036f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block); 12046f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 12056f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 1); 12066f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addDie(VariableSpecDIE); 12076f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel } else { 12086f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); 120909ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher } 12106f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel } else if (const ConstantInt *CI = 12116f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel dyn_cast_or_null<ConstantInt>(GV.getConstant())) 12126f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType()); 12136f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) { 121409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher addToAccelTable = true; 12156f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel // GV is a merged global. 12166f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 12176f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel Value *Ptr = CE->getOperand(0); 12186f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 12196f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addLabel(Block, 0, dwarf::DW_FORM_udata, 12206f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel Asm->Mang->getSymbol(cast<GlobalValue>(Ptr))); 12216f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 12226f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end()); 12236f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addUInt(Block, 0, dwarf::DW_FORM_udata, 12246f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx)); 12256f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 12266f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); 12276f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel } 12286f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 1229d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher if (addToAccelTable) { 1230d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE; 1231d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher addAccelName(GV.getName(), AddrDIE); 123209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher 1233d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher // If the linkage name is different than the name, go ahead and output 1234d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher // that as well into the name table. 1235d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName()) 1236d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher addAccelName(GV.getLinkageName(), AddrDIE); 1237d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher } 123874d8a87f40dd89ec263071c0af4d77104b166f4aEric Christopher 12396f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel return; 12406f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel} 12416f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 1242161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructSubrangeDIE - Construct subrange DIE from DISubrange. 1243161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){ 1244161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type); 1245161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy); 1246ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel uint64_t L = SR.getLo(); 1247ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel uint64_t H = SR.getHi(); 1248161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1249161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // The L value defines the lower bounds which is typically zero for C/C++. The 1250161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // H value is the upper bounds. Values are 64 bit. H - L + 1 is the size 1251161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // of the array. If L > H then do not emit DW_AT_lower_bound and 1252161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // DW_AT_upper_bound attributes. If L is zero and H is also zero then the 1253161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // array has one element and in such case do not emit lower bound. 1254161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1255161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (L > H) { 1256161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.addChild(DW_Subrange); 1257161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 1258161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 1259161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (L) 1260ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L); 1261ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H); 1262161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.addChild(DW_Subrange); 1263161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1264161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1265161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 1266161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructArrayTypeDIE(DIE &Buffer, 1267161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DICompositeType *CTy) { 1268161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Buffer.setTag(dwarf::DW_TAG_array_type); 1269161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (CTy->getTag() == dwarf::DW_TAG_vector_type) 1270161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1); 1271161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1272161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Emit derived type. 1273161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addType(&Buffer, CTy->getTypeDerivedFrom()); 1274161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIArray Elements = CTy->getTypeArray(); 1275161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1276161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get an anonymous type for index type. 1277161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *IdxTy = getIndexTyDie(); 1278161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!IdxTy) { 1279161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Construct an anonymous type for index type. 1280161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel IdxTy = new DIE(dwarf::DW_TAG_base_type); 1281161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t)); 1282161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 1283161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ATE_signed); 1284161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addDie(IdxTy); 1285161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel setIndexTyDie(IdxTy); 1286161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 1287161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1288161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add subranges to array type. 1289161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 1290161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIDescriptor Element = Elements.getElement(i); 1291161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Element.getTag() == dwarf::DW_TAG_subrange_type) 1292161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy); 1293161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 1294161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1295161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1296161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator. 1297161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) { 1298161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator); 1299161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel StringRef Name = ETy.getName(); 1300390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(Enumerator, dwarf::DW_AT_name, Name); 1301161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int64_t Value = ETy.getEnumValue(); 1302161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value); 1303161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return Enumerator; 1304161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1305161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1306dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// constructContainingTypeDIEs - Construct DIEs for types that contain 1307dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// vtables. 1308dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelvoid CompileUnit::constructContainingTypeDIEs() { 1309dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(), 1310dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel CE = ContainingTypeMap.end(); CI != CE; ++CI) { 1311dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIE *SPDie = CI->first; 1312dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel const MDNode *N = CI->second; 1313dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (!N) continue; 1314dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIE *NDie = getDIE(N); 1315dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (!NDie) continue; 1316dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie); 1317dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel } 1318dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel} 1319dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1320d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel/// constructVariableDIE - Construct a DIE for the given DbgVariable. 1321d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang PatelDIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) { 1322d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel StringRef Name = DV->getName(); 1323d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (Name.empty()) 1324d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel return NULL; 1325d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 1326d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel // Translate tag to proper Dwarf tag. 1327d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel unsigned Tag = DV->getTag(); 1328d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 1329d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel // Define variable debug information entry. 1330d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DIE *VariableDie = new DIE(Tag); 1331d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DbgVariable *AbsVar = DV->getAbstractVariable(); 1332d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL; 1333d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (AbsDIE) 1334d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, 1335d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel dwarf::DW_FORM_ref4, AbsDIE); 1336d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel else { 1337390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(VariableDie, dwarf::DW_AT_name, Name); 1338d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addSourceLine(VariableDie, DV->getVariable()); 1339d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addType(VariableDie, DV->getType()); 1340d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } 1341d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 1342d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (DV->isArtificial()) 1343d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addUInt(VariableDie, dwarf::DW_AT_artificial, 1344d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel dwarf::DW_FORM_flag, 1); 1345d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 1346d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (isScopeAbstract) { 1347d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DV->setDIE(VariableDie); 1348d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel return VariableDie; 1349d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } 1350d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 1351d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel // Add variable address. 1352d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 1353d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel unsigned Offset = DV->getDotDebugLocOffset(); 1354d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (Offset != ~0U) { 1355d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addLabel(VariableDie, dwarf::DW_AT_location, 1356d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel dwarf::DW_FORM_data4, 1357d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel Asm->GetTempSymbol("debug_loc", Offset)); 1358d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DV->setDIE(VariableDie); 1359d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel return VariableDie; 1360d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } 1361d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 13628cf5e74a9cc7482901125b810f1e482d24e9404dEric Christopher // Check if variable is described by a DBG_VALUE instruction. 1363d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (const MachineInstr *DVInsn = DV->getMInsn()) { 1364d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel bool updated = false; 1365d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (DVInsn->getNumOperands() == 3) { 1366d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (DVInsn->getOperand(0).isReg()) { 1367d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel const MachineOperand RegOp = DVInsn->getOperand(0); 1368d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 1369d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (DVInsn->getOperand(1).isImm() && 1370d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) { 1371d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel unsigned FrameReg = 0; 1372d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel const TargetFrameLowering *TFI = Asm->TM.getFrameLowering(); 1373d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel int Offset = 1374d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel TFI->getFrameIndexReference(*Asm->MF, 1375d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DVInsn->getOperand(1).getImm(), 1376d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel FrameReg); 1377d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel MachineLocation Location(FrameReg, Offset); 1378d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addVariableAddress(DV, VariableDie, Location); 1379d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 1380d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } else if (RegOp.getReg()) 1381d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addVariableAddress(DV, VariableDie, 1382d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel MachineLocation(RegOp.getReg())); 1383d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel updated = true; 1384d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } 1385d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel else if (DVInsn->getOperand(0).isImm()) 1386d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel updated = 1387d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addConstantValue(VariableDie, DVInsn->getOperand(0), 1388d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DV->getType()); 1389d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel else if (DVInsn->getOperand(0).isFPImm()) 1390d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel updated = 1391d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addConstantFPValue(VariableDie, DVInsn->getOperand(0)); 1392d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel else if (DVInsn->getOperand(0).isCImm()) 1393d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel updated = 1394d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addConstantValue(VariableDie, 1395d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DVInsn->getOperand(0).getCImm(), 1396d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DV->getType().isUnsignedDIType()); 1397d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } else { 1398d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addVariableAddress(DV, VariableDie, 1399d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel Asm->getDebugValueLocation(DVInsn)); 1400d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel updated = true; 1401d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } 1402d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (!updated) { 1403d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel // If variableDie is not updated then DBG_VALUE instruction does not 1404d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel // have valid variable info. 1405d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel delete VariableDie; 1406d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel return NULL; 1407d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } 1408d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DV->setDIE(VariableDie); 1409d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel return VariableDie; 1410d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } else { 1411d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel // .. else use frame index. 1412d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel int FI = DV->getFrameIndex(); 1413d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel if (FI != ~0) { 1414d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel unsigned FrameReg = 0; 1415d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel const TargetFrameLowering *TFI = Asm->TM.getFrameLowering(); 1416d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel int Offset = 1417d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg); 1418d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel MachineLocation Location(FrameReg, Offset); 1419d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel addVariableAddress(DV, VariableDie, Location); 1420d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } 1421d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel } 1422d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 1423d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DV->setDIE(VariableDie); 1424d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel return VariableDie; 1425d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel} 1426d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 1427161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createMemberDIE - Create new member DIE. 1428161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::createMemberDIE(DIDerivedType DT) { 1429161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *MemberDie = new DIE(DT.getTag()); 1430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel StringRef Name = DT.getName(); 1431161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Name.empty()) 1432390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(MemberDie, dwarf::DW_AT_name, Name); 1433161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1434161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addType(MemberDie, DT.getTypeDerivedFrom()); 1435161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1436161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addSourceLine(MemberDie, DT); 1437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1438161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock(); 1439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1440161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t Size = DT.getSizeInBits(); 1442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t FieldSize = DT.getOriginalTypeSize(); 1443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Size != FieldSize) { 1445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Handle bitfield. 1446161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3); 1447161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits()); 1448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t Offset = DT.getOffsetInBits(); 1450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t AlignMask = ~(DT.getAlignInBits() - 1); 1451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t HiMark = (Offset + FieldSize) & AlignMask; 1452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel uint64_t FieldOffset = (HiMark - FieldSize); 1453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Offset -= FieldOffset; 1454161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1455161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Maybe we need to work from the other end. 1456161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Asm->getTargetData().isLittleEndian()) 1457161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Offset = FieldSize - (Offset + Size); 1458161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset); 1459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Here WD_AT_data_member_location points to the anonymous 1461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // field that includes this bit field. 1462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3); 1463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } else 1465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // This is not a bitfield. 1466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3); 1467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (DT.getTag() == dwarf::DW_TAG_inheritance 1469161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel && DT.isVirtual()) { 1470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // For C++, virtual base classes are not at fixed offset. Use following 1472161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // expression to extract appropriate offset from vtable. 1473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // BaseAddr = ObAddr + *((*ObAddr) - Offset) 1474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1475161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock(); 1476161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup); 1477161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1478161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1479161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits()); 1480161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus); 1481161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1482161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1483161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1484161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, 1485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel VBaseLocationDie); 1486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } else 1487161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie); 1488161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (DT.isProtected()) 149013aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1491161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ACCESS_protected); 1492161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else if (DT.isPrivate()) 149313aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1494161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ACCESS_private); 1495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Otherwise C++ member and base classes are considered public. 149694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel else 149713aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ACCESS_public); 1499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (DT.isVirtual()) 1500798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, 1501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_VIRTUALITY_virtual); 1502e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel 1503e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel // Objective-C properties. 15046588abf377b7381274236e651462ec83052f6013Devang Patel if (MDNode *PNode = DT.getObjCProperty()) 15056588abf377b7381274236e651462ec83052f6013Devang Patel if (DIEEntry *PropertyDie = getDIEEntry(PNode)) 15066588abf377b7381274236e651462ec83052f6013Devang Patel MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4, 15076588abf377b7381274236e651462ec83052f6013Devang Patel PropertyDie); 15086588abf377b7381274236e651462ec83052f6013Devang Patel 15099e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel // This is only for backward compatibility. 1510e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel StringRef PropertyName = DT.getObjCPropertyName(); 1511e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (!PropertyName.empty()) { 1512390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName); 1513e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel StringRef GetterName = DT.getObjCPropertyGetterName(); 1514e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (!GetterName.empty()) 1515390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName); 1516e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel StringRef SetterName = DT.getObjCPropertySetterName(); 1517e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (!SetterName.empty()) 1518390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName); 1519e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel unsigned PropertyAttributes = 0; 1520e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (DT.isReadOnlyObjCProperty()) 1521e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly; 1522e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (DT.isReadWriteObjCProperty()) 1523e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite; 1524e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (DT.isAssignObjCProperty()) 1525e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign; 1526e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (DT.isRetainObjCProperty()) 1527e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain; 1528e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (DT.isCopyObjCProperty()) 1529e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy; 1530e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (DT.isNonAtomicObjCProperty()) 1531e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic; 1532e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel if (PropertyAttributes) 1533e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0, 1534e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel PropertyAttributes); 1535e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel } 1536161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return MemberDie; 1537161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1538