136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- llvm/CodeGen/DwarfUnit.cpp - Dwarf Type and Compile Units ---------===// 2161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// 3161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// The LLVM Compiler Infrastructure 4161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// 5161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// This file is distributed under the University of Illinois Open Source 6161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// License. See LICENSE.TXT for details. 7161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// 8161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===// 9161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// 10443c9ed7688e66c55c43819a75be681574b291deEric Christopher// This file contains support for constructing a dwarf compile unit. 11161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// 12161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===// 13161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "DwarfUnit.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "DwarfAccelTable.h" 1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "DwarfCompileUnit.h" 17161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfDebug.h" 18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "DwarfExpression.h" 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/APFloat.h" 204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/CodeGen/MachineFunction.h" 210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DIBuilder.h" 230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h" 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h" 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Mangler.h" 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCAsmInfo.h" 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCContext.h" 291d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie#include "llvm/MC/MCSection.h" 301d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie#include "llvm/MC/MCStreamer.h" 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/CommandLine.h" 32161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetFrameLowering.h" 3359eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie#include "llvm/Target/TargetLoweringObjectFile.h" 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetMachine.h" 35161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetRegisterInfo.h" 3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Target/TargetSubtargetInfo.h" 37161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 38161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelusing namespace llvm; 39161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "dwarfdebug" 41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic cl::opt<bool> 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesGenerateDwarfTypeUnits("generate-type-units", cl::Hidden, 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cl::desc("Generate DWARF4 type units."), 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cl::init(false)); 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarDIEDwarfExpression::DIEDwarfExpression(const AsmPrinter &AP, DwarfUnit &DU, 484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar DIELoc &DIE) 494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar : DwarfExpression(*AP.MF->getSubtarget().getRegisterInfo(), 504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar AP.getDwarfDebug()->getDwarfVersion()), 514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar AP(AP), DU(DU), DIE(DIE) {} 524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid DIEDwarfExpression::EmitOp(uint8_t Op, const char* Comment) { 54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DU.addUInt(DIE, dwarf::DW_FORM_data1, Op); 55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DIEDwarfExpression::EmitSigned(int64_t Value) { 57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DU.addSInt(DIE, dwarf::DW_FORM_sdata, Value); 58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DIEDwarfExpression::EmitUnsigned(uint64_t Value) { 60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DU.addUInt(DIE, dwarf::DW_FORM_udata, Value); 61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool DIEDwarfExpression::isFrameRegister(unsigned MachineReg) { 634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return MachineReg == TRI.getFrameRegister(*AP.MF); 64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 66ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Unit - Unit constructor. 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDwarfUnit::DwarfUnit(unsigned UID, dwarf::Tag UnitTag, DICompileUnit Node, 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU) 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : UniqueID(UID), CUNode(Node), UnitDie(UnitTag), DebugInfoOffset(0), Asm(A), 7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr) { 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(UnitTag == dwarf::DW_TAG_compile_unit || 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines UnitTag == dwarf::DW_TAG_type_unit); 74161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1); 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A, 78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DwarfDebug *DW, DwarfFile *DWU, 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCDwarfDwoLineTable *SplitLineTable) 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : DwarfUnit(UID, dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU), 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CU(CU), SplitLineTable(SplitLineTable) { 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (SplitLineTable) 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0); 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// ~Unit - Destructor for compile unit. 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDwarfUnit::~DwarfUnit() { 88161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j) 89161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlocks[j]->~DIEBlock(); 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (unsigned j = 0, M = DIELocs.size(); j < M; ++j) 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIELocs[j]->~DIELoc(); 92161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 93161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 94161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug 95161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// information entry. 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) { 97161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry); 98161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return Value; 99161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 100161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1016afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling/// getDefaultLowerBound - Return the default lower bound for an array. If the 102222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling/// DWARF version doesn't handle the language, return -1. 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesint64_t DwarfUnit::getDefaultLowerBound() const { 104aedaa723c26c33d4f9497a79d9d74a3c197fa262David Blaikie switch (getLanguage()) { 105222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling default: 106222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling break; 107222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling 108222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_C89: 109222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_C99: 110222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_C: 111222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_C_plus_plus: 112222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_ObjC: 113222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_ObjC_plus_plus: 114222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling return 0; 115222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling 116222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Fortran77: 117222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Fortran90: 118222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Fortran95: 119222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling return 1; 120222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling 121222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling // The languages below have valid values only if the DWARF version >= 4. 122222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Java: 123222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Python: 124222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_UPC: 125222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_D: 126222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling if (dwarf::DWARF_VERSION >= 4) 127222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling return 0; 128222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling break; 129222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling 130222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Ada83: 131222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Ada95: 132222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Cobol74: 133222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Cobol85: 134222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Modula2: 135222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_Pascal83: 136222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling case dwarf::DW_LANG_PLI: 137222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling if (dwarf::DWARF_VERSION >= 4) 138222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling return 1; 139222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling break; 140ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 141ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // The languages below have valid values only if the DWARF version >= 5. 142ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_OpenCL: 143ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_Go: 144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_Haskell: 145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_C_plus_plus_03: 146ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_C_plus_plus_11: 147ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_OCaml: 148ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_Rust: 149ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_C11: 150ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_Swift: 151ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_Dylan: 152ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_C_plus_plus_14: 153ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (dwarf::DWARF_VERSION >= 5) 154ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return 0; 155ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines break; 156ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 157ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_Modula3: 158ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_Julia: 159ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_Fortran03: 160ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case dwarf::DW_LANG_Fortran08: 161ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (dwarf::DWARF_VERSION >= 5) 162ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return 1; 163ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines break; 164222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling } 165222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling 166222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling return -1; 167222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling} 168222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling 169b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// Check whether the DIE for this MDNode can be shared across CUs. 17086a33487376848a606fdc629ffce2a581ae45653David Blaikiestatic bool isShareableAcrossCUs(DIDescriptor D) { 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // When the MDNode can be part of the type system, the DIE can be shared 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // across CUs. 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Combining type units and cross-CU DIE sharing is lower value (since 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // cross-CU DIE sharing is used in LTO and removes type redundancy at that 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // level already) but may be implementable for some value in projects 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // building multiple independent libraries with LTO and then linking those 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // together. 1782c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return (isa<MDType>(D) || 1792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar (isa<MDSubprogram>(D) && !cast<MDSubprogram>(D)->isDefinition())) && 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines !GenerateDwarfTypeUnits; 181b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren} 182b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren 183b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// getDIE - Returns the debug information entry map slot for the 184b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// specified debug variable. We delegate the request to DwarfDebug 185b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// when the DIE for this MDNode can be shared across CUs. The mappings 186b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// will be kept in DwarfDebug for shareable DIEs. 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::getDIE(DIDescriptor D) const { 188cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie if (isShareableAcrossCUs(D)) 18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return DU->getDIE(D); 190cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie return MDNodeToDieMap.lookup(D); 191b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren} 192b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren 193b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug 194b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// when the DIE for this MDNode can be shared across CUs. The mappings 195b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// will be kept in DwarfDebug for shareable DIEs. 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) { 197cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie if (isShareableAcrossCUs(Desc)) { 19837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DU->insertDIE(Desc, D); 199b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren return; 200b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren } 201cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie MDNodeToDieMap.insert(std::make_pair(Desc, D)); 202b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren} 203b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren 204873cf0a0d7906083578d9b793008348750636138Eric Christopher/// addFlag - Add a flag that is true. 205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) { 206dc42d031fb5787733d6765d6fefc76d46a7a4c9bMichael Gottesman if (DD->getDwarfVersion() >= 4) 207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne); 208873cf0a0d7906083578d9b793008348750636138Eric Christopher else 209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne); 210873cf0a0d7906083578d9b793008348750636138Eric Christopher} 211873cf0a0d7906083578d9b793008348750636138Eric Christopher 212161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addUInt - Add an unsigned integer attribute data and value. 213161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute, 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Optional<dwarf::Form> Form, uint64_t Integer) { 2166efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher if (!Form) 2176efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher Form = DIEInteger::BestForm(false, Integer); 2186efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator) 2196efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher DIEInteger(Integer); 220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, *Form, Value); 221770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie} 222770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie 223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) { 224770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addUInt(Block, (dwarf::Attribute)0, Form, Integer); 225161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 226161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 227161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSInt - Add an signed integer attribute data and value. 228161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute, 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Optional<dwarf::Form> Form, int64_t Integer) { 2316efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher if (!Form) 2326efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher Form = DIEInteger::BestForm(true, Integer); 233161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer); 234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, *Form, Value); 235770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie} 236770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie 237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form, 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int64_t Integer) { 239770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addSInt(Die, (dwarf::Attribute)0, Form, Integer); 240161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 241161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 2426a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// addString - Add a string attribute data and value. We always emit a 2436a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// reference to the string pool instead of immediate strings so that DIEs have 2443cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// more predictable sizes. In the case of split dwarf we emit an index 2453cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// into another table which gets us the static offset into the string 2463cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// table. 247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute, 24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef String) { 24937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!isDwoUnit()) 25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return addLocalString(Die, Attribute, String); 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines addIndexedString(Die, Attribute, String); 25337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 25437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 25537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid DwarfUnit::addIndexedString(DIE &Die, dwarf::Attribute Attribute, 25637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines StringRef String) { 257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned idx = DU->getStringPool().getIndex(*Asm, String); 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); 2593dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String); 260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str); 261dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher} 262dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher 263dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher/// addLocalString - Add a string attribute data and value. This is guaranteed 264dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher/// to be in the local string pool instead of indirected. 265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute, 26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef String) { 2674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String); 2696a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky DIEValue *Value; 27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 2711f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand Value = new (DIEValueAllocator) DIELabel(Symb); 27237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines else 2734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar Value = new (DIEValueAllocator) 2744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar DIEDelta(Symb, TLOF.getDwarfStrSection()->getBeginSymbol()); 27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String); 276dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, dwarf::DW_FORM_strp, Str); 277161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 278161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 2791f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand/// addLabel - Add a Dwarf label attribute data and value. 2801f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand/// 281dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form, 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *Label) { 2831f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); 284dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, Form, Value); 28595e72c90e4e2ee64e12d898f6495e796ebcadaf8David Blaikie} 28695e72c90e4e2ee64e12d898f6495e796ebcadaf8David Blaikie 287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) { 288770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addLabel(Die, (dwarf::Attribute)0, Form, Label); 289770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie} 290770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie 29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// addSectionOffset - Add an offset into a section attribute data and value. 29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 293dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute, 29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Integer) { 29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (DD->getDwarfVersion() >= 4) 29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer); 29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer); 29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned DwarfTypeUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) { 30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return SplitLineTable ? SplitLineTable->getFile(DirName, FileName) 30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : getCU().getOrCreateSourceID(FileName, DirName); 30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3060969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher/// addOpAddress - Add a dwarf op address data and value using the 3070969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index. 3080969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher/// 309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) { 3100969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher if (!DD->useSplitDwarf()) { 311770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 312770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addLabel(Die, dwarf::DW_FORM_udata, Sym); 3130969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher } else { 314770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index); 315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(Die, dwarf::DW_FORM_GNU_addr_index, 316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DD->getAddressPool().getIndex(Sym)); 3170969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher } 3180969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher} 3190969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher 320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute, 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *Hi, const MCSymbol *Lo) { 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo); 323dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, dwarf::DW_FORM_data4, Value); 324161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 325161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 326161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDIEEntry - Add a DIE attribute data and value. 327161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 328dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) { 329b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren addDIEEntry(Die, Attribute, createDIEEntry(Entry)); 330b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren} 331b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren 332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) { 333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Flag the type unit reference as a declaration so that if it contains 334dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // members (implicit special members, static data member definitions, member 335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // declarations for definitions in this CU, etc) consumers don't get confused 336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // and think this is a full definition. 337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addFlag(Die, dwarf::DW_AT_declaration); 338dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 339dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8, 340dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines new (DIEValueAllocator) DIETypeSignature(Type)); 34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, 34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEEntry *Entry) { 345dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const DIE *DieCU = Die.getUnitOrNull(); 346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const DIE *EntryCU = Entry->getEntry().getUnitOrNull(); 347b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren if (!DieCU) 348b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren // We assume that Die belongs to this CU, if it is not linked to any CU yet. 349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DieCU = &getUnitDie(); 350b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren if (!EntryCU) 351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EntryCU = &getUnitDie(); 352dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, 353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EntryCU == DieCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr, 354dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Entry); 355161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 356161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 3571a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren/// Create a DIE with the given Tag, add the DIE to its parent, and 3581a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren/// call insertDIE if MD is not null. 359dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) { 360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(Tag != dwarf::DW_TAG_auto_variable && 361dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Tag != dwarf::DW_TAG_arg_variable); 362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Parent.addChild(make_unique<DIE>((dwarf::Tag)Tag)); 363dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &Die = *Parent.getChildren().back(); 3641dc27239969889661115f40b293c83ab9ff3efd5David Blaikie if (N) 365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines insertDIE(N, &Die); 3661a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren return Die; 3671a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren} 3681a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren 369161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlock - Add block data. 370161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 371dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) { 37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Loc->ComputeSize(Asm); 37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIELocs.push_back(Loc); // Memoize so we can call the destructor later on. 374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc); 37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEBlock *Block) { 379161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Block->ComputeSize(Asm); 380161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on. 381dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Die.addValue(Attribute, Block->BestForm(), Block); 382161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 383161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 384161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 385161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File, 38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef Directory) { 388161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Line == 0) 389161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned FileID = getOrCreateSourceID(File, Directory); 392161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel assert(FileID && "Invalid file id"); 393770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addUInt(Die, dwarf::DW_AT_decl_file, None, FileID); 394770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addUInt(Die, dwarf::DW_AT_decl_line, None, Line); 395161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 396161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 397161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 398161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 399dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DIVariable V) { 4002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar assert(V); 401161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 4022c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addSourceLine(Die, V->getLine(), V->getScope()->getFilename(), 4032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar V->getScope()->getDirectory()); 404161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 405161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 406161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 407161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 408dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) { 4092c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar assert(G); 410161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 4112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addSourceLine(Die, G->getLine(), G->getFilename(), G->getDirectory()); 41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 4132125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher 41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// addSourceLine - Add location information to specified debug information 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// entry. 416dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DISubprogram SP) { 4172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar assert(SP); 41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addSourceLine(Die, SP->getLine(), SP->getFilename(), SP->getDirectory()); 420161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 421161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 422161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 423161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 424dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DIType Ty) { 4252c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar assert(Ty); 426161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 4272c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory()); 428161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 429161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information 431161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry. 432dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DIObjCProperty Ty) { 4332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar assert(Ty); 434b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher 4352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory()); 436b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher} 437b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher 438b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// addSourceLine - Add location information to specified debug information 439b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// entry. 440dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DINameSpace NS) { 4412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addSourceLine(Die, NS->getLine(), NS->getFilename(), NS->getDirectory()); 442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 444116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOp - Add register operand. 445ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool DwarfUnit::addRegisterOpPiece(DIELoc &TheDie, unsigned Reg, 44637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned SizeInBits, unsigned OffsetInBits) { 447ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DIEDwarfExpression Expr(*Asm, *this, TheDie); 448ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Expr.AddMachineRegPiece(Reg, SizeInBits, OffsetInBits); 449ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return true; 450116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel} 451116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel 452116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOffset - Add register offset. 453ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg, 45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int64_t Offset) { 455ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DIEDwarfExpression Expr(*Asm, *this, TheDie); 456ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return Expr.AddMachineRegIndirect(Reg, Offset); 457116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel} 458116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel 459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/* Byref variables, in Blocks, are declared by the programmer as "SomeType 460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel VarName;", but the compiler creates a __Block_byref_x_VarName struct, and 461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel gives the variable VarName either the struct, or a pointer to the struct, as 462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel its type. This is necessary for various behind-the-scenes things the 463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel compiler needs to do with by-reference variables in Blocks. 464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel However, as far as the original *programmer* is concerned, the variable 466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel should still have type 'SomeType', as originally declared. 467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel The function getBlockByrefType dives into the __Block_byref_x_VarName 469161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct to find the original type of the variable, which is then assigned to 470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel the variable's Debug Information Entry as its real type. So far, so good. 471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel However now the debugger will expect the variable VarName to have the type 472161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel SomeType. So we need the location attribute for the variable to be an 473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel expression that explains to the debugger how to navigate through the 474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel pointers and struct to find the actual variable of type SomeType. 475161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 476161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel The following function does just that. We start by getting 477161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel the "normal" location for the variable. This will be the location 478161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel of either the struct __Block_byref_x_VarName or the pointer to the 479161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct __Block_byref_x_VarName. 480161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 481161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel The struct will look something like: 482161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 483161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct __Block_byref_x_VarName { 484161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ... <various fields> 485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct __Block_byref_x_VarName *forwarding; 486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ... <various other fields> 487161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel SomeType VarName; 488161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel ... <maybe more fields> 489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel }; 490161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 491161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel If we are given the struct directly (as our starting point) we 492161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel need to tell the debugger to: 493161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 494161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1). Add the offset of the forwarding field. 495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 496161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 2). Follow that pointer to get the real __Block_byref_x_VarName 497161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel struct to use (the real one may have been copied onto the heap). 498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 3). Add the offset for the field VarName, to find the actual variable. 500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel If we started with a pointer to the struct, then we need to 502161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dereference that pointer first, before the other steps. 503161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel Translating this into DWARF ops, we will need to append the following 504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel to the current location description for the variable: 505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DW_OP_deref -- optional, if we start with a pointer 507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DW_OP_plus_uconst <forward_fld_offset> 508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DW_OP_deref 509161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DW_OP_plus_uconst <varName_fld_offset> 510161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 511161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel That is what this function does. */ 512161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 513161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlockByrefAddress - Start with the address based on the location 514161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// provided, and generate the DWARF information necessary to find the 515161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// actual Block variable (navigating the Block struct) based on the 516161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// starting location. Add the DWARF information to the die. For 517161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// more information, read large comment just above here. 518161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// 519dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die, 52036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dwarf::Attribute Attribute, 52136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MachineLocation &Location) { 522f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher DIType Ty = DV.getType(); 523161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIType TmpTy = Ty; 5242c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar uint16_t Tag = Ty->getTag(); 525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel bool isPointer = false; 526161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 527f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher StringRef varName = DV.getName(); 528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Tag == dwarf::DW_TAG_pointer_type) { 5302c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIDerivedType DTy = cast<MDDerivedType>(Ty); 5312c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar TmpTy = resolve(DTy->getBaseType()); 532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel isPointer = true; 533161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 534161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 535161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Find the __forwarding field and the variable field in the __Block_byref 536161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // struct. 5372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIArray Fields = cast<MDCompositeTypeBase>(TmpTy)->getElements(); 5384adba52570723c2e1654b1c01feddf759893f096David Blaikie DIDerivedType varField; 5394adba52570723c2e1654b1c01feddf759893f096David Blaikie DIDerivedType forwardingField; 540161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 5412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (unsigned i = 0, N = Fields.size(); i < N; ++i) { 5422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIDerivedType DT = cast<MDDerivedTypeBase>(Fields[i]); 5432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef fieldName = DT->getName(); 544161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (fieldName == "__forwarding") 5454adba52570723c2e1654b1c01feddf759893f096David Blaikie forwardingField = DT; 546161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel else if (fieldName == varName) 5474adba52570723c2e1654b1c01feddf759893f096David Blaikie varField = DT; 548161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 549161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 550161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get the offsets for the forwarding field and the variable field. 5512c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar unsigned forwardingFieldOffset = forwardingField->getOffsetInBits() >> 3; 5522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar unsigned varFieldOffset = varField->getOffsetInBits() >> 2; 553161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 554161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Decode the original location, and use that as the start of the byref 555161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // variable's location. 55636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIELoc *Loc = new (DIEValueAllocator) DIELoc(); 557161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 558ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool validReg; 559caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher if (Location.isReg()) 560ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines validReg = addRegisterOpPiece(*Loc, Location.getReg()); 561caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher else 562ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines validReg = addRegisterOffset(*Loc, Location.getReg(), Location.getOffset()); 563ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 564ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!validReg) 565ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return; 566161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 567161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // If we started with a pointer to the __Block_byref... struct, then 568161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // the first thing we need to do is dereference the pointer (DW_OP_deref). 569161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (isPointer) 570dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 571161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 572161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Next add the offset for the '__forwarding' field: 573161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in 574161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // adding the offset if it's 0. 575161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (forwardingFieldOffset > 0) { 576dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 577dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset); 578161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 579161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 580161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Now dereference the __forwarding field to get to the real __Block_byref 581161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // struct: DW_OP_deref. 582dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 583161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 584161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Now that we've got the real __Block_byref... struct, add the offset 585161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // for the variable's field to get to the location of the actual variable: 586161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0. 587161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (varFieldOffset > 0) { 588dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 589dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset); 590161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 591161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 592161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Now attach the location information to the DIE. 59336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addBlock(Die, Attribute, Loc); 594161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 595161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 596c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren/// Return true if type encoding is unsigned. 597c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Renstatic bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) { 5982c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DIDerivedType DTy = dyn_cast<MDDerivedTypeBase>(Ty)) { 5992c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar dwarf::Tag T = (dwarf::Tag)Ty->getTag(); 600dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Encode pointer constants as unsigned bytes. This is used at least for 601dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // null pointer constant emission. 602ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // (Pieces of) aggregate types that get hacked apart by SROA may also be 603ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // represented by a constant. Encode them as unsigned bytes. 604dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed 605dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // here, but accept them for now due to a bug in SROA producing bogus 606dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // dbg.values. 607ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (T == dwarf::DW_TAG_array_type || 608ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines T == dwarf::DW_TAG_class_type || 609ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines T == dwarf::DW_TAG_pointer_type || 610dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines T == dwarf::DW_TAG_ptr_to_member_type || 611dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines T == dwarf::DW_TAG_reference_type || 612ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines T == dwarf::DW_TAG_rvalue_reference_type || 613ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines T == dwarf::DW_TAG_structure_type || 614ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines T == dwarf::DW_TAG_union_type) 615c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren return true; 616dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type || 617dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines T == dwarf::DW_TAG_volatile_type || 618dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines T == dwarf::DW_TAG_restrict_type || 619dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines T == dwarf::DW_TAG_enumeration_type); 6202c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DITypeRef Deriv = DTy->getBaseType()) 621dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return isUnsignedDIType(DD, DD->resolve(Deriv)); 622dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // FIXME: Enums without a fixed underlying type have unknown signedness 623dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // here, leading to incorrectly emitted constants. 6242c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar assert(DTy->getTag() == dwarf::DW_TAG_enumeration_type); 625dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return false; 626c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren } 627dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 6282c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIBasicType BTy = cast<MDBasicType>(Ty); 6292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar unsigned Encoding = BTy->getEncoding(); 630dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert((Encoding == dwarf::DW_ATE_unsigned || 631dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Encoding == dwarf::DW_ATE_unsigned_char || 632dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Encoding == dwarf::DW_ATE_signed || 633dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Encoding == dwarf::DW_ATE_signed_char || 6342c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Encoding == dwarf::DW_ATE_float || Encoding == dwarf::DW_ATE_UTF || 6352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Encoding == dwarf::DW_ATE_boolean || 6362c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar (Ty->getTag() == dwarf::DW_TAG_unspecified_type && 6372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Ty->getName() == "decltype(nullptr)")) && 638dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines "Unsupported encoding"); 6392c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return Encoding == dwarf::DW_ATE_unsigned || 6402c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Encoding == dwarf::DW_ATE_unsigned_char || 6412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean || 6422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Ty->getTag() == dwarf::DW_TAG_unspecified_type; 643c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren} 644c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren 645c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren/// If this type is derived from a base type then return base type size. 64643251008c2ce836f47a6e4c8a64947069d6b268eManman Renstatic uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) { 6472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar unsigned Tag = Ty->getTag(); 648c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren 649c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef && 650c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type && 651c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren Tag != dwarf::DW_TAG_restrict_type) 6522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return Ty->getSizeInBits(); 653c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren 6542c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar auto *BaseType = DD->resolve(Ty->getBaseType()); 655c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren 6562c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar assert(BaseType && "Unexpected invalid base type"); 657c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren 658c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren // If this is a derived type, go ahead and get the base type, unless it's a 659c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren // reference then it's just the size of the field. Pointer types have no need 660c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren // of this since they're a different type of qualification on the type. 6612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (BaseType->getTag() == dwarf::DW_TAG_reference_type || 6622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar BaseType->getTag() == dwarf::DW_TAG_rvalue_reference_type) 6632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return Ty->getSizeInBits(); 664c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren 6652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *DT = dyn_cast<MDDerivedTypeBase>(BaseType)) 6662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return getBaseTypeSize(DD, DT); 667c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren 6682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return BaseType->getSizeInBits(); 669c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren} 670c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren 671161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantFPValue - Add constant value entry in variable DIE. 672dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) { 6736efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher assert(MO.isFPImm() && "Invalid machine operand!"); 674161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 675161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel APFloat FPImm = MO.getFPImm()->getValueAPF(); 676161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 677161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get the raw data form of the floating point. 678161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel const APInt FltVal = FPImm.bitcastToAPInt(); 6796efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher const char *FltPtr = (const char *)FltVal.getRawData(); 680161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 681161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte. 6823574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 683161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int Incr = (LittleEndian ? 1 : -1); 684161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int Start = (LittleEndian ? 0 : NumBytes - 1); 685161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int Stop = (LittleEndian ? NumBytes : -1); 686161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 687161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Output the constant to DWARF one byte at a time. 688161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel for (; Start != Stop; Start += Incr) 689dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]); 690161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 691770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addBlock(Die, dwarf::DW_AT_const_value, Block); 692161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 693161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 69414268416720155d63f190a6143ee40b3b850e409David Blaikie/// addConstantFPValue - Add constant value entry in variable DIE. 695dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) { 6967b2ee399d9c1b2112962d29540c25b94fa98e8edEric Christopher // Pass this down to addConstantValue as an unsigned bag of bits. 6977b2ee399d9c1b2112962d29540c25b94fa98e8edEric Christopher addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true); 69814268416720155d63f190a6143ee40b3b850e409David Blaikie} 69914268416720155d63f190a6143ee40b3b850e409David Blaikie 700161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE. 701dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) { 702dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addConstantValue(Die, CI->getValue(), Ty); 703dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 704dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 705dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// addConstantValue - Add constant value entry in variable DIE. 706dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO, 707dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIType Ty) { 708dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(MO.isImm() && "Invalid machine operand!"); 709dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 710dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm()); 711dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 712dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 713dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) { 714dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // FIXME: This is a bit conservative/simple - it emits negative values always 715dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // sign extended to 64 bits rather than minimizing the number of bytes. 716dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(Die, dwarf::DW_AT_const_value, 717dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val); 718dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 719dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 720dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) { 721dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addConstantValue(Die, Val, isUnsignedDIType(DD, Ty)); 72214268416720155d63f190a6143ee40b3b850e409David Blaikie} 72314268416720155d63f190a6143ee40b3b850e409David Blaikie 72414268416720155d63f190a6143ee40b3b850e409David Blaikie// addConstantValue - Add constant value entry in variable DIE. 725dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) { 72614268416720155d63f190a6143ee40b3b850e409David Blaikie unsigned CIBitWidth = Val.getBitWidth(); 727d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel if (CIBitWidth <= 64) { 728dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addConstantValue(Die, Unsigned, 729dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Unsigned ? Val.getZExtValue() : Val.getSExtValue()); 730e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher return; 731161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 732161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 733161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 734161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 735161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get the raw data form of the large APInt. 736c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi const uint64_t *Ptr64 = Val.getRawData(); 737161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 738161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte. 7393574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 740161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 741161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Output the constant to DWARF one byte at a time. 742c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi for (int i = 0; i < NumBytes; i++) { 743c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi uint8_t c; 744c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi if (LittleEndian) 745c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi c = Ptr64[i / 8] >> (8 * (i & 7)); 746c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi else 747c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7)); 748dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Block, dwarf::DW_FORM_data1, c); 749c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi } 750161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 751770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addBlock(Die, dwarf::DW_AT_const_value, Block); 752161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 753161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 7544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// Add a linkage name to the DIE. 7554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) { 7564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (!LinkageName.empty()) 7574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar addString(Die, 7584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name 7594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar : dwarf::DW_AT_MIPS_linkage_name, 7604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar GlobalValue::getRealLinkageName(LinkageName)); 7614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} 7624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 7636c3bb94445305f8ee0be6d3c9457a411bf22b3ebEric Christopher/// addTemplateParams - Add template parameters into buffer. 76436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) { 765161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add template parameters. 7662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (unsigned i = 0, e = TParams.size(); i != e; ++i) { 7672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIDescriptor Element = TParams[i]; 7682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *TTP = dyn_cast<MDTemplateTypeParameter>(Element)) 7692c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar constructTemplateTypeParameterDIE(Buffer, TTP); 7702c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (auto *TVP = dyn_cast<MDTemplateValueParameter>(Element)) 7712c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar constructTemplateValueParameterDIE(Buffer, TVP); 772161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 773161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 774746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky 7756b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// getOrCreateContextDIE - Get context owner's DIE. 77636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) { 7772c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!Context || isa<MDFile>(Context)) 778dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return &getUnitDie(); 7792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *T = dyn_cast<MDType>(Context)) 7802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return getOrCreateTypeDIE(T); 7812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *NS = dyn_cast<MDNamespace>(Context)) 7822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return getOrCreateNameSpace(NS); 7832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *SP = dyn_cast<MDSubprogram>(Context)) 7842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return getOrCreateSubprogramDIE(SP); 7850cbdb81de76274c3f1731d92dc09864d2277d690Adrian Prantl return getDIE(Context); 7866b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher} 7876b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 78836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::createTypeDIE(DICompositeType Ty) { 7892c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIScope Context = resolve(Ty->getScope()); 79036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *ContextDIE = getOrCreateContextDIE(Context); 79136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 792dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (DIE *TyDIE = getDIE(Ty)) 79336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TyDIE; 79436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 79536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Create new type. 7962c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty); 79736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 798dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines constructTypeDIE(TyDIE, Ty); 79936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 80036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines updateAcceleratorTables(Context, Ty, TyDIE); 801dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return &TyDIE; 80236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 80336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 804161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 805161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given DIType. 80636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) { 80741e1a18885b8ef29219b7102ad25cd480c4a3f55David Blaikie if (!TyNode) 808dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 809d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren 8102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar auto *Ty = cast<MDType>(TyNode); 8112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar assert(Ty == resolve(Ty->getRef()) && 81236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "type was not uniqued, possible ODR violation."); 81341e1a18885b8ef29219b7102ad25cd480c4a3f55David Blaikie 814dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // DW_TAG_restrict_type is not supported in DWARF2 8152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Ty->getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2) 8162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return getOrCreateTypeDIE( 8172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar resolve(DITypeRef(cast<MDDerivedType>(Ty)->getBaseType()))); 818dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 819d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren // Construct the context before querying for the existence of the DIE in case 820d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren // such construction creates the DIE. 8212c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIScope Context = resolve(Ty->getScope()); 82236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *ContextDIE = getOrCreateContextDIE(Context); 8236bc810a49983e12006ba7a0dba61f7b2534b8f26Adrian Prantl assert(ContextDIE); 824d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren 825dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (DIE *TyDIE = getDIE(Ty)) 826161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return TyDIE; 827161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 828161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Create new type. 8292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty); 830d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren 83136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines updateAcceleratorTables(Context, Ty, TyDIE); 83236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *BT = dyn_cast<MDBasicType>(Ty)) 8342c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar constructTypeDIE(TyDIE, BT); 8352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (DICompositeType CTy = dyn_cast<MDCompositeTypeBase>(Ty)) { 8362c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (GenerateDwarfTypeUnits && !Ty->isForwardDecl()) 8372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (MDString *TypeId = CTy->getRawIdentifier()) { 83836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy); 83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Skip updating the accelerator tables since this is not the full type. 840dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return &TyDIE; 84136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 842dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines constructTypeDIE(TyDIE, CTy); 84336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else { 8442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar constructTypeDIE(TyDIE, cast<MDDerivedType>(Ty)); 845161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 84636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 847dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return &TyDIE; 84836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 84936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 85036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty, 851dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const DIE &TyDIE) { 8522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!Ty->getName().empty() && !Ty->isForwardDecl()) { 853c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher bool IsImplementation = 0; 8542c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *CT = dyn_cast<MDCompositeTypeBase>(Ty)) { 855e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher // A runtime language of 0 actually means C/C++ and that any 856e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher // non-negative value is some version of Objective-C/C++. 8572c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar IsImplementation = CT->getRuntimeLang() == 0 || CT->isObjcClassComplete(); 858c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher } 859577056f89c840537b059ea4cef8d2ae18513cda0Eric Christopher unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0; 8602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DD->addAccelType(Ty->getName(), TyDIE, Flags); 8618b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher 8622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!Context || isa<MDCompileUnit>(Context) || isa<MDFile>(Context) || 8632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar isa<MDNamespace>(Context)) 86437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines addGlobalType(Ty, TyDIE, Context); 86536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 866161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 867161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 868161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addType - Add a new type attribute to the specified entity. 869dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) { 870dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher assert(Ty && "Trying to add a type that doesn't exist?"); 871161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 872161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Check for pre-existence. 873161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIEEntry *Entry = getDIEEntry(Ty); 874161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // If it exists then use the existing value. 875161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Entry) { 876b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren addDIEEntry(Entity, Attribute, Entry); 877161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel return; 878161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 879161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 880161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Construct type. 881161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *Buffer = getOrCreateTypeDIE(Ty); 882161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 883161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Set up proxy. 884dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Entry = createDIEEntry(*Buffer); 885161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel insertDIEEntry(Ty, Entry); 886b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren addDIEEntry(Entity, Attribute, Entry); 88766658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel} 88866658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel 8899198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// getParentContextString - Walks the metadata parent chain in a language 8909198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// specific manner (using the compile unit language) and returns 8919198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// it as a string. This is done at the metadata level because DIEs may 8929198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// not currently have been added to the parent context and walking the 8939198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// DIEs looking for names is more expensive than walking the metadata. 89436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstd::string DwarfUnit::getParentContextString(DIScope Context) const { 8959198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher if (!Context) 8969198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher return ""; 8979198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher 8989198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher // FIXME: Decide whether to implement this for non-C++ languages. 8999198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher if (getLanguage() != dwarf::DW_LANG_C_plus_plus) 9009198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher return ""; 9019198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher 9020ab6439c3f0eef28b4b40f31f2d4d9732fe8cd15Eric Christopher std::string CS; 9039198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher SmallVector<DIScope, 1> Parents; 9042c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar while (!isa<MDCompileUnit>(Context)) { 9059198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher Parents.push_back(Context); 9062c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Context->getScope()) 9072c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Context = resolve(Context->getScope()); 9089198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher else 9099198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher // Structure, etc types will have a NULL context if they're at the top 9109198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher // level. 9119198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher break; 9129198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher } 9139198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher 9149198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher // Reverse iterate over our list to go from the outermost construct to the 9159198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher // innermost. 9169198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(), 9179198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher E = Parents.rend(); 9189198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher I != E; ++I) { 9192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDScope *Ctx = *I; 9202c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef Name = Ctx->getName(); 9212c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Name.empty() && isa<MDNamespace>(Ctx)) 922c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Name = "(anonymous namespace)"; 9230ab6439c3f0eef28b4b40f31f2d4d9732fe8cd15Eric Christopher if (!Name.empty()) { 9249198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher CS += Name; 9259198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher CS += "::"; 9269198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher } 9279198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher } 9289198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher return CS; 929161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 930161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 931161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct basic type die from DIBasicType. 93236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) { 933161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get core information. 9342c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef Name = BTy->getName(); 935161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add name if not anonymous or intermediate type. 936161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Name.empty()) 937dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addString(Buffer, dwarf::DW_AT_name, Name); 938734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel 939916d49e77237c5aabfd5638b4e481c7ed9441608David Blaikie // An unspecified type only has a name attribute. 9402c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (BTy->getTag() == dwarf::DW_TAG_unspecified_type) 941734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel return; 942734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel 943dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 9442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar BTy->getEncoding()); 945734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel 9462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar uint64_t Size = BTy->getSizeInBits() >> 3; 947dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size); 948161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 949161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 950161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct derived type die from DIDerivedType. 95136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) { 952161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get core information. 9532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef Name = DTy->getName(); 9542c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar uint64_t Size = DTy->getSizeInBits() >> 3; 955916d49e77237c5aabfd5638b4e481c7ed9441608David Blaikie uint16_t Tag = Buffer.getTag(); 956161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 957161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Map to main type, void will not have a type. 9582c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIType FromTy = resolve(DTy->getBaseType()); 959dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher if (FromTy) 960dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addType(Buffer, FromTy); 961161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 962161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add name if not anonymous or intermediate type. 963161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Name.empty()) 964dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addString(Buffer, dwarf::DW_AT_name, Name); 965161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 966161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add size if non-zero (derived types might be zero-sized.) 967ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (Size && Tag != dwarf::DW_TAG_pointer_type 968ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines && Tag != dwarf::DW_TAG_ptr_to_member_type) 969dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size); 970161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 97162fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie if (Tag == dwarf::DW_TAG_ptr_to_member_type) 9722c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addDIEEntry( 9732c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Buffer, dwarf::DW_AT_containing_type, 9742c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar *getOrCreateTypeDIE(resolve(cast<MDDerivedType>(DTy)->getClassType()))); 975161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add source line info if available and TyDesc is not a forward declaration. 9762c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!DTy->isForwardDecl()) 977dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addSourceLine(Buffer, DTy); 978161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 979161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 98036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// constructSubprogramArguments - Construct function argument DIEs. 98137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) { 9822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (unsigned i = 1, N = Args.size(); i < N; ++i) { 9832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIType Ty = resolve(Args[i]); 98437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!Ty) { 98536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(i == N-1 && "Unspecified parameter must be the last argument"); 98636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer); 98736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else { 988dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer); 98937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines addType(Arg, Ty); 9902c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Ty->isArtificial()) 99136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addFlag(Arg, dwarf::DW_AT_artificial); 99236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 9933dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher } 9943dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher} 9953dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher 996161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct type DIE from DICompositeType. 99736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { 99836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add name if not anonymous or intermediate type. 9992c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef Name = CTy->getName(); 1000161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 10012c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar uint64_t Size = CTy->getSizeInBits() >> 3; 1002916d49e77237c5aabfd5638b4e481c7ed9441608David Blaikie uint16_t Tag = Buffer.getTag(); 1003161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1004161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel switch (Tag) { 1005161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_array_type: 1006883ed6bd9544e7fac36a66711132bf151fb734adEric Christopher constructArrayTypeDIE(Buffer, CTy); 1007161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel break; 1008953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher case dwarf::DW_TAG_enumeration_type: 1009953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher constructEnumTypeDIE(Buffer, CTy); 1010953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher break; 1011161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_subroutine_type: { 1012dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher // Add return type. A void return won't have a type. 10132c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar auto Elements = cast<MDSubroutineType>(CTy)->getTypeArray(); 10142c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Elements.size()) 10152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto RTy = resolve(Elements[0])) 10162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addType(Buffer, RTy); 1017161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1018161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel bool isPrototyped = true; 10192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Elements.size() == 2 && !Elements[1]) 102036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines isPrototyped = false; 102136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 102236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines constructSubprogramArguments(Buffer, Elements); 102336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10248b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher // Add prototype flag if we're dealing with a C language and the 10258b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher // function has been prototyped. 1026aedaa723c26c33d4f9497a79d9d74a3c197fa262David Blaikie uint16_t Language = getLanguage(); 10278b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher if (isPrototyped && 10286efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 || 10294d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher Language == dwarf::DW_LANG_ObjC)) 1030dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addFlag(Buffer, dwarf::DW_AT_prototyped); 103136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10322c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (CTy->isLValueReference()) 1033dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addFlag(Buffer, dwarf::DW_AT_reference); 103436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (CTy->isRValueReference()) 1036dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addFlag(Buffer, dwarf::DW_AT_rvalue_reference); 10376efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher } break; 1038161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_structure_type: 1039161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_union_type: 1040161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel case dwarf::DW_TAG_class_type: { 1041161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add elements to structure type. 10422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIArray Elements = CTy->getElements(); 10432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (unsigned i = 0, N = Elements.size(); i < N; ++i) { 10442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIDescriptor Element = Elements[i]; 10452c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!Element) 10462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar continue; 10472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *SP = dyn_cast<MDSubprogram>(Element)) 10482c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar getOrCreateSubprogramDIE(SP); 10492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (DIDerivedType DDTy = dyn_cast<MDDerivedTypeBase>(Element)) { 10502c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DDTy->getTag() == dwarf::DW_TAG_friend) { 1051dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer); 10522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addType(ElemDie, resolve(DDTy->getBaseType()), dwarf::DW_AT_friend); 10532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } else if (DDTy->isStaticMember()) { 105499addee7335441fe9bb6249eb9d5332cdbdf3c97Manman Ren getOrCreateStaticMemberDIE(DDTy); 1055655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren } else { 1056a1d25b6360a6f40bf1c5651950226640211dc6d0Manman Ren constructMemberDIE(Buffer, DDTy); 1057655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren } 10582c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } else if (DIObjCProperty Property = dyn_cast<MDObjCProperty>(Element)) { 10592c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIE &ElemDie = createAndAddDIE(Property->getTag(), Buffer); 10602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef PropertyName = Property->getName(); 106130d409ca097e35c51964c9dac642804e5e495906Devang Patel addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName); 10622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Property->getType()) 10632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addType(ElemDie, Property->getType()); 10644d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher addSourceLine(ElemDie, Property); 10652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef GetterName = Property->getGetterName(); 106630d409ca097e35c51964c9dac642804e5e495906Devang Patel if (!GetterName.empty()) 106730d409ca097e35c51964c9dac642804e5e495906Devang Patel addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName); 10682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef SetterName = Property->getSetterName(); 106930d409ca097e35c51964c9dac642804e5e495906Devang Patel if (!SetterName.empty()) 107030d409ca097e35c51964c9dac642804e5e495906Devang Patel addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName); 10712c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (unsigned PropertyAttributes = Property->getAttributes()) 1072770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None, 10736efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher PropertyAttributes); 10746588abf377b7381274236e651462ec83052f6013Devang Patel 107530d409ca097e35c51964c9dac642804e5e495906Devang Patel DIEEntry *Entry = getDIEEntry(Element); 107630d409ca097e35c51964c9dac642804e5e495906Devang Patel if (!Entry) { 107730d409ca097e35c51964c9dac642804e5e495906Devang Patel Entry = createDIEEntry(ElemDie); 107830d409ca097e35c51964c9dac642804e5e495906Devang Patel insertDIEEntry(Element, Entry); 107930d409ca097e35c51964c9dac642804e5e495906Devang Patel } 10802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } 1081161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 1082161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 10832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (CTy->isAppleBlockExtension()) 1084dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addFlag(Buffer, dwarf::DW_AT_APPLE_block); 1085161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1086ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type 1087ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // inside C++ composite types to point to the base class with the vtable. 10882c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DICompositeType ContainingType = 10892c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar dyn_cast_or_null<MDCompositeType>(resolve(CTy->getVTableHolder()))) 1090dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addDIEEntry(Buffer, dwarf::DW_AT_containing_type, 1091dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines *getOrCreateTypeDIE(ContainingType)); 1092161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 10932c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (CTy->isObjcClassComplete()) 1094dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type); 1095b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel 10961a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher // Add template parameters to a class, structure or union types. 10971a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher // FIXME: The support isn't in the metadata for this yet. 10981a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher if (Tag == dwarf::DW_TAG_class_type || 10996efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) 11002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addTemplateParams(Buffer, CTy->getTemplateParams()); 1101161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1102161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel break; 1103161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 1104161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel default: 1105161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel break; 1106161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 1107161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1108161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add name if not anonymous or intermediate type. 1109161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Name.empty()) 1110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addString(Buffer, dwarf::DW_AT_name, Name); 1111161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 11124a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher if (Tag == dwarf::DW_TAG_enumeration_type || 11136efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type || 11144a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher Tag == dwarf::DW_TAG_union_type) { 1115161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add size if non-zero (derived types might be zero-sized.) 1116fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher // TODO: Do we care about size for enum forward declarations? 1117161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (Size) 1118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size); 11192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (!CTy->isForwardDecl()) 1120161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add zero size if it is not a forward declaration. 1121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0); 1122fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher 1123fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher // If we're a forward decl, say so. 11242c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (CTy->isForwardDecl()) 1125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addFlag(Buffer, dwarf::DW_AT_declaration); 1126161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1127161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add source line info if available. 11282c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!CTy->isForwardDecl()) 1129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addSourceLine(Buffer, CTy); 11308938895a8338e6084eb12a2bb4bf044928436173Eric Christopher 11318938895a8338e6084eb12a2bb4bf044928436173Eric Christopher // No harm in adding the runtime language to the declaration. 11322c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar unsigned RLang = CTy->getRuntimeLang(); 11338938895a8338e6084eb12a2bb4bf044928436173Eric Christopher if (RLang) 1134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1, 11356efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher RLang); 1136161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 1137161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1138161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1139be87b69a5f2f0b66939cef4d107a2cb8e4f4f4dcManman Ren/// constructTemplateTypeParameterDIE - Construct new DIE for the given 1140be87b69a5f2f0b66939cef4d107a2cb8e4f4f4dcManman Ren/// DITemplateTypeParameter. 114136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer, 114236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DITemplateTypeParameter TP) { 1143dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &ParamDIE = 11441a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer); 114576ef79f410853a431c820cb5d0ee11cd66d4c90dEric Christopher // Add the type if it exists, it could be void and therefore no type. 11462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (TP->getType()) 11472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addType(ParamDIE, resolve(TP->getType())); 11482c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!TP->getName().empty()) 11492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addString(ParamDIE, dwarf::DW_AT_name, TP->getName()); 1150161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1151161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1152be87b69a5f2f0b66939cef4d107a2cb8e4f4f4dcManman Ren/// constructTemplateValueParameterDIE - Construct new DIE for the given 1153be87b69a5f2f0b66939cef4d107a2cb8e4f4f4dcManman Ren/// DITemplateValueParameter. 115499addee7335441fe9bb6249eb9d5332cdbdf3c97Manman Renvoid 115536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer, 115636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DITemplateValueParameter VP) { 11572c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIE &ParamDIE = createAndAddDIE(VP->getTag(), Buffer); 1158dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher 1159dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher // Add the type if there is one, template template and template parameter 1160dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher // packs will not have a type. 11612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (VP->getTag() == dwarf::DW_TAG_template_value_parameter) 11622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addType(ParamDIE, resolve(VP->getType())); 11632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!VP->getName().empty()) 11642c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addString(ParamDIE, dwarf::DW_AT_name, VP->getName()); 11652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Metadata *Val = VP->getValue()) { 1166ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val)) 11672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addConstantValue(ParamDIE, CI, resolve(VP->getType())); 1168ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) { 11694de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie // For declaration non-type template parameters (such as global values and 11704de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie // functions) 117136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIELoc *Loc = new (DIEValueAllocator) DIELoc(); 1172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addOpAddress(*Loc, Asm->getSymbol(GV)); 11734de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie // Emit DW_OP_stack_value to use the address as the immediate value of the 11744de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie // parameter, rather than a pointer to it. 1175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value); 117636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addBlock(ParamDIE, dwarf::DW_AT_location, Loc); 11772c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_template_param) { 1178e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie assert(isa<MDString>(Val)); 1179e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie addString(ParamDIE, dwarf::DW_AT_GNU_template_name, 1180e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie cast<MDString>(Val)->getString()); 11812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) { 11822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addTemplateParams(ParamDIE, cast<MDTuple>(Val)); 11834de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie } 11844de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie } 1185161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1186161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 118731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// getOrCreateNameSpace - Create a DIE for DINameSpace. 118836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) { 11896b713800ff03fdbb1d770d1e00af0e76041f3c03Manman Ren // Construct the context before querying for the existence of the DIE in case 11906b713800ff03fdbb1d770d1e00af0e76041f3c03Manman Ren // such construction creates the DIE. 11912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIE *ContextDIE = getOrCreateContextDIE(NS->getScope()); 11926b713800ff03fdbb1d770d1e00af0e76041f3c03Manman Ren 1193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (DIE *NDie = getDIE(NS)) 119431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel return NDie; 1195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS); 11966b713800ff03fdbb1d770d1e00af0e76041f3c03Manman Ren 11972c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef Name = NS->getName(); 1198c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!Name.empty()) 11992c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addString(NDie, dwarf::DW_AT_name, NS->getName()); 1200c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines else 1201c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Name = "(anonymous namespace)"; 1202c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines DD->addAccelNamespace(Name, NDie); 12032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addGlobalName(Name, NDie, NS->getScope()); 120431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel addSourceLine(NDie, NS); 1205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return &NDie; 120631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel} 120731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel 1208dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getOrCreateSubprogramDIE - Create new DIE using SP. 120937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesDIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) { 1210c32f2332b065d0fb8de4db8b8ca0981564dae92bDavid Blaikie // Construct the context before querying for the existence of the DIE in case 1211c32f2332b065d0fb8de4db8b8ca0981564dae92bDavid Blaikie // such construction creates the DIE (as is the case for member function 1212c32f2332b065d0fb8de4db8b8ca0981564dae92bDavid Blaikie // declarations). 121337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DIE *ContextDIE = 12142c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP->getScope())); 121536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (DIE *SPDie = getDIE(SP)) 1217dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel return SPDie; 1218dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 12192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *SPDecl = SP->getDeclaration()) { 122037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!Minimal) { 122137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Add subprogram definitions to the CU die directly. 122237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ContextDIE = &getUnitDie(); 122337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Build the decl now to ensure it precedes the definition. 122437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines getOrCreateSubprogramDIE(SPDecl); 122537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 1226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 122727302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne 122827302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne // DW_TAG_inlined_subroutine may refer to this DIE. 1229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP); 123001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola 1231c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines // Stop here and fill this in later, depending on whether or not this 1232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // subprogram turns out to have inlined instances or not. 12332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (SP->isDefinition()) 1234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return &SPDie; 1235dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines applySubprogramAttributes(SP, SPDie); 1237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return &SPDie; 1238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 123901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola 124037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool DwarfUnit::applySubprogramDefinitionAttributes(DISubprogram SP, 124137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DIE &SPDie) { 1242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE *DeclDie = nullptr; 1243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringRef DeclLinkageName; 12442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *SPDecl = SP->getDeclaration()) { 1245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DeclDie = getDIE(SPDecl); 1246c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines assert(DeclDie && "This DIE should've already been constructed when the " 1247c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "definition DIE was created in " 1248c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "getOrCreateSubprogramDIE"); 12492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DeclLinkageName = SPDecl->getLinkageName(); 125001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola } 1251dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Add function template parameters. 12532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addTemplateParams(SPDie, SP->getTemplateParams()); 1254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Add the linkage name if we have one and it isn't in the Decl. 12562c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef LinkageName = SP->getLinkageName(); 1257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(((LinkageName.empty() || DeclLinkageName.empty()) || 1258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LinkageName == DeclLinkageName) && 1259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines "decl has a linkage name and it is different"); 12604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (DeclLinkageName.empty()) 12614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar addLinkageName(SPDie, LinkageName); 1262cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher 126337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!DeclDie) 126437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 126537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 126637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Refer to the function declaration where all the other attributes will be 126737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // found. 126837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie); 126937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return true; 127037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 127137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 127237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie, 127337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool Minimal) { 127437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!Minimal) 127537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (applySubprogramDefinitionAttributes(SP, SPDie)) 127637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return; 1277dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1278dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // Constructors and operators for anonymous aggregates do not have names. 12792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!SP->getName().empty()) 12802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addString(SPDie, dwarf::DW_AT_name, SP->getName()); 1281dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 128237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Skip the rest of the attributes under -gmlt to save space. 128337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Minimal) 128437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return; 128537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1286dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addSourceLine(SPDie, SP); 1287dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 12888b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher // Add the prototype if we have a prototype and we have a C like 12898b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher // language. 1290aedaa723c26c33d4f9497a79d9d74a3c197fa262David Blaikie uint16_t Language = getLanguage(); 12912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (SP->isPrototyped() && 12926efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 || 12938b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher Language == dwarf::DW_LANG_ObjC)) 1294873cf0a0d7906083578d9b793008348750636138Eric Christopher addFlag(SPDie, dwarf::DW_AT_prototyped); 1295dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 12962c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DISubroutineType SPTy = SP->getType(); 12972c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar assert(SPTy->getTag() == dwarf::DW_TAG_subroutine_type && 12983d33184d9da02fb699827249e0631106252f72faDavid Blaikie "the type of a subprogram should be a subroutine"); 1299dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 13002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar auto Args = SPTy->getTypeArray(); 1301ef2d919f7f767b9d70bc44c4ac918b0a6b540cacEric Christopher // Add a return type. If this is a type like a C/C++ void type we don't add a 1302ef2d919f7f767b9d70bc44c4ac918b0a6b540cacEric Christopher // return type. 13032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Args.size()) 13042c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto Ty = resolve(Args[0])) 13052c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addType(SPDie, Ty); 1306dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 13072c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar unsigned VK = SP->getVirtuality(); 1308dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel if (VK) { 1309798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK); 131036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIELoc *Block = getDIELoc(); 1311dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 13122c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addUInt(*Block, dwarf::DW_FORM_udata, SP->getVirtualIndex()); 1313770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block); 13146129002232c3dda7ca4ef95bba77a829ddf241f4Eric Christopher ContainingTypeMap.insert( 13152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar std::make_pair(&SPDie, resolve(SP->getContainingType()))); 1316dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel } 1317dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 13182c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!SP->isDefinition()) { 1319873cf0a0d7906083578d9b793008348750636138Eric Christopher addFlag(SPDie, dwarf::DW_AT_declaration); 13208b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher 1321dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // Add arguments. Do not add arguments for subprogram definition. They will 1322dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel // be handled while processing variables. 1323dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines constructSubprogramArguments(SPDie, Args); 1324dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel } 1325dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 13262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (SP->isArtificial()) 1327873cf0a0d7906083578d9b793008348750636138Eric Christopher addFlag(SPDie, dwarf::DW_AT_artificial); 1328dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 13292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!SP->isLocalToUnit()) 1330873cf0a0d7906083578d9b793008348750636138Eric Christopher addFlag(SPDie, dwarf::DW_AT_external); 1331dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 13322c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (SP->isOptimized()) 1333873cf0a0d7906083578d9b793008348750636138Eric Christopher addFlag(SPDie, dwarf::DW_AT_APPLE_optimized); 1334dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 13354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (unsigned isa = Asm->getISAEncoding()) 1336dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa); 1337dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 13382c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (SP->isLValueReference()) 133936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addFlag(SPDie, dwarf::DW_AT_reference); 134036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (SP->isRValueReference()) 134236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addFlag(SPDie, dwarf::DW_AT_rvalue_reference); 134336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (SP->isProtected()) 134536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 134636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dwarf::DW_ACCESS_protected); 13472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (SP->isPrivate()) 134836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 134936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dwarf::DW_ACCESS_private); 13502c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (SP->isPublic()) 135136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 135236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dwarf::DW_ACCESS_public); 135336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13542c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (SP->isExplicit()) 135536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addFlag(SPDie, dwarf::DW_AT_explicit); 1356dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel} 1357dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1358161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructSubrangeDIE - Construct subrange DIE from DISubrange. 135936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) { 1360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer); 1361dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy); 13629493dae613847b01b79914502f337814fe3e00acBill Wendling 1363222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling // The LowerBound value defines the lower bounds which is typically zero for 1364222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling // C/C++. The Count value is the number of elements. Values are 64 bit. If 1365222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling // Count == -1 then the array is unbounded and we do not emit 136637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // DW_AT_lower_bound and DW_AT_count attributes. 13672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar int64_t LowerBound = SR->getLowerBound(); 13686afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling int64_t DefaultLowerBound = getDefaultLowerBound(); 13692c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar int64_t Count = SR->getCount(); 1370161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 13716afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound) 1372770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound); 1373222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling 137437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Count != -1) 13759493dae613847b01b79914502f337814fe3e00acBill Wendling // FIXME: An unbounded array should reference the expression that defines 13769493dae613847b01b79914502f337814fe3e00acBill Wendling // the array. 137737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count); 137837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 137937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 138037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesDIE *DwarfUnit::getIndexTyDie() { 138137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (IndexTyDie) 138237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return IndexTyDie; 138337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Construct an integer type to use for indexes. 138437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie); 138537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines addString(*IndexTyDie, dwarf::DW_AT_name, "sizetype"); 138637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t)); 138737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 138837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines dwarf::DW_ATE_unsigned); 138937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return IndexTyDie; 1390161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1391161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1392161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 139336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) { 13942c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (CTy->isVector()) 1395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addFlag(Buffer, dwarf::DW_AT_GNU_vector); 1396161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1397dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher // Emit the element type. 13982c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addType(Buffer, resolve(CTy->getBaseType())); 1399161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1400161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Get an anonymous type for index type. 14018cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher // FIXME: This type should be passed down from the front end 14028cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher // as different languages may have different sizes for indexes. 1403161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel DIE *IdxTy = getIndexTyDie(); 1404161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1405161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Add subranges to array type. 14062c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIArray Elements = CTy->getElements(); 14072c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (unsigned i = 0, N = Elements.size(); i < N; ++i) { 14082c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar // FIXME: Should this really be such a loose cast? 14092c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *Element = dyn_cast_or_null<DebugNode>(Elements[i])) 14102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Element->getTag() == dwarf::DW_TAG_subrange_type) 14112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar constructSubrangeDIE(Buffer, cast<MDSubrange>(Element), IdxTy); 1412161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel } 1413161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1414161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1415953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher/// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType. 141636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) { 14172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIArray Elements = CTy->getElements(); 1418953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher 1419953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher // Add enumerators to enumeration type. 14202c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (unsigned i = 0, N = Elements.size(); i < N; ++i) { 14212c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar auto *Enum = dyn_cast_or_null<MDEnumerator>(Elements[i]); 14222c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Enum) { 1423dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer); 14242c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef Name = Enum->getName(); 1425953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher addString(Enumerator, dwarf::DW_AT_name, Name); 14262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar int64_t Value = Enum->getValue(); 142736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, 142836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Value); 1429953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher } 1430953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher } 14312c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIType DTy = resolve(CTy->getBaseType()); 1432953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher if (DTy) { 1433dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addType(Buffer, DTy); 1434dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addFlag(Buffer, dwarf::DW_AT_enum_class); 1435953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher } 1436161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 1437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1438dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// constructContainingTypeDIEs - Construct DIEs for types that contain 1439dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// vtables. 144036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructContainingTypeDIEs() { 1441dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(), 14426efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher CE = ContainingTypeMap.end(); 14436efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher CI != CE; ++CI) { 1444dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &SPDie = *CI->first; 1445cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie DIDescriptor D(CI->second); 1446cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie if (!D) 14476efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher continue; 1448cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie DIE *NDie = getDIE(D); 14496efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher if (!NDie) 14506efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher continue; 1451dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie); 1452dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel } 1453dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel} 1454dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 1455a1d25b6360a6f40bf1c5651950226640211dc6d0Manman Ren/// constructMemberDIE - Construct member DIE from DIDerivedType. 14562c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarvoid DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT_) { 14572c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar // Downcast to MDDerivedType. 14582c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDDerivedType *DT = cast<MDDerivedType>(DT_); 14592c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar 14602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIE &MemberDie = createAndAddDIE(DT->getTag(), Buffer); 14612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar StringRef Name = DT->getName(); 1462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel if (!Name.empty()) 1463390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky addString(MemberDie, dwarf::DW_AT_name, Name); 1464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 14652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addType(MemberDie, resolve(DT->getBaseType())); 1466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 1467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel addSourceLine(MemberDie, DT); 1468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 14692c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DT->getTag() == dwarf::DW_TAG_inheritance && 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 147536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc(); 1476dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup); 1477dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1478dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 14792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT->getOffsetInBits()); 1480dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus); 1481dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1482dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1483770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie 1484770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie); 14859b93392185d3838cc438629981d7c3fee634176dDavid Blaikie } else { 14862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar uint64_t Size = DT->getSizeInBits(); 14879b93392185d3838cc438629981d7c3fee634176dDavid Blaikie uint64_t FieldSize = getBaseTypeSize(DD, DT); 14889b93392185d3838cc438629981d7c3fee634176dDavid Blaikie uint64_t OffsetInBytes; 14899b93392185d3838cc438629981d7c3fee634176dDavid Blaikie 1490ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (FieldSize && Size != FieldSize) { 149136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Handle bitfield, assume bytes are 8 bits. 149236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8); 149336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size); 14949b93392185d3838cc438629981d7c3fee634176dDavid Blaikie 14952c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar uint64_t Offset = DT->getOffsetInBits(); 14962c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar uint64_t AlignMask = ~(DT->getAlignInBits() - 1); 14979b93392185d3838cc438629981d7c3fee634176dDavid Blaikie uint64_t HiMark = (Offset + FieldSize) & AlignMask; 14989b93392185d3838cc438629981d7c3fee634176dDavid Blaikie uint64_t FieldOffset = (HiMark - FieldSize); 14999b93392185d3838cc438629981d7c3fee634176dDavid Blaikie Offset -= FieldOffset; 15009b93392185d3838cc438629981d7c3fee634176dDavid Blaikie 15019b93392185d3838cc438629981d7c3fee634176dDavid Blaikie // Maybe we need to work from the other end. 15029b93392185d3838cc438629981d7c3fee634176dDavid Blaikie if (Asm->getDataLayout().isLittleEndian()) 15039b93392185d3838cc438629981d7c3fee634176dDavid Blaikie Offset = FieldSize - (Offset + Size); 15049b93392185d3838cc438629981d7c3fee634176dDavid Blaikie addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset); 15059b93392185d3838cc438629981d7c3fee634176dDavid Blaikie 150636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Here DW_AT_data_member_location points to the anonymous 15079b93392185d3838cc438629981d7c3fee634176dDavid Blaikie // field that includes this bit field. 15089b93392185d3838cc438629981d7c3fee634176dDavid Blaikie OffsetInBytes = FieldOffset >> 3; 15099b93392185d3838cc438629981d7c3fee634176dDavid Blaikie } else 15109b93392185d3838cc438629981d7c3fee634176dDavid Blaikie // This is not a bitfield. 15112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar OffsetInBytes = DT->getOffsetInBits() >> 3; 151236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 151336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (DD->getDwarfVersion() <= 2) { 151436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc(); 1515dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1516dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes); 151736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie); 151836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else 151936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addUInt(MemberDie, dwarf::DW_AT_data_member_location, None, 152036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OffsetInBytes); 15219b93392185d3838cc438629981d7c3fee634176dDavid Blaikie } 1522161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel 15232c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DT->isProtected()) 152413aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ACCESS_protected); 15262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (DT->isPrivate()) 152713aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ACCESS_private); 1529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel // Otherwise C++ member and base classes are considered public. 15302c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (DT->isPublic()) 153113aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_ACCESS_public); 15332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DT->isVirtual()) 1534798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, 1535161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel dwarf::DW_VIRTUALITY_virtual); 1536e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel 1537e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel // Objective-C properties. 15382c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (MDNode *PNode = DT->getObjCProperty()) 15396588abf377b7381274236e651462ec83052f6013Devang Patel if (DIEEntry *PropertyDie = getDIEEntry(PNode)) 1540dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4, 1541dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines PropertyDie); 15426588abf377b7381274236e651462ec83052f6013Devang Patel 15432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DT->isArtificial()) 154401bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie addFlag(MemberDie, dwarf::DW_AT_artificial); 1545161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel} 15466b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 1547655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member. 15482c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga NainarDIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT_) { 15492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDDerivedType *DT = cast_or_null<MDDerivedType>(DT_); 15502c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!DT) 1551dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 15526b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 1553655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren // Construct the context before querying for the existence of the DIE in case 1554655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren // such construction creates the DIE. 15552c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIE *ContextDIE = getOrCreateContextDIE(resolve(DT->getScope())); 15568c0fecc39fe7f0928a7592104b4419022ad4b54eDavid Blaikie assert(dwarf::isType(ContextDIE->getTag()) && 15578c0fecc39fe7f0928a7592104b4419022ad4b54eDavid Blaikie "Static member should belong to a type."); 1558655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren 1559dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (DIE *StaticMemberDIE = getDIE(DT)) 1560655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren return StaticMemberDIE; 1561655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren 15622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIE &StaticMemberDIE = createAndAddDIE(DT->getTag(), *ContextDIE, DT); 1563655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren 15642c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIType Ty = resolve(DT->getBaseType()); 15656b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 15662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addString(StaticMemberDIE, dwarf::DW_AT_name, DT->getName()); 15676b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher addType(StaticMemberDIE, Ty); 15686b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher addSourceLine(StaticMemberDIE, DT); 15696b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher addFlag(StaticMemberDIE, dwarf::DW_AT_external); 15706b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher addFlag(StaticMemberDIE, dwarf::DW_AT_declaration); 15716b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 15726b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher // FIXME: We could omit private if the parent is a class_type, and 15736b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher // public if the parent is something else. 15742c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DT->isProtected()) 15756b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 15766b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher dwarf::DW_ACCESS_protected); 15772c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (DT->isPrivate()) 15786b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 15796b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher dwarf::DW_ACCESS_private); 15802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (DT->isPublic()) 15816b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 15826b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher dwarf::DW_ACCESS_public); 15836b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 15842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT->getConstant())) 1585dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addConstantValue(StaticMemberDIE, CI, Ty); 15862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT->getConstant())) 158714268416720155d63f190a6143ee40b3b850e409David Blaikie addConstantFPValue(StaticMemberDIE, CFP); 15886b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 1589dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return &StaticMemberDIE; 15906b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher} 15911d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie 15924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DwarfUnit::emitHeader(bool UseOffsets) { 159337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Emit size of content not including length itself 159437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Asm->OutStreamer.AddComment("Length of Unit"); 159537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Asm->EmitInt32(getHeaderSize() + UnitDie.getSize()); 159637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 15971d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie Asm->OutStreamer.AddComment("DWARF version number"); 15981d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie Asm->EmitInt16(DD->getDwarfVersion()); 15991d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie Asm->OutStreamer.AddComment("Offset Into Abbrev. Section"); 16004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 160136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // We share one abbreviations table across all units so it's always at the 160236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // start of the section. Use a relocatable offset where needed to ensure 160336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // linking doesn't invalidate that offset. 16044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 16054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (!UseOffsets) 16064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar Asm->emitSectionOffset(TLOF.getDwarfAbbrevSection()->getBeginSymbol()); 160736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 160836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Asm->EmitInt32(0); 16094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 16101d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie Asm->OutStreamer.AddComment("Address Size (in bytes)"); 16111d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie Asm->EmitInt8(Asm->getDataLayout().getPointerSize()); 16121d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie} 161336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 161437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid DwarfUnit::initSection(const MCSection *Section) { 161537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(!this->Section); 161637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines this->Section = Section; 161736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 161836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DwarfTypeUnit::emitHeader(bool UseOffsets) { 16204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar DwarfUnit::emitHeader(UseOffsets); 162136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Asm->OutStreamer.AddComment("Type Signature"); 162236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature)); 162336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Asm->OutStreamer.AddComment("Type DIE Offset"); 162436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // In a skeleton type unit there is no type DIE so emit a zero offset. 162536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0, 162636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines sizeof(Ty->getOffset())); 162736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 162836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 162937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool DwarfTypeUnit::isDwoUnit() const { 163037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Since there are no skeleton type units, all type units are dwo type units 163137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // when split DWARF is being used. 163237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return DD->useSplitDwarf(); 163336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 1634