DwarfCompileUnit.cpp revision 06df83c25a7b07b3a19a40bd680c0a205bcc0b9a
1//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains support for constructing a dwarf compile unit. 11// 12//===----------------------------------------------------------------------===// 13 14#define DEBUG_TYPE "dwarfdebug" 15 16#include "DwarfCompileUnit.h" 17#include "DwarfAccelTable.h" 18#include "DwarfDebug.h" 19#include "llvm/ADT/APFloat.h" 20#include "llvm/DIBuilder.h" 21#include "llvm/IR/Constants.h" 22#include "llvm/IR/DataLayout.h" 23#include "llvm/IR/GlobalVariable.h" 24#include "llvm/IR/Instructions.h" 25#include "llvm/Support/Debug.h" 26#include "llvm/Support/ErrorHandling.h" 27#include "llvm/Target/Mangler.h" 28#include "llvm/Target/TargetFrameLowering.h" 29#include "llvm/Target/TargetMachine.h" 30#include "llvm/Target/TargetRegisterInfo.h" 31 32using namespace llvm; 33 34/// CompileUnit - Compile unit constructor. 35CompileUnit::CompileUnit(unsigned UID, unsigned L, DIE *D, AsmPrinter *A, 36 DwarfDebug *DW, DwarfUnits *DWU) 37 : UniqueID(UID), Language(L), CUDie(D), Asm(A), DD(DW), DU(DWU), 38 IndexTyDie(0) { 39 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1); 40} 41 42/// ~CompileUnit - Destructor for compile unit. 43CompileUnit::~CompileUnit() { 44 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j) 45 DIEBlocks[j]->~DIEBlock(); 46} 47 48/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug 49/// information entry. 50DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) { 51 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry); 52 return Value; 53} 54 55/// getDefaultLowerBound - Return the default lower bound for an array. If the 56/// DWARF version doesn't handle the language, return -1. 57int64_t CompileUnit::getDefaultLowerBound() const { 58 switch (Language) { 59 default: 60 break; 61 62 case dwarf::DW_LANG_C89: 63 case dwarf::DW_LANG_C99: 64 case dwarf::DW_LANG_C: 65 case dwarf::DW_LANG_C_plus_plus: 66 case dwarf::DW_LANG_ObjC: 67 case dwarf::DW_LANG_ObjC_plus_plus: 68 return 0; 69 70 case dwarf::DW_LANG_Fortran77: 71 case dwarf::DW_LANG_Fortran90: 72 case dwarf::DW_LANG_Fortran95: 73 return 1; 74 75 // The languages below have valid values only if the DWARF version >= 4. 76 case dwarf::DW_LANG_Java: 77 case dwarf::DW_LANG_Python: 78 case dwarf::DW_LANG_UPC: 79 case dwarf::DW_LANG_D: 80 if (dwarf::DWARF_VERSION >= 4) 81 return 0; 82 break; 83 84 case dwarf::DW_LANG_Ada83: 85 case dwarf::DW_LANG_Ada95: 86 case dwarf::DW_LANG_Cobol74: 87 case dwarf::DW_LANG_Cobol85: 88 case dwarf::DW_LANG_Modula2: 89 case dwarf::DW_LANG_Pascal83: 90 case dwarf::DW_LANG_PLI: 91 if (dwarf::DWARF_VERSION >= 4) 92 return 1; 93 break; 94 } 95 96 return -1; 97} 98 99/// addFlag - Add a flag that is true. 100void CompileUnit::addFlag(DIE *Die, unsigned Attribute) { 101 if (!DD->useDarwinGDBCompat()) 102 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, 103 DIEIntegerOne); 104 else 105 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1); 106} 107 108/// addUInt - Add an unsigned integer attribute data and value. 109/// 110void CompileUnit::addUInt(DIE *Die, unsigned Attribute, 111 unsigned Form, uint64_t Integer) { 112 if (!Form) Form = DIEInteger::BestForm(false, Integer); 113 DIEValue *Value = Integer == 1 ? 114 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer); 115 Die->addValue(Attribute, Form, Value); 116} 117 118/// addSInt - Add an signed integer attribute data and value. 119/// 120void CompileUnit::addSInt(DIE *Die, unsigned Attribute, 121 unsigned Form, int64_t Integer) { 122 if (!Form) Form = DIEInteger::BestForm(true, Integer); 123 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer); 124 Die->addValue(Attribute, Form, Value); 125} 126 127/// addString - Add a string attribute data and value. We always emit a 128/// reference to the string pool instead of immediate strings so that DIEs have 129/// more predictable sizes. In the case of split dwarf we emit an index 130/// into another table which gets us the static offset into the string 131/// table. 132void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) { 133 if (!DD->useSplitDwarf()) { 134 MCSymbol *Symb = DU->getStringPoolEntry(String); 135 DIEValue *Value; 136 if (Asm->needsRelocationsForDwarfStringPool()) 137 Value = new (DIEValueAllocator) DIELabel(Symb); 138 else { 139 MCSymbol *StringPool = DU->getStringPoolSym(); 140 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool); 141 } 142 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value); 143 } else { 144 unsigned idx = DU->getStringPoolIndex(String); 145 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); 146 Die->addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Value); 147 } 148} 149 150/// addLocalString - Add a string attribute data and value. This is guaranteed 151/// to be in the local string pool instead of indirected. 152void CompileUnit::addLocalString(DIE *Die, unsigned Attribute, 153 StringRef String) { 154 MCSymbol *Symb = DU->getStringPoolEntry(String); 155 DIEValue *Value; 156 if (Asm->needsRelocationsForDwarfStringPool()) 157 Value = new (DIEValueAllocator) DIELabel(Symb); 158 else { 159 MCSymbol *StringPool = DU->getStringPoolSym(); 160 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool); 161 } 162 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value); 163} 164 165/// addLabel - Add a Dwarf label attribute data and value. 166/// 167void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form, 168 const MCSymbol *Label) { 169 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); 170 Die->addValue(Attribute, Form, Value); 171} 172 173/// addLabelAddress - Add a dwarf label attribute data and value using 174/// DW_FORM_addr or DW_FORM_GNU_addr_index. 175/// 176void CompileUnit::addLabelAddress(DIE *Die, unsigned Attribute, 177 MCSymbol *Label) { 178 if (!DD->useSplitDwarf()) { 179 if (Label != NULL) { 180 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); 181 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); 182 } else { 183 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0); 184 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); 185 } 186 } else { 187 unsigned idx = DU->getAddrPoolIndex(Label); 188 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); 189 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value); 190 } 191} 192 193/// addOpAddress - Add a dwarf op address data and value using the 194/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index. 195/// 196void CompileUnit::addOpAddress(DIE *Die, MCSymbol *Sym) { 197 198 if (!DD->useSplitDwarf()) { 199 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 200 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym); 201 } else { 202 unsigned idx = DU->getAddrPoolIndex(Sym); 203 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); 204 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index); 205 Die->addValue(0, dwarf::DW_FORM_GNU_addr_index, Value); 206 } 207} 208 209/// addDelta - Add a label delta attribute data and value. 210/// 211void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form, 212 const MCSymbol *Hi, const MCSymbol *Lo) { 213 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo); 214 Die->addValue(Attribute, Form, Value); 215} 216 217/// addDIEEntry - Add a DIE attribute data and value. 218/// 219void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form, 220 DIE *Entry) { 221 Die->addValue(Attribute, Form, createDIEEntry(Entry)); 222} 223 224/// addBlock - Add block data. 225/// 226void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form, 227 DIEBlock *Block) { 228 Block->ComputeSize(Asm); 229 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on. 230 Die->addValue(Attribute, Block->BestForm(), Block); 231} 232 233/// addSourceLine - Add location information to specified debug information 234/// entry. 235void CompileUnit::addSourceLine(DIE *Die, DIVariable V) { 236 // Verify variable. 237 if (!V.Verify()) 238 return; 239 240 unsigned Line = V.getLineNumber(); 241 if (Line == 0) 242 return; 243 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(), 244 V.getContext().getDirectory()); 245 assert(FileID && "Invalid file id"); 246 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 247 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 248} 249 250/// addSourceLine - Add location information to specified debug information 251/// entry. 252void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) { 253 // Verify global variable. 254 if (!G.Verify()) 255 return; 256 257 unsigned Line = G.getLineNumber(); 258 if (Line == 0) 259 return; 260 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory()); 261 assert(FileID && "Invalid file id"); 262 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 263 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 264} 265 266/// addSourceLine - Add location information to specified debug information 267/// entry. 268void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) { 269 // Verify subprogram. 270 if (!SP.Verify()) 271 return; 272 273 // If the line number is 0, don't add it. 274 unsigned Line = SP.getLineNumber(); 275 if (Line == 0) 276 return; 277 278 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), 279 SP.getDirectory()); 280 assert(FileID && "Invalid file id"); 281 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 282 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 283} 284 285/// addSourceLine - Add location information to specified debug information 286/// entry. 287void CompileUnit::addSourceLine(DIE *Die, DIType Ty) { 288 // Verify type. 289 if (!Ty.Verify()) 290 return; 291 292 unsigned Line = Ty.getLineNumber(); 293 if (Line == 0) 294 return; 295 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), 296 Ty.getDirectory()); 297 assert(FileID && "Invalid file id"); 298 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 299 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 300} 301 302/// addSourceLine - Add location information to specified debug information 303/// entry. 304void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) { 305 // Verify type. 306 if (!Ty.Verify()) 307 return; 308 309 unsigned Line = Ty.getLineNumber(); 310 if (Line == 0) 311 return; 312 DIFile File = Ty.getFile(); 313 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(), 314 File.getDirectory()); 315 assert(FileID && "Invalid file id"); 316 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 317 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 318} 319 320/// addSourceLine - Add location information to specified debug information 321/// entry. 322void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) { 323 // Verify namespace. 324 if (!NS.Verify()) 325 return; 326 327 unsigned Line = NS.getLineNumber(); 328 if (Line == 0) 329 return; 330 StringRef FN = NS.getFilename(); 331 332 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory()); 333 assert(FileID && "Invalid file id"); 334 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 335 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 336} 337 338/// addVariableAddress - Add DW_AT_location attribute for a 339/// DbgVariable based on provided MachineLocation. 340void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die, 341 MachineLocation Location) { 342 if (DV->variableHasComplexAddress()) 343 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location); 344 else if (DV->isBlockByrefVariable()) 345 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location); 346 else 347 addAddress(Die, dwarf::DW_AT_location, Location); 348} 349 350/// addRegisterOp - Add register operand. 351void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) { 352 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 353 unsigned DWReg = RI->getDwarfRegNum(Reg, false); 354 if (DWReg < 32) 355 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg); 356 else { 357 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx); 358 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg); 359 } 360} 361 362/// addRegisterOffset - Add register offset. 363void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg, 364 int64_t Offset) { 365 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 366 unsigned DWReg = RI->getDwarfRegNum(Reg, false); 367 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 368 if (Reg == TRI->getFrameRegister(*Asm->MF)) 369 // If variable offset is based in frame register then use fbreg. 370 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg); 371 else if (DWReg < 32) 372 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg); 373 else { 374 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx); 375 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg); 376 } 377 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset); 378} 379 380/// addAddress - Add an address attribute to a die based on the location 381/// provided. 382void CompileUnit::addAddress(DIE *Die, unsigned Attribute, 383 const MachineLocation &Location) { 384 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 385 386 if (Location.isReg()) 387 addRegisterOp(Block, Location.getReg()); 388 else 389 addRegisterOffset(Block, Location.getReg(), Location.getOffset()); 390 391 // Now attach the location information to the DIE. 392 addBlock(Die, Attribute, 0, Block); 393} 394 395/// addComplexAddress - Start with the address based on the location provided, 396/// and generate the DWARF information necessary to find the actual variable 397/// given the extra address information encoded in the DIVariable, starting from 398/// the starting location. Add the DWARF information to the die. 399/// 400void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die, 401 unsigned Attribute, 402 const MachineLocation &Location) { 403 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 404 unsigned N = DV->getNumAddrElements(); 405 unsigned i = 0; 406 if (Location.isReg()) { 407 if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) { 408 // If first address element is OpPlus then emit 409 // DW_OP_breg + Offset instead of DW_OP_reg + Offset. 410 addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1)); 411 i = 2; 412 } else 413 addRegisterOp(Block, Location.getReg()); 414 } 415 else 416 addRegisterOffset(Block, Location.getReg(), Location.getOffset()); 417 418 for (;i < N; ++i) { 419 uint64_t Element = DV->getAddrElement(i); 420 if (Element == DIBuilder::OpPlus) { 421 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 422 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i)); 423 } else if (Element == DIBuilder::OpDeref) { 424 if (!Location.isReg()) 425 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 426 } else llvm_unreachable("unknown DIBuilder Opcode"); 427 } 428 429 // Now attach the location information to the DIE. 430 addBlock(Die, Attribute, 0, Block); 431} 432 433/* Byref variables, in Blocks, are declared by the programmer as "SomeType 434 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and 435 gives the variable VarName either the struct, or a pointer to the struct, as 436 its type. This is necessary for various behind-the-scenes things the 437 compiler needs to do with by-reference variables in Blocks. 438 439 However, as far as the original *programmer* is concerned, the variable 440 should still have type 'SomeType', as originally declared. 441 442 The function getBlockByrefType dives into the __Block_byref_x_VarName 443 struct to find the original type of the variable, which is then assigned to 444 the variable's Debug Information Entry as its real type. So far, so good. 445 However now the debugger will expect the variable VarName to have the type 446 SomeType. So we need the location attribute for the variable to be an 447 expression that explains to the debugger how to navigate through the 448 pointers and struct to find the actual variable of type SomeType. 449 450 The following function does just that. We start by getting 451 the "normal" location for the variable. This will be the location 452 of either the struct __Block_byref_x_VarName or the pointer to the 453 struct __Block_byref_x_VarName. 454 455 The struct will look something like: 456 457 struct __Block_byref_x_VarName { 458 ... <various fields> 459 struct __Block_byref_x_VarName *forwarding; 460 ... <various other fields> 461 SomeType VarName; 462 ... <maybe more fields> 463 }; 464 465 If we are given the struct directly (as our starting point) we 466 need to tell the debugger to: 467 468 1). Add the offset of the forwarding field. 469 470 2). Follow that pointer to get the real __Block_byref_x_VarName 471 struct to use (the real one may have been copied onto the heap). 472 473 3). Add the offset for the field VarName, to find the actual variable. 474 475 If we started with a pointer to the struct, then we need to 476 dereference that pointer first, before the other steps. 477 Translating this into DWARF ops, we will need to append the following 478 to the current location description for the variable: 479 480 DW_OP_deref -- optional, if we start with a pointer 481 DW_OP_plus_uconst <forward_fld_offset> 482 DW_OP_deref 483 DW_OP_plus_uconst <varName_fld_offset> 484 485 That is what this function does. */ 486 487/// addBlockByrefAddress - Start with the address based on the location 488/// provided, and generate the DWARF information necessary to find the 489/// actual Block variable (navigating the Block struct) based on the 490/// starting location. Add the DWARF information to the die. For 491/// more information, read large comment just above here. 492/// 493void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die, 494 unsigned Attribute, 495 const MachineLocation &Location) { 496 DIType Ty = DV->getType(); 497 DIType TmpTy = Ty; 498 unsigned Tag = Ty.getTag(); 499 bool isPointer = false; 500 501 StringRef varName = DV->getName(); 502 503 if (Tag == dwarf::DW_TAG_pointer_type) { 504 DIDerivedType DTy = DIDerivedType(Ty); 505 TmpTy = DTy.getTypeDerivedFrom(); 506 isPointer = true; 507 } 508 509 DICompositeType blockStruct = DICompositeType(TmpTy); 510 511 // Find the __forwarding field and the variable field in the __Block_byref 512 // struct. 513 DIArray Fields = blockStruct.getTypeArray(); 514 DIDescriptor varField = DIDescriptor(); 515 DIDescriptor forwardingField = DIDescriptor(); 516 517 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) { 518 DIDescriptor Element = Fields.getElement(i); 519 DIDerivedType DT = DIDerivedType(Element); 520 StringRef fieldName = DT.getName(); 521 if (fieldName == "__forwarding") 522 forwardingField = Element; 523 else if (fieldName == varName) 524 varField = Element; 525 } 526 527 // Get the offsets for the forwarding field and the variable field. 528 unsigned forwardingFieldOffset = 529 DIDerivedType(forwardingField).getOffsetInBits() >> 3; 530 unsigned varFieldOffset = 531 DIDerivedType(varField).getOffsetInBits() >> 3; 532 533 // Decode the original location, and use that as the start of the byref 534 // variable's location. 535 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 536 537 if (Location.isReg()) 538 addRegisterOp(Block, Location.getReg()); 539 else 540 addRegisterOffset(Block, Location.getReg(), Location.getOffset()); 541 542 // If we started with a pointer to the __Block_byref... struct, then 543 // the first thing we need to do is dereference the pointer (DW_OP_deref). 544 if (isPointer) 545 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 546 547 // Next add the offset for the '__forwarding' field: 548 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in 549 // adding the offset if it's 0. 550 if (forwardingFieldOffset > 0) { 551 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 552 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset); 553 } 554 555 // Now dereference the __forwarding field to get to the real __Block_byref 556 // struct: DW_OP_deref. 557 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 558 559 // Now that we've got the real __Block_byref... struct, add the offset 560 // for the variable's field to get to the location of the actual variable: 561 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0. 562 if (varFieldOffset > 0) { 563 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 564 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset); 565 } 566 567 // Now attach the location information to the DIE. 568 addBlock(Die, Attribute, 0, Block); 569} 570 571/// isTypeSigned - Return true if the type is signed. 572static bool isTypeSigned(DIType Ty, int *SizeInBits) { 573 if (Ty.isDerivedType()) 574 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits); 575 if (Ty.isBasicType()) 576 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed 577 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) { 578 *SizeInBits = Ty.getSizeInBits(); 579 return true; 580 } 581 return false; 582} 583 584/// addConstantValue - Add constant value entry in variable DIE. 585bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO, 586 DIType Ty) { 587 assert(MO.isImm() && "Invalid machine operand!"); 588 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 589 int SizeInBits = -1; 590 bool SignedConstant = isTypeSigned(Ty, &SizeInBits); 591 unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata; 592 switch (SizeInBits) { 593 case 8: Form = dwarf::DW_FORM_data1; break; 594 case 16: Form = dwarf::DW_FORM_data2; break; 595 case 32: Form = dwarf::DW_FORM_data4; break; 596 case 64: Form = dwarf::DW_FORM_data8; break; 597 default: break; 598 } 599 SignedConstant ? addSInt(Block, 0, Form, MO.getImm()) 600 : addUInt(Block, 0, Form, MO.getImm()); 601 602 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 603 return true; 604} 605 606/// addConstantFPValue - Add constant value entry in variable DIE. 607bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) { 608 assert (MO.isFPImm() && "Invalid machine operand!"); 609 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 610 APFloat FPImm = MO.getFPImm()->getValueAPF(); 611 612 // Get the raw data form of the floating point. 613 const APInt FltVal = FPImm.bitcastToAPInt(); 614 const char *FltPtr = (const char*)FltVal.getRawData(); 615 616 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte. 617 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 618 int Incr = (LittleEndian ? 1 : -1); 619 int Start = (LittleEndian ? 0 : NumBytes - 1); 620 int Stop = (LittleEndian ? NumBytes : -1); 621 622 // Output the constant to DWARF one byte at a time. 623 for (; Start != Stop; Start += Incr) 624 addUInt(Block, 0, dwarf::DW_FORM_data1, 625 (unsigned char)0xFF & FltPtr[Start]); 626 627 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 628 return true; 629} 630 631/// addConstantFPValue - Add constant value entry in variable DIE. 632bool CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) { 633 return addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), false); 634} 635 636/// addConstantValue - Add constant value entry in variable DIE. 637bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI, 638 bool Unsigned) { 639 return addConstantValue(Die, CI->getValue(), Unsigned); 640} 641 642// addConstantValue - Add constant value entry in variable DIE. 643bool CompileUnit::addConstantValue(DIE *Die, const APInt &Val, 644 bool Unsigned) { 645 unsigned CIBitWidth = Val.getBitWidth(); 646 if (CIBitWidth <= 64) { 647 unsigned form = 0; 648 switch (CIBitWidth) { 649 case 8: form = dwarf::DW_FORM_data1; break; 650 case 16: form = dwarf::DW_FORM_data2; break; 651 case 32: form = dwarf::DW_FORM_data4; break; 652 case 64: form = dwarf::DW_FORM_data8; break; 653 default: 654 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata; 655 } 656 if (Unsigned) 657 addUInt(Die, dwarf::DW_AT_const_value, form, Val.getZExtValue()); 658 else 659 addSInt(Die, dwarf::DW_AT_const_value, form, Val.getSExtValue()); 660 return true; 661 } 662 663 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 664 665 // Get the raw data form of the large APInt. 666 const uint64_t *Ptr64 = Val.getRawData(); 667 668 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte. 669 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 670 671 // Output the constant to DWARF one byte at a time. 672 for (int i = 0; i < NumBytes; i++) { 673 uint8_t c; 674 if (LittleEndian) 675 c = Ptr64[i / 8] >> (8 * (i & 7)); 676 else 677 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7)); 678 addUInt(Block, 0, dwarf::DW_FORM_data1, c); 679 } 680 681 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 682 return true; 683} 684 685/// addTemplateParams - Add template parameters in buffer. 686void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) { 687 // Add template parameters. 688 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) { 689 DIDescriptor Element = TParams.getElement(i); 690 if (Element.isTemplateTypeParameter()) 691 Buffer.addChild(getOrCreateTemplateTypeParameterDIE( 692 DITemplateTypeParameter(Element))); 693 else if (Element.isTemplateValueParameter()) 694 Buffer.addChild(getOrCreateTemplateValueParameterDIE( 695 DITemplateValueParameter(Element))); 696 } 697} 698 699/// getOrCreateContextDIE - Get context owner's DIE. 700DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) { 701 if (Context.isType()) 702 return getOrCreateTypeDIE(DIType(Context)); 703 else if (Context.isNameSpace()) 704 return getOrCreateNameSpace(DINameSpace(Context)); 705 else if (Context.isSubprogram()) 706 return getOrCreateSubprogramDIE(DISubprogram(Context)); 707 else 708 return getDIE(Context); 709} 710 711/// addToContextOwner - Add Die into the list of its context owner's children. 712void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) { 713 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) 714 ContextDIE->addChild(Die); 715 else 716 addDie(Die); 717} 718 719/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 720/// given DIType. 721DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) { 722 DIType Ty(TyNode); 723 if (!Ty.Verify()) 724 return NULL; 725 DIE *TyDIE = getDIE(Ty); 726 if (TyDIE) 727 return TyDIE; 728 729 // Create new type. 730 TyDIE = new DIE(dwarf::DW_TAG_base_type); 731 insertDIE(Ty, TyDIE); 732 if (Ty.isBasicType()) 733 constructTypeDIE(*TyDIE, DIBasicType(Ty)); 734 else if (Ty.isCompositeType()) 735 constructTypeDIE(*TyDIE, DICompositeType(Ty)); 736 else { 737 assert(Ty.isDerivedType() && "Unknown kind of DIType"); 738 constructTypeDIE(*TyDIE, DIDerivedType(Ty)); 739 } 740 // If this is a named finished type then include it in the list of types 741 // for the accelerator tables. 742 if (!Ty.getName().empty() && !Ty.isForwardDecl()) { 743 bool IsImplementation = 0; 744 if (Ty.isCompositeType()) { 745 DICompositeType CT(Ty); 746 // A runtime language of 0 actually means C/C++ and that any 747 // non-negative value is some version of Objective-C/C++. 748 IsImplementation = (CT.getRunTimeLang() == 0) || 749 CT.isObjcClassComplete(); 750 } 751 unsigned Flags = IsImplementation ? 752 DwarfAccelTable::eTypeFlagClassIsImplementation : 0; 753 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags)); 754 } 755 756 addToContextOwner(TyDIE, Ty.getContext()); 757 return TyDIE; 758} 759 760/// addType - Add a new type attribute to the specified entity. 761void CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) { 762 if (!Ty.Verify()) 763 return; 764 765 // Check for pre-existence. 766 DIEEntry *Entry = getDIEEntry(Ty); 767 // If it exists then use the existing value. 768 if (Entry) { 769 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry); 770 return; 771 } 772 773 // Construct type. 774 DIE *Buffer = getOrCreateTypeDIE(Ty); 775 776 // Set up proxy. 777 Entry = createDIEEntry(Buffer); 778 insertDIEEntry(Ty, Entry); 779 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry); 780 781 // If this is a complete composite type then include it in the 782 // list of global types. 783 addGlobalType(Ty); 784} 785 786/// addGlobalType - Add a new global type to the compile unit. 787/// 788void CompileUnit::addGlobalType(DIType Ty) { 789 DIDescriptor Context = Ty.getContext(); 790 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl() 791 && (!Context || Context.isCompileUnit() || Context.isFile() 792 || Context.isNameSpace())) 793 if (DIEEntry *Entry = getDIEEntry(Ty)) 794 GlobalTypes[Ty.getName()] = Entry->getEntry(); 795} 796 797/// addPubTypes - Add type for pubtypes section. 798void CompileUnit::addPubTypes(DISubprogram SP) { 799 DICompositeType SPTy = SP.getType(); 800 unsigned SPTag = SPTy.getTag(); 801 if (SPTag != dwarf::DW_TAG_subroutine_type) 802 return; 803 804 DIArray Args = SPTy.getTypeArray(); 805 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) { 806 DIType ATy(Args.getElement(i)); 807 if (!ATy.Verify()) 808 continue; 809 addGlobalType(ATy); 810 } 811} 812 813/// constructTypeDIE - Construct basic type die from DIBasicType. 814void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) { 815 // Get core information. 816 StringRef Name = BTy.getName(); 817 // Add name if not anonymous or intermediate type. 818 if (!Name.empty()) 819 addString(&Buffer, dwarf::DW_AT_name, Name); 820 821 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) { 822 Buffer.setTag(dwarf::DW_TAG_unspecified_type); 823 // Unspecified types has only name, nothing else. 824 return; 825 } 826 827 Buffer.setTag(dwarf::DW_TAG_base_type); 828 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 829 BTy.getEncoding()); 830 831 uint64_t Size = BTy.getSizeInBits() >> 3; 832 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 833} 834 835/// constructTypeDIE - Construct derived type die from DIDerivedType. 836void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) { 837 // Get core information. 838 StringRef Name = DTy.getName(); 839 uint64_t Size = DTy.getSizeInBits() >> 3; 840 unsigned Tag = DTy.getTag(); 841 842 // FIXME - Workaround for templates. 843 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type; 844 845 Buffer.setTag(Tag); 846 847 // Map to main type, void will not have a type. 848 DIType FromTy = DTy.getTypeDerivedFrom(); 849 addType(&Buffer, FromTy); 850 851 // Add name if not anonymous or intermediate type. 852 if (!Name.empty()) 853 addString(&Buffer, dwarf::DW_AT_name, Name); 854 855 // Add size if non-zero (derived types might be zero-sized.) 856 if (Size && Tag != dwarf::DW_TAG_pointer_type) 857 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 858 859 if (Tag == dwarf::DW_TAG_ptr_to_member_type) 860 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 861 getOrCreateTypeDIE(DTy.getClassType())); 862 // Add source line info if available and TyDesc is not a forward declaration. 863 if (!DTy.isForwardDecl()) 864 addSourceLine(&Buffer, DTy); 865} 866 867/// constructTypeDIE - Construct type DIE from DICompositeType. 868void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { 869 // Get core information. 870 StringRef Name = CTy.getName(); 871 872 uint64_t Size = CTy.getSizeInBits() >> 3; 873 unsigned Tag = CTy.getTag(); 874 Buffer.setTag(Tag); 875 876 switch (Tag) { 877 case dwarf::DW_TAG_array_type: 878 constructArrayTypeDIE(Buffer, &CTy); 879 break; 880 case dwarf::DW_TAG_enumeration_type: { 881 DIArray Elements = CTy.getTypeArray(); 882 883 // Add enumerators to enumeration type. 884 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 885 DIE *ElemDie = NULL; 886 DIDescriptor Enum(Elements.getElement(i)); 887 if (Enum.isEnumerator()) { 888 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum)); 889 Buffer.addChild(ElemDie); 890 } 891 } 892 DIType DTy = CTy.getTypeDerivedFrom(); 893 if (DTy.Verify()) { 894 addType(&Buffer, DTy); 895 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1); 896 } 897 } 898 break; 899 case dwarf::DW_TAG_subroutine_type: { 900 // Add return type. 901 DIArray Elements = CTy.getTypeArray(); 902 DIDescriptor RTy = Elements.getElement(0); 903 addType(&Buffer, DIType(RTy)); 904 905 bool isPrototyped = true; 906 // Add arguments. 907 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) { 908 DIDescriptor Ty = Elements.getElement(i); 909 if (Ty.isUnspecifiedParameter()) { 910 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters); 911 Buffer.addChild(Arg); 912 isPrototyped = false; 913 } else { 914 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 915 addType(Arg, DIType(Ty)); 916 if (DIType(Ty).isArtificial()) 917 addFlag(Arg, dwarf::DW_AT_artificial); 918 Buffer.addChild(Arg); 919 } 920 } 921 // Add prototype flag if we're dealing with a C language and the 922 // function has been prototyped. 923 if (isPrototyped && 924 (Language == dwarf::DW_LANG_C89 || 925 Language == dwarf::DW_LANG_C99 || 926 Language == dwarf::DW_LANG_ObjC)) 927 addFlag(&Buffer, dwarf::DW_AT_prototyped); 928 } 929 break; 930 case dwarf::DW_TAG_structure_type: 931 case dwarf::DW_TAG_union_type: 932 case dwarf::DW_TAG_class_type: { 933 // Add elements to structure type. 934 DIArray Elements = CTy.getTypeArray(); 935 936 // A forward struct declared type may not have elements available. 937 unsigned N = Elements.getNumElements(); 938 if (N == 0) 939 break; 940 941 // Add elements to structure type. 942 for (unsigned i = 0; i < N; ++i) { 943 DIDescriptor Element = Elements.getElement(i); 944 DIE *ElemDie = NULL; 945 if (Element.isSubprogram()) { 946 DISubprogram SP(Element); 947 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element)); 948 if (SP.isProtected()) 949 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 950 dwarf::DW_ACCESS_protected); 951 else if (SP.isPrivate()) 952 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 953 dwarf::DW_ACCESS_private); 954 else 955 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 956 dwarf::DW_ACCESS_public); 957 if (SP.isExplicit()) 958 addFlag(ElemDie, dwarf::DW_AT_explicit); 959 } else if (Element.isDerivedType()) { 960 DIDerivedType DDTy(Element); 961 if (DDTy.getTag() == dwarf::DW_TAG_friend) { 962 ElemDie = new DIE(dwarf::DW_TAG_friend); 963 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend); 964 } else if (DDTy.isStaticMember()) 965 ElemDie = createStaticMemberDIE(DDTy); 966 else 967 ElemDie = createMemberDIE(DDTy); 968 } else if (Element.isObjCProperty()) { 969 DIObjCProperty Property(Element); 970 ElemDie = new DIE(Property.getTag()); 971 StringRef PropertyName = Property.getObjCPropertyName(); 972 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName); 973 addType(ElemDie, Property.getType()); 974 addSourceLine(ElemDie, Property); 975 StringRef GetterName = Property.getObjCPropertyGetterName(); 976 if (!GetterName.empty()) 977 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName); 978 StringRef SetterName = Property.getObjCPropertySetterName(); 979 if (!SetterName.empty()) 980 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName); 981 unsigned PropertyAttributes = 0; 982 if (Property.isReadOnlyObjCProperty()) 983 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly; 984 if (Property.isReadWriteObjCProperty()) 985 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite; 986 if (Property.isAssignObjCProperty()) 987 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign; 988 if (Property.isRetainObjCProperty()) 989 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain; 990 if (Property.isCopyObjCProperty()) 991 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy; 992 if (Property.isNonAtomicObjCProperty()) 993 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic; 994 if (PropertyAttributes) 995 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0, 996 PropertyAttributes); 997 998 DIEEntry *Entry = getDIEEntry(Element); 999 if (!Entry) { 1000 Entry = createDIEEntry(ElemDie); 1001 insertDIEEntry(Element, Entry); 1002 } 1003 } else 1004 continue; 1005 Buffer.addChild(ElemDie); 1006 } 1007 1008 if (CTy.isAppleBlockExtension()) 1009 addFlag(&Buffer, dwarf::DW_AT_APPLE_block); 1010 1011 DICompositeType ContainingType = CTy.getContainingType(); 1012 if (DIDescriptor(ContainingType).isCompositeType()) 1013 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 1014 getOrCreateTypeDIE(DIType(ContainingType))); 1015 else { 1016 DIDescriptor Context = CTy.getContext(); 1017 addToContextOwner(&Buffer, Context); 1018 } 1019 1020 if (CTy.isObjcClassComplete()) 1021 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type); 1022 1023 // Add template parameters to a class, structure or union types. 1024 // FIXME: The support isn't in the metadata for this yet. 1025 if (Tag == dwarf::DW_TAG_class_type || 1026 Tag == dwarf::DW_TAG_structure_type || 1027 Tag == dwarf::DW_TAG_union_type) 1028 addTemplateParams(Buffer, CTy.getTemplateParams()); 1029 1030 break; 1031 } 1032 default: 1033 break; 1034 } 1035 1036 // Add name if not anonymous or intermediate type. 1037 if (!Name.empty()) 1038 addString(&Buffer, dwarf::DW_AT_name, Name); 1039 1040 if (Tag == dwarf::DW_TAG_enumeration_type || 1041 Tag == dwarf::DW_TAG_class_type || 1042 Tag == dwarf::DW_TAG_structure_type || 1043 Tag == dwarf::DW_TAG_union_type) { 1044 // Add size if non-zero (derived types might be zero-sized.) 1045 // TODO: Do we care about size for enum forward declarations? 1046 if (Size) 1047 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 1048 else if (!CTy.isForwardDecl()) 1049 // Add zero size if it is not a forward declaration. 1050 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0); 1051 1052 // If we're a forward decl, say so. 1053 if (CTy.isForwardDecl()) 1054 addFlag(&Buffer, dwarf::DW_AT_declaration); 1055 1056 // Add source line info if available. 1057 if (!CTy.isForwardDecl()) 1058 addSourceLine(&Buffer, CTy); 1059 1060 // No harm in adding the runtime language to the declaration. 1061 unsigned RLang = CTy.getRunTimeLang(); 1062 if (RLang) 1063 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, 1064 dwarf::DW_FORM_data1, RLang); 1065 } 1066} 1067 1068/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE 1069/// for the given DITemplateTypeParameter. 1070DIE * 1071CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) { 1072 DIE *ParamDIE = getDIE(TP); 1073 if (ParamDIE) 1074 return ParamDIE; 1075 1076 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter); 1077 addType(ParamDIE, TP.getType()); 1078 addString(ParamDIE, dwarf::DW_AT_name, TP.getName()); 1079 return ParamDIE; 1080} 1081 1082/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE 1083/// for the given DITemplateValueParameter. 1084DIE * 1085CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){ 1086 DIE *ParamDIE = getDIE(TPV); 1087 if (ParamDIE) 1088 return ParamDIE; 1089 1090 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter); 1091 addType(ParamDIE, TPV.getType()); 1092 if (!TPV.getName().empty()) 1093 addString(ParamDIE, dwarf::DW_AT_name, TPV.getName()); 1094 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata, 1095 TPV.getValue()); 1096 return ParamDIE; 1097} 1098 1099/// getOrCreateNameSpace - Create a DIE for DINameSpace. 1100DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) { 1101 DIE *NDie = getDIE(NS); 1102 if (NDie) 1103 return NDie; 1104 NDie = new DIE(dwarf::DW_TAG_namespace); 1105 insertDIE(NS, NDie); 1106 if (!NS.getName().empty()) { 1107 addString(NDie, dwarf::DW_AT_name, NS.getName()); 1108 addAccelNamespace(NS.getName(), NDie); 1109 } else 1110 addAccelNamespace("(anonymous namespace)", NDie); 1111 addSourceLine(NDie, NS); 1112 addToContextOwner(NDie, NS.getContext()); 1113 return NDie; 1114} 1115 1116/// getRealLinkageName - If special LLVM prefix that is used to inform the asm 1117/// printer to not emit usual symbol prefix before the symbol name is used then 1118/// return linkage name after skipping this special LLVM prefix. 1119static StringRef getRealLinkageName(StringRef LinkageName) { 1120 char One = '\1'; 1121 if (LinkageName.startswith(StringRef(&One, 1))) 1122 return LinkageName.substr(1); 1123 return LinkageName; 1124} 1125 1126/// getOrCreateSubprogramDIE - Create new DIE using SP. 1127DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) { 1128 DIE *SPDie = getDIE(SP); 1129 if (SPDie) 1130 return SPDie; 1131 1132 SPDie = new DIE(dwarf::DW_TAG_subprogram); 1133 1134 // DW_TAG_inlined_subroutine may refer to this DIE. 1135 insertDIE(SP, SPDie); 1136 1137 DISubprogram SPDecl = SP.getFunctionDeclaration(); 1138 DIE *DeclDie = NULL; 1139 if (SPDecl.isSubprogram()) { 1140 DeclDie = getOrCreateSubprogramDIE(SPDecl); 1141 } 1142 1143 // Add to context owner. 1144 addToContextOwner(SPDie, SP.getContext()); 1145 1146 // Add function template parameters. 1147 addTemplateParams(*SPDie, SP.getTemplateParams()); 1148 1149 // Unfortunately this code needs to stay here instead of below the 1150 // AT_specification code in order to work around a bug in older 1151 // gdbs that requires the linkage name to resolve multiple template 1152 // functions. 1153 // TODO: Remove this set of code when we get rid of the old gdb 1154 // compatibility. 1155 StringRef LinkageName = SP.getLinkageName(); 1156 if (!LinkageName.empty() && DD->useDarwinGDBCompat()) 1157 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, 1158 getRealLinkageName(LinkageName)); 1159 1160 // If this DIE is going to refer declaration info using AT_specification 1161 // then there is no need to add other attributes. 1162 if (DeclDie) { 1163 // Refer function declaration directly. 1164 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 1165 DeclDie); 1166 1167 return SPDie; 1168 } 1169 1170 // Add the linkage name if we have one. 1171 if (!LinkageName.empty() && !DD->useDarwinGDBCompat()) 1172 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, 1173 getRealLinkageName(LinkageName)); 1174 1175 // Constructors and operators for anonymous aggregates do not have names. 1176 if (!SP.getName().empty()) 1177 addString(SPDie, dwarf::DW_AT_name, SP.getName()); 1178 1179 addSourceLine(SPDie, SP); 1180 1181 // Add the prototype if we have a prototype and we have a C like 1182 // language. 1183 if (SP.isPrototyped() && 1184 (Language == dwarf::DW_LANG_C89 || 1185 Language == dwarf::DW_LANG_C99 || 1186 Language == dwarf::DW_LANG_ObjC)) 1187 addFlag(SPDie, dwarf::DW_AT_prototyped); 1188 1189 // Add Return Type. 1190 DICompositeType SPTy = SP.getType(); 1191 DIArray Args = SPTy.getTypeArray(); 1192 unsigned SPTag = SPTy.getTag(); 1193 1194 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type) 1195 addType(SPDie, SPTy); 1196 else 1197 addType(SPDie, DIType(Args.getElement(0))); 1198 1199 unsigned VK = SP.getVirtuality(); 1200 if (VK) { 1201 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK); 1202 DIEBlock *Block = getDIEBlock(); 1203 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1204 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex()); 1205 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block); 1206 ContainingTypeMap.insert(std::make_pair(SPDie, 1207 SP.getContainingType())); 1208 } 1209 1210 if (!SP.isDefinition()) { 1211 addFlag(SPDie, dwarf::DW_AT_declaration); 1212 1213 // Add arguments. Do not add arguments for subprogram definition. They will 1214 // be handled while processing variables. 1215 DICompositeType SPTy = SP.getType(); 1216 DIArray Args = SPTy.getTypeArray(); 1217 unsigned SPTag = SPTy.getTag(); 1218 1219 if (SPTag == dwarf::DW_TAG_subroutine_type) 1220 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1221 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1222 DIType ATy = DIType(Args.getElement(i)); 1223 addType(Arg, ATy); 1224 if (ATy.isArtificial()) 1225 addFlag(Arg, dwarf::DW_AT_artificial); 1226 SPDie->addChild(Arg); 1227 } 1228 } 1229 1230 if (SP.isArtificial()) 1231 addFlag(SPDie, dwarf::DW_AT_artificial); 1232 1233 if (!SP.isLocalToUnit()) 1234 addFlag(SPDie, dwarf::DW_AT_external); 1235 1236 if (SP.isOptimized()) 1237 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized); 1238 1239 if (unsigned isa = Asm->getISAEncoding()) { 1240 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa); 1241 } 1242 1243 return SPDie; 1244} 1245 1246// Return const expression if value is a GEP to access merged global 1247// constant. e.g. 1248// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0) 1249static const ConstantExpr *getMergedGlobalExpr(const Value *V) { 1250 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V); 1251 if (!CE || CE->getNumOperands() != 3 || 1252 CE->getOpcode() != Instruction::GetElementPtr) 1253 return NULL; 1254 1255 // First operand points to a global struct. 1256 Value *Ptr = CE->getOperand(0); 1257 if (!isa<GlobalValue>(Ptr) || 1258 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType())) 1259 return NULL; 1260 1261 // Second operand is zero. 1262 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1)); 1263 if (!CI || !CI->isZero()) 1264 return NULL; 1265 1266 // Third operand is offset. 1267 if (!isa<ConstantInt>(CE->getOperand(2))) 1268 return NULL; 1269 1270 return CE; 1271} 1272 1273/// createGlobalVariableDIE - create global variable DIE. 1274void CompileUnit::createGlobalVariableDIE(const MDNode *N) { 1275 // Check for pre-existence. 1276 if (getDIE(N)) 1277 return; 1278 1279 DIGlobalVariable GV(N); 1280 if (!GV.Verify()) 1281 return; 1282 1283 DIDescriptor GVContext = GV.getContext(); 1284 DIType GTy = GV.getType(); 1285 1286 // If this is a static data member definition, some attributes belong 1287 // to the declaration DIE. 1288 DIE *VariableDIE = NULL; 1289 bool IsStaticMember = false; 1290 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration(); 1291 if (SDMDecl.Verify()) { 1292 assert(SDMDecl.isStaticMember() && "Expected static member decl"); 1293 // We need the declaration DIE that is in the static member's class. 1294 // But that class might not exist in the DWARF yet. 1295 // Creating the class will create the static member decl DIE. 1296 getOrCreateContextDIE(SDMDecl.getContext()); 1297 VariableDIE = getDIE(SDMDecl); 1298 assert(VariableDIE && "Static member decl has no context?"); 1299 IsStaticMember = true; 1300 } 1301 1302 // If this is not a static data member definition, create the variable 1303 // DIE and add the initial set of attributes to it. 1304 if (!VariableDIE) { 1305 VariableDIE = new DIE(GV.getTag()); 1306 // Add to map. 1307 insertDIE(N, VariableDIE); 1308 1309 // Add name and type. 1310 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName()); 1311 addType(VariableDIE, GTy); 1312 1313 // Add scoping info. 1314 if (!GV.isLocalToUnit()) { 1315 addFlag(VariableDIE, dwarf::DW_AT_external); 1316 addGlobalName(GV.getName(), VariableDIE); 1317 } 1318 1319 // Add line number info. 1320 addSourceLine(VariableDIE, GV); 1321 // Add to context owner. 1322 addToContextOwner(VariableDIE, GVContext); 1323 } 1324 1325 // Add location. 1326 bool addToAccelTable = false; 1327 DIE *VariableSpecDIE = NULL; 1328 bool isGlobalVariable = GV.getGlobal() != NULL; 1329 if (isGlobalVariable) { 1330 addToAccelTable = true; 1331 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1332 addOpAddress(Block, Asm->Mang->getSymbol(GV.getGlobal())); 1333 // Do not create specification DIE if context is either compile unit 1334 // or a subprogram. 1335 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() && 1336 !GVContext.isFile() && !isSubprogramContext(GVContext)) { 1337 // Create specification DIE. 1338 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable); 1339 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, 1340 dwarf::DW_FORM_ref4, VariableDIE); 1341 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block); 1342 // A static member's declaration is already flagged as such. 1343 if (!SDMDecl.Verify()) 1344 addFlag(VariableDIE, dwarf::DW_AT_declaration); 1345 addDie(VariableSpecDIE); 1346 } else { 1347 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); 1348 } 1349 // Add linkage name. 1350 StringRef LinkageName = GV.getLinkageName(); 1351 if (!LinkageName.empty() && isGlobalVariable) { 1352 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, 1353 getRealLinkageName(LinkageName)); 1354 // To make old GDB happy, for static member variables, we add 1355 // AT_MIPS_linkage_name to the definition DIE as well. 1356 if (IsStaticMember && VariableSpecDIE) 1357 addString(VariableSpecDIE, dwarf::DW_AT_MIPS_linkage_name, 1358 getRealLinkageName(LinkageName)); 1359 } 1360 } else if (const ConstantInt *CI = 1361 dyn_cast_or_null<ConstantInt>(GV.getConstant())) { 1362 // AT_const_value was added when the static memeber was created. To avoid 1363 // emitting AT_const_value multiple times, we only add AT_const_value when 1364 // it is not a static member. 1365 if (!IsStaticMember) 1366 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType()); 1367 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) { 1368 addToAccelTable = true; 1369 // GV is a merged global. 1370 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1371 Value *Ptr = CE->getOperand(0); 1372 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr))); 1373 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1374 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end()); 1375 addUInt(Block, 0, dwarf::DW_FORM_udata, 1376 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx)); 1377 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1378 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); 1379 } 1380 1381 if (addToAccelTable) { 1382 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE; 1383 addAccelName(GV.getName(), AddrDIE); 1384 1385 // If the linkage name is different than the name, go ahead and output 1386 // that as well into the name table. 1387 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName()) 1388 addAccelName(GV.getLinkageName(), AddrDIE); 1389 } 1390 1391 return; 1392} 1393 1394/// constructSubrangeDIE - Construct subrange DIE from DISubrange. 1395void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, 1396 DIE *IndexTy) { 1397 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type); 1398 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy); 1399 1400 // The LowerBound value defines the lower bounds which is typically zero for 1401 // C/C++. The Count value is the number of elements. Values are 64 bit. If 1402 // Count == -1 then the array is unbounded and we do not emit 1403 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and 1404 // Count == 0, then the array has zero elements in which case we do not emit 1405 // an upper bound. 1406 int64_t LowerBound = SR.getLo(); 1407 int64_t DefaultLowerBound = getDefaultLowerBound(); 1408 int64_t Count = SR.getCount(); 1409 1410 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound) 1411 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound); 1412 1413 if (Count != -1 && Count != 0) 1414 // FIXME: An unbounded array should reference the expression that defines 1415 // the array. 1416 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1); 1417 1418 Buffer.addChild(DW_Subrange); 1419} 1420 1421/// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 1422void CompileUnit::constructArrayTypeDIE(DIE &Buffer, 1423 DICompositeType *CTy) { 1424 Buffer.setTag(dwarf::DW_TAG_array_type); 1425 if (CTy->isVector()) 1426 addFlag(&Buffer, dwarf::DW_AT_GNU_vector); 1427 1428 // Emit derived type. 1429 addType(&Buffer, CTy->getTypeDerivedFrom()); 1430 DIArray Elements = CTy->getTypeArray(); 1431 1432 // Get an anonymous type for index type. 1433 // FIXME: This type should be passed down from the front end 1434 // as different languages may have different sizes for indexes. 1435 DIE *IdxTy = getIndexTyDie(); 1436 if (!IdxTy) { 1437 // Construct an anonymous type for index type. 1438 IdxTy = new DIE(dwarf::DW_TAG_base_type); 1439 addString(IdxTy, dwarf::DW_AT_name, "int"); 1440 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t)); 1441 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 1442 dwarf::DW_ATE_signed); 1443 addDie(IdxTy); 1444 setIndexTyDie(IdxTy); 1445 } 1446 1447 // Add subranges to array type. 1448 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 1449 DIDescriptor Element = Elements.getElement(i); 1450 if (Element.getTag() == dwarf::DW_TAG_subrange_type) 1451 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy); 1452 } 1453} 1454 1455/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator. 1456DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) { 1457 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator); 1458 StringRef Name = ETy.getName(); 1459 addString(Enumerator, dwarf::DW_AT_name, Name); 1460 int64_t Value = ETy.getEnumValue(); 1461 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value); 1462 return Enumerator; 1463} 1464 1465/// constructContainingTypeDIEs - Construct DIEs for types that contain 1466/// vtables. 1467void CompileUnit::constructContainingTypeDIEs() { 1468 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(), 1469 CE = ContainingTypeMap.end(); CI != CE; ++CI) { 1470 DIE *SPDie = CI->first; 1471 const MDNode *N = CI->second; 1472 if (!N) continue; 1473 DIE *NDie = getDIE(N); 1474 if (!NDie) continue; 1475 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie); 1476 } 1477} 1478 1479/// constructVariableDIE - Construct a DIE for the given DbgVariable. 1480DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) { 1481 StringRef Name = DV->getName(); 1482 1483 // Translate tag to proper Dwarf tag. 1484 unsigned Tag = DV->getTag(); 1485 1486 // Define variable debug information entry. 1487 DIE *VariableDie = new DIE(Tag); 1488 DbgVariable *AbsVar = DV->getAbstractVariable(); 1489 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL; 1490 if (AbsDIE) 1491 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, 1492 dwarf::DW_FORM_ref4, AbsDIE); 1493 else { 1494 addString(VariableDie, dwarf::DW_AT_name, Name); 1495 addSourceLine(VariableDie, DV->getVariable()); 1496 addType(VariableDie, DV->getType()); 1497 } 1498 1499 if (DV->isArtificial()) 1500 addFlag(VariableDie, dwarf::DW_AT_artificial); 1501 1502 if (isScopeAbstract) { 1503 DV->setDIE(VariableDie); 1504 return VariableDie; 1505 } 1506 1507 // Add variable address. 1508 1509 unsigned Offset = DV->getDotDebugLocOffset(); 1510 if (Offset != ~0U) { 1511 addLabel(VariableDie, dwarf::DW_AT_location, 1512 dwarf::DW_FORM_data4, 1513 Asm->GetTempSymbol("debug_loc", Offset)); 1514 DV->setDIE(VariableDie); 1515 return VariableDie; 1516 } 1517 1518 // Check if variable is described by a DBG_VALUE instruction. 1519 if (const MachineInstr *DVInsn = DV->getMInsn()) { 1520 bool updated = false; 1521 if (DVInsn->getNumOperands() == 3) { 1522 if (DVInsn->getOperand(0).isReg()) { 1523 const MachineOperand RegOp = DVInsn->getOperand(0); 1524 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 1525 if (DVInsn->getOperand(1).isImm() && 1526 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) { 1527 unsigned FrameReg = 0; 1528 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering(); 1529 int Offset = 1530 TFI->getFrameIndexReference(*Asm->MF, 1531 DVInsn->getOperand(1).getImm(), 1532 FrameReg); 1533 MachineLocation Location(FrameReg, Offset); 1534 addVariableAddress(DV, VariableDie, Location); 1535 1536 } else if (RegOp.getReg()) 1537 addVariableAddress(DV, VariableDie, 1538 MachineLocation(RegOp.getReg())); 1539 updated = true; 1540 } 1541 else if (DVInsn->getOperand(0).isImm()) 1542 updated = 1543 addConstantValue(VariableDie, DVInsn->getOperand(0), 1544 DV->getType()); 1545 else if (DVInsn->getOperand(0).isFPImm()) 1546 updated = 1547 addConstantFPValue(VariableDie, DVInsn->getOperand(0)); 1548 else if (DVInsn->getOperand(0).isCImm()) 1549 updated = 1550 addConstantValue(VariableDie, 1551 DVInsn->getOperand(0).getCImm(), 1552 DV->getType().isUnsignedDIType()); 1553 } else { 1554 addVariableAddress(DV, VariableDie, 1555 Asm->getDebugValueLocation(DVInsn)); 1556 updated = true; 1557 } 1558 if (!updated) { 1559 // If variableDie is not updated then DBG_VALUE instruction does not 1560 // have valid variable info. 1561 delete VariableDie; 1562 return NULL; 1563 } 1564 DV->setDIE(VariableDie); 1565 return VariableDie; 1566 } else { 1567 // .. else use frame index. 1568 int FI = DV->getFrameIndex(); 1569 if (FI != ~0) { 1570 unsigned FrameReg = 0; 1571 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering(); 1572 int Offset = 1573 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg); 1574 MachineLocation Location(FrameReg, Offset); 1575 addVariableAddress(DV, VariableDie, Location); 1576 } 1577 } 1578 1579 DV->setDIE(VariableDie); 1580 return VariableDie; 1581} 1582 1583/// createMemberDIE - Create new member DIE. 1584DIE *CompileUnit::createMemberDIE(DIDerivedType DT) { 1585 DIE *MemberDie = new DIE(DT.getTag()); 1586 StringRef Name = DT.getName(); 1587 if (!Name.empty()) 1588 addString(MemberDie, dwarf::DW_AT_name, Name); 1589 1590 addType(MemberDie, DT.getTypeDerivedFrom()); 1591 1592 addSourceLine(MemberDie, DT); 1593 1594 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock(); 1595 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1596 1597 uint64_t Size = DT.getSizeInBits(); 1598 uint64_t FieldSize = DT.getOriginalTypeSize(); 1599 1600 if (Size != FieldSize) { 1601 // Handle bitfield. 1602 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3); 1603 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits()); 1604 1605 uint64_t Offset = DT.getOffsetInBits(); 1606 uint64_t AlignMask = ~(DT.getAlignInBits() - 1); 1607 uint64_t HiMark = (Offset + FieldSize) & AlignMask; 1608 uint64_t FieldOffset = (HiMark - FieldSize); 1609 Offset -= FieldOffset; 1610 1611 // Maybe we need to work from the other end. 1612 if (Asm->getDataLayout().isLittleEndian()) 1613 Offset = FieldSize - (Offset + Size); 1614 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset); 1615 1616 // Here WD_AT_data_member_location points to the anonymous 1617 // field that includes this bit field. 1618 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3); 1619 1620 } else 1621 // This is not a bitfield. 1622 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3); 1623 1624 if (DT.getTag() == dwarf::DW_TAG_inheritance 1625 && DT.isVirtual()) { 1626 1627 // For C++, virtual base classes are not at fixed offset. Use following 1628 // expression to extract appropriate offset from vtable. 1629 // BaseAddr = ObAddr + *((*ObAddr) - Offset) 1630 1631 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock(); 1632 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup); 1633 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1634 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1635 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits()); 1636 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus); 1637 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1638 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1639 1640 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, 1641 VBaseLocationDie); 1642 } else 1643 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie); 1644 1645 if (DT.isProtected()) 1646 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1647 dwarf::DW_ACCESS_protected); 1648 else if (DT.isPrivate()) 1649 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1650 dwarf::DW_ACCESS_private); 1651 // Otherwise C++ member and base classes are considered public. 1652 else 1653 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1654 dwarf::DW_ACCESS_public); 1655 if (DT.isVirtual()) 1656 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, 1657 dwarf::DW_VIRTUALITY_virtual); 1658 1659 // Objective-C properties. 1660 if (MDNode *PNode = DT.getObjCProperty()) 1661 if (DIEEntry *PropertyDie = getDIEEntry(PNode)) 1662 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4, 1663 PropertyDie); 1664 1665 if (DT.isArtificial()) 1666 addFlag(MemberDie, dwarf::DW_AT_artificial); 1667 1668 // This is only for backward compatibility. 1669 StringRef PropertyName = DT.getObjCPropertyName(); 1670 if (!PropertyName.empty()) { 1671 addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName); 1672 StringRef GetterName = DT.getObjCPropertyGetterName(); 1673 if (!GetterName.empty()) 1674 addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName); 1675 StringRef SetterName = DT.getObjCPropertySetterName(); 1676 if (!SetterName.empty()) 1677 addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName); 1678 unsigned PropertyAttributes = 0; 1679 if (DT.isReadOnlyObjCProperty()) 1680 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly; 1681 if (DT.isReadWriteObjCProperty()) 1682 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite; 1683 if (DT.isAssignObjCProperty()) 1684 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign; 1685 if (DT.isRetainObjCProperty()) 1686 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain; 1687 if (DT.isCopyObjCProperty()) 1688 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy; 1689 if (DT.isNonAtomicObjCProperty()) 1690 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic; 1691 if (PropertyAttributes) 1692 addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0, 1693 PropertyAttributes); 1694 } 1695 return MemberDie; 1696} 1697 1698/// createStaticMemberDIE - Create new DIE for C++ static member. 1699DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) { 1700 if (!DT.Verify()) 1701 return NULL; 1702 1703 DIE *StaticMemberDIE = new DIE(DT.getTag()); 1704 DIType Ty = DT.getTypeDerivedFrom(); 1705 1706 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName()); 1707 addType(StaticMemberDIE, Ty); 1708 addSourceLine(StaticMemberDIE, DT); 1709 addFlag(StaticMemberDIE, dwarf::DW_AT_external); 1710 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration); 1711 1712 // FIXME: We could omit private if the parent is a class_type, and 1713 // public if the parent is something else. 1714 if (DT.isProtected()) 1715 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1716 dwarf::DW_ACCESS_protected); 1717 else if (DT.isPrivate()) 1718 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1719 dwarf::DW_ACCESS_private); 1720 else 1721 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1722 dwarf::DW_ACCESS_public); 1723 1724 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant())) 1725 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType()); 1726 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant())) 1727 addConstantFPValue(StaticMemberDIE, CFP); 1728 1729 insertDIE(DT, StaticMemberDIE); 1730 return StaticMemberDIE; 1731} 1732