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