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/TargetLoweringObjectFile.h" 31 #include "llvm/Target/TargetRegisterInfo.h" 32 33 using namespace llvm; 34 35 /// CompileUnit - Compile unit constructor. 36 CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A, 37 DwarfDebug *DW, DwarfUnits *DWU) 38 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0), 39 DebugInfoOffset(0) { 40 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1); 41 insertDIE(N, D); 42 } 43 44 /// ~CompileUnit - Destructor for compile unit. 45 CompileUnit::~CompileUnit() { 46 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j) 47 DIEBlocks[j]->~DIEBlock(); 48 } 49 50 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug 51 /// information entry. 52 DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) { 53 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry); 54 return Value; 55 } 56 57 /// getDefaultLowerBound - Return the default lower bound for an array. If the 58 /// DWARF version doesn't handle the language, return -1. 59 int64_t CompileUnit::getDefaultLowerBound() const { 60 switch (DICompileUnit(Node).getLanguage()) { 61 default: 62 break; 63 64 case dwarf::DW_LANG_C89: 65 case dwarf::DW_LANG_C99: 66 case dwarf::DW_LANG_C: 67 case dwarf::DW_LANG_C_plus_plus: 68 case dwarf::DW_LANG_ObjC: 69 case dwarf::DW_LANG_ObjC_plus_plus: 70 return 0; 71 72 case dwarf::DW_LANG_Fortran77: 73 case dwarf::DW_LANG_Fortran90: 74 case dwarf::DW_LANG_Fortran95: 75 return 1; 76 77 // The languages below have valid values only if the DWARF version >= 4. 78 case dwarf::DW_LANG_Java: 79 case dwarf::DW_LANG_Python: 80 case dwarf::DW_LANG_UPC: 81 case dwarf::DW_LANG_D: 82 if (dwarf::DWARF_VERSION >= 4) 83 return 0; 84 break; 85 86 case dwarf::DW_LANG_Ada83: 87 case dwarf::DW_LANG_Ada95: 88 case dwarf::DW_LANG_Cobol74: 89 case dwarf::DW_LANG_Cobol85: 90 case dwarf::DW_LANG_Modula2: 91 case dwarf::DW_LANG_Pascal83: 92 case dwarf::DW_LANG_PLI: 93 if (dwarf::DWARF_VERSION >= 4) 94 return 1; 95 break; 96 } 97 98 return -1; 99 } 100 101 /// addFlag - Add a flag that is true. 102 void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) { 103 if (DD->getDwarfVersion() >= 4) 104 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, 105 DIEIntegerOne); 106 else 107 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1); 108 } 109 110 /// addUInt - Add an unsigned integer attribute data and value. 111 /// 112 void CompileUnit::addUInt(DIE *Die, uint16_t Attribute, 113 uint16_t Form, uint64_t Integer) { 114 if (!Form) Form = DIEInteger::BestForm(false, Integer); 115 DIEValue *Value = Integer == 1 ? 116 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer); 117 Die->addValue(Attribute, Form, Value); 118 } 119 120 /// addSInt - Add an signed integer attribute data and value. 121 /// 122 void CompileUnit::addSInt(DIE *Die, uint16_t Attribute, 123 uint16_t Form, int64_t Integer) { 124 if (!Form) Form = DIEInteger::BestForm(true, Integer); 125 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer); 126 Die->addValue(Attribute, Form, Value); 127 } 128 129 /// addString - Add a string attribute data and value. We always emit a 130 /// reference to the string pool instead of immediate strings so that DIEs have 131 /// more predictable sizes. In the case of split dwarf we emit an index 132 /// into another table which gets us the static offset into the string 133 /// table. 134 void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) { 135 DIEValue *Value; 136 uint16_t Form; 137 if (!DD->useSplitDwarf()) { 138 MCSymbol *Symb = DU->getStringPoolEntry(String); 139 if (Asm->needsRelocationsForDwarfStringPool()) 140 Value = new (DIEValueAllocator) DIELabel(Symb); 141 else { 142 MCSymbol *StringPool = DU->getStringPoolSym(); 143 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool); 144 } 145 Form = dwarf::DW_FORM_strp; 146 } else { 147 unsigned idx = DU->getStringPoolIndex(String); 148 Value = new (DIEValueAllocator) DIEInteger(idx); 149 Form = dwarf::DW_FORM_GNU_str_index; 150 } 151 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String); 152 Die->addValue(Attribute, Form, Str); 153 } 154 155 /// addLocalString - Add a string attribute data and value. This is guaranteed 156 /// to be in the local string pool instead of indirected. 157 void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute, 158 StringRef String) { 159 MCSymbol *Symb = DU->getStringPoolEntry(String); 160 DIEValue *Value; 161 if (Asm->needsRelocationsForDwarfStringPool()) 162 Value = new (DIEValueAllocator) DIELabel(Symb); 163 else { 164 MCSymbol *StringPool = DU->getStringPoolSym(); 165 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool); 166 } 167 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value); 168 } 169 170 /// addExpr - Add a Dwarf expression attribute data and value. 171 /// 172 void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form, 173 const MCExpr *Expr) { 174 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr); 175 Die->addValue(Attribute, Form, Value); 176 } 177 178 /// addLabel - Add a Dwarf label attribute data and value. 179 /// 180 void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form, 181 const MCSymbol *Label) { 182 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); 183 Die->addValue(Attribute, Form, Value); 184 } 185 186 /// addLabelAddress - Add a dwarf label attribute data and value using 187 /// DW_FORM_addr or DW_FORM_GNU_addr_index. 188 /// 189 void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute, 190 MCSymbol *Label) { 191 if (!DD->useSplitDwarf()) { 192 if (Label != NULL) { 193 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); 194 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); 195 } else { 196 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0); 197 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); 198 } 199 } else { 200 unsigned idx = DU->getAddrPoolIndex(Label); 201 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); 202 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value); 203 } 204 } 205 206 /// addOpAddress - Add a dwarf op address data and value using the 207 /// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index. 208 /// 209 void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *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, uint16_t Form, 230 DIE *Entry) { 231 Die->addValue(Attribute, Form, 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 = 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(DIType Ty, int *SizeInBits) { 591 if (Ty.isDerivedType()) 592 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits); 593 if (Ty.isBasicType()) 594 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed 595 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) { 596 *SizeInBits = Ty.getSizeInBits(); 597 return true; 598 } 599 return false; 600 } 601 602 /// addConstantValue - Add constant value entry in variable DIE. 603 void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO, 604 DIType Ty) { 605 // FIXME: This is a bit conservative/simple - it emits negative values at 606 // their maximum bit width which is a bit unfortunate (& doesn't prefer 607 // udata/sdata over dataN as suggested by the DWARF spec) 608 assert(MO.isImm() && "Invalid machine operand!"); 609 int SizeInBits = -1; 610 bool SignedConstant = isTypeSigned(Ty, &SizeInBits); 611 uint16_t Form; 612 613 // If we're a signed constant definitely use sdata. 614 if (SignedConstant) { 615 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm()); 616 return; 617 } 618 619 // Else use data for now unless it's larger than we can deal with. 620 switch (SizeInBits) { 621 case 8: 622 Form = dwarf::DW_FORM_data1; 623 break; 624 case 16: 625 Form = dwarf::DW_FORM_data2; 626 break; 627 case 32: 628 Form = dwarf::DW_FORM_data4; 629 break; 630 case 64: 631 Form = dwarf::DW_FORM_data8; 632 break; 633 default: 634 Form = dwarf::DW_FORM_udata; 635 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm()); 636 return; 637 } 638 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm()); 639 } 640 641 /// addConstantFPValue - Add constant value entry in variable DIE. 642 void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) { 643 assert (MO.isFPImm() && "Invalid machine operand!"); 644 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 645 APFloat FPImm = MO.getFPImm()->getValueAPF(); 646 647 // Get the raw data form of the floating point. 648 const APInt FltVal = FPImm.bitcastToAPInt(); 649 const char *FltPtr = (const char*)FltVal.getRawData(); 650 651 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte. 652 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 653 int Incr = (LittleEndian ? 1 : -1); 654 int Start = (LittleEndian ? 0 : NumBytes - 1); 655 int Stop = (LittleEndian ? NumBytes : -1); 656 657 // Output the constant to DWARF one byte at a time. 658 for (; Start != Stop; Start += Incr) 659 addUInt(Block, 0, dwarf::DW_FORM_data1, 660 (unsigned char)0xFF & FltPtr[Start]); 661 662 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 663 } 664 665 /// addConstantFPValue - Add constant value entry in variable DIE. 666 void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) { 667 // Pass this down to addConstantValue as an unsigned bag of bits. 668 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true); 669 } 670 671 /// addConstantValue - Add constant value entry in variable DIE. 672 void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI, 673 bool Unsigned) { 674 addConstantValue(Die, CI->getValue(), Unsigned); 675 } 676 677 // addConstantValue - Add constant value entry in variable DIE. 678 void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) { 679 unsigned CIBitWidth = Val.getBitWidth(); 680 if (CIBitWidth <= 64) { 681 // If we're a signed constant definitely use sdata. 682 if (!Unsigned) { 683 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, 684 Val.getSExtValue()); 685 return; 686 } 687 688 // Else use data for now unless it's larger than we can deal with. 689 uint16_t Form; 690 switch (CIBitWidth) { 691 case 8: 692 Form = dwarf::DW_FORM_data1; 693 break; 694 case 16: 695 Form = dwarf::DW_FORM_data2; 696 break; 697 case 32: 698 Form = dwarf::DW_FORM_data4; 699 break; 700 case 64: 701 Form = dwarf::DW_FORM_data8; 702 break; 703 default: 704 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata, 705 Val.getZExtValue()); 706 return; 707 } 708 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue()); 709 return; 710 } 711 712 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 713 714 // Get the raw data form of the large APInt. 715 const uint64_t *Ptr64 = Val.getRawData(); 716 717 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte. 718 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 719 720 // Output the constant to DWARF one byte at a time. 721 for (int i = 0; i < NumBytes; i++) { 722 uint8_t c; 723 if (LittleEndian) 724 c = Ptr64[i / 8] >> (8 * (i & 7)); 725 else 726 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7)); 727 addUInt(Block, 0, dwarf::DW_FORM_data1, c); 728 } 729 730 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 731 } 732 733 /// addTemplateParams - Add template parameters into buffer. 734 void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) { 735 // Add template parameters. 736 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) { 737 DIDescriptor Element = TParams.getElement(i); 738 if (Element.isTemplateTypeParameter()) 739 Buffer.addChild(getOrCreateTemplateTypeParameterDIE( 740 DITemplateTypeParameter(Element))); 741 else if (Element.isTemplateValueParameter()) 742 Buffer.addChild(getOrCreateTemplateValueParameterDIE( 743 DITemplateValueParameter(Element))); 744 } 745 } 746 747 /// getOrCreateContextDIE - Get context owner's DIE. 748 DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) { 749 if (Context.isType()) 750 return getOrCreateTypeDIE(DIType(Context)); 751 else if (Context.isNameSpace()) 752 return getOrCreateNameSpace(DINameSpace(Context)); 753 else if (Context.isSubprogram()) 754 return getOrCreateSubprogramDIE(DISubprogram(Context)); 755 else 756 return getDIE(Context); 757 } 758 759 /// addToContextOwner - Add Die into the list of its context owner's children. 760 void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) { 761 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) 762 ContextDIE->addChild(Die); 763 else 764 addDie(Die); 765 } 766 767 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 768 /// given DIType. 769 DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) { 770 DIType Ty(TyNode); 771 if (!Ty.isType()) 772 return NULL; 773 DIE *TyDIE = getDIE(Ty); 774 if (TyDIE) 775 return TyDIE; 776 777 // Create new type. 778 TyDIE = new DIE(dwarf::DW_TAG_base_type); 779 insertDIE(Ty, TyDIE); 780 if (Ty.isBasicType()) 781 constructTypeDIE(*TyDIE, DIBasicType(Ty)); 782 else if (Ty.isCompositeType()) 783 constructTypeDIE(*TyDIE, DICompositeType(Ty)); 784 else { 785 assert(Ty.isDerivedType() && "Unknown kind of DIType"); 786 constructTypeDIE(*TyDIE, DIDerivedType(Ty)); 787 } 788 // If this is a named finished type then include it in the list of types 789 // for the accelerator tables. 790 if (!Ty.getName().empty() && !Ty.isForwardDecl()) { 791 bool IsImplementation = 0; 792 if (Ty.isCompositeType()) { 793 DICompositeType CT(Ty); 794 // A runtime language of 0 actually means C/C++ and that any 795 // non-negative value is some version of Objective-C/C++. 796 IsImplementation = (CT.getRunTimeLang() == 0) || 797 CT.isObjcClassComplete(); 798 } 799 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0; 800 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags)); 801 } 802 803 addToContextOwner(TyDIE, Ty.getContext()); 804 return TyDIE; 805 } 806 807 /// addType - Add a new type attribute to the specified entity. 808 void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) { 809 assert(Ty && "Trying to add a type that doesn't exist?"); 810 811 // Check for pre-existence. 812 DIEEntry *Entry = getDIEEntry(Ty); 813 // If it exists then use the existing value. 814 if (Entry) { 815 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry); 816 return; 817 } 818 819 // Construct type. 820 DIE *Buffer = getOrCreateTypeDIE(Ty); 821 822 // Set up proxy. 823 Entry = createDIEEntry(Buffer); 824 insertDIEEntry(Ty, Entry); 825 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry); 826 827 // If this is a complete composite type then include it in the 828 // list of global types. 829 addGlobalType(Ty); 830 } 831 832 /// addGlobalType - Add a new global type to the compile unit. 833 /// 834 void CompileUnit::addGlobalType(DIType Ty) { 835 DIDescriptor Context = Ty.getContext(); 836 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl() 837 && (!Context || Context.isCompileUnit() || Context.isFile() 838 || Context.isNameSpace())) 839 if (DIEEntry *Entry = getDIEEntry(Ty)) 840 GlobalTypes[Ty.getName()] = Entry->getEntry(); 841 } 842 843 /// addPubTypes - Add type for pubtypes section. 844 void CompileUnit::addPubTypes(DISubprogram SP) { 845 DICompositeType SPTy = SP.getType(); 846 uint16_t SPTag = SPTy.getTag(); 847 if (SPTag != dwarf::DW_TAG_subroutine_type) 848 return; 849 850 DIArray Args = SPTy.getTypeArray(); 851 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) { 852 DIType ATy(Args.getElement(i)); 853 if (!ATy.isType()) 854 continue; 855 addGlobalType(ATy); 856 } 857 } 858 859 /// constructTypeDIE - Construct basic type die from DIBasicType. 860 void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) { 861 // Get core information. 862 StringRef Name = BTy.getName(); 863 // Add name if not anonymous or intermediate type. 864 if (!Name.empty()) 865 addString(&Buffer, dwarf::DW_AT_name, Name); 866 867 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) { 868 Buffer.setTag(dwarf::DW_TAG_unspecified_type); 869 // An unspecified type only has a name attribute. 870 return; 871 } 872 873 Buffer.setTag(dwarf::DW_TAG_base_type); 874 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 875 BTy.getEncoding()); 876 877 uint64_t Size = BTy.getSizeInBits() >> 3; 878 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 879 } 880 881 /// constructTypeDIE - Construct derived type die from DIDerivedType. 882 void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) { 883 // Get core information. 884 StringRef Name = DTy.getName(); 885 uint64_t Size = DTy.getSizeInBits() >> 3; 886 uint16_t Tag = DTy.getTag(); 887 888 // FIXME - Workaround for templates. 889 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type; 890 891 Buffer.setTag(Tag); 892 893 // Map to main type, void will not have a type. 894 DIType FromTy = DTy.getTypeDerivedFrom(); 895 if (FromTy) 896 addType(&Buffer, FromTy); 897 898 // Add name if not anonymous or intermediate type. 899 if (!Name.empty()) 900 addString(&Buffer, dwarf::DW_AT_name, Name); 901 902 // Add size if non-zero (derived types might be zero-sized.) 903 if (Size && Tag != dwarf::DW_TAG_pointer_type) 904 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 905 906 if (Tag == dwarf::DW_TAG_ptr_to_member_type) 907 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 908 getOrCreateTypeDIE(DD->resolve(DTy.getClassType()))); 909 // Add source line info if available and TyDesc is not a forward declaration. 910 if (!DTy.isForwardDecl()) 911 addSourceLine(&Buffer, DTy); 912 } 913 914 /// Return true if the type is appropriately scoped to be contained inside 915 /// its own type unit. 916 static bool isTypeUnitScoped(DIType Ty) { 917 DIScope Parent = Ty.getContext(); 918 while (Parent) { 919 // Don't generate a hash for anything scoped inside a function. 920 if (Parent.isSubprogram()) 921 return false; 922 Parent = Parent.getContext(); 923 } 924 return true; 925 } 926 927 /// Return true if the type should be split out into a type unit. 928 static bool shouldCreateTypeUnit(DICompositeType CTy) { 929 uint16_t Tag = CTy.getTag(); 930 931 switch (Tag) { 932 case dwarf::DW_TAG_structure_type: 933 case dwarf::DW_TAG_union_type: 934 case dwarf::DW_TAG_enumeration_type: 935 case dwarf::DW_TAG_class_type: 936 // If this is a class, structure, union, or enumeration type 937 // that is not a declaration, is a type definition, and not scoped 938 // inside a function then separate this out as a type unit. 939 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy)) 940 return 0; 941 return 1; 942 default: 943 return 0; 944 } 945 } 946 947 /// constructTypeDIE - Construct type DIE from DICompositeType. 948 void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { 949 // Get core information. 950 StringRef Name = CTy.getName(); 951 952 uint64_t Size = CTy.getSizeInBits() >> 3; 953 uint16_t Tag = CTy.getTag(); 954 Buffer.setTag(Tag); 955 956 switch (Tag) { 957 case dwarf::DW_TAG_array_type: 958 constructArrayTypeDIE(Buffer, &CTy); 959 break; 960 case dwarf::DW_TAG_enumeration_type: { 961 DIArray Elements = CTy.getTypeArray(); 962 963 // Add enumerators to enumeration type. 964 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 965 DIE *ElemDie = NULL; 966 DIDescriptor Enum(Elements.getElement(i)); 967 if (Enum.isEnumerator()) { 968 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum)); 969 Buffer.addChild(ElemDie); 970 } 971 } 972 DIType DTy = CTy.getTypeDerivedFrom(); 973 if (DTy) { 974 addType(&Buffer, DTy); 975 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1); 976 } 977 } 978 break; 979 case dwarf::DW_TAG_subroutine_type: { 980 // Add return type. A void return won't have a type. 981 DIArray Elements = CTy.getTypeArray(); 982 DIDescriptor RTy = Elements.getElement(0); 983 if (RTy) 984 addType(&Buffer, DIType(RTy)); 985 986 bool isPrototyped = true; 987 // Add arguments. 988 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) { 989 DIDescriptor Ty = Elements.getElement(i); 990 if (Ty.isUnspecifiedParameter()) { 991 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters); 992 Buffer.addChild(Arg); 993 isPrototyped = false; 994 } else { 995 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 996 addType(Arg, DIType(Ty)); 997 if (DIType(Ty).isArtificial()) 998 addFlag(Arg, dwarf::DW_AT_artificial); 999 Buffer.addChild(Arg); 1000 } 1001 } 1002 // Add prototype flag if we're dealing with a C language and the 1003 // function has been prototyped. 1004 uint16_t Language = DICompileUnit(Node).getLanguage(); 1005 if (isPrototyped && 1006 (Language == dwarf::DW_LANG_C89 || 1007 Language == dwarf::DW_LANG_C99 || 1008 Language == dwarf::DW_LANG_ObjC)) 1009 addFlag(&Buffer, dwarf::DW_AT_prototyped); 1010 } 1011 break; 1012 case dwarf::DW_TAG_structure_type: 1013 case dwarf::DW_TAG_union_type: 1014 case dwarf::DW_TAG_class_type: { 1015 // Add elements to structure type. 1016 DIArray Elements = CTy.getTypeArray(); 1017 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 1018 DIDescriptor Element = Elements.getElement(i); 1019 DIE *ElemDie = NULL; 1020 if (Element.isSubprogram()) { 1021 DISubprogram SP(Element); 1022 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element)); 1023 if (SP.isProtected()) 1024 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1025 dwarf::DW_ACCESS_protected); 1026 else if (SP.isPrivate()) 1027 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1028 dwarf::DW_ACCESS_private); 1029 else 1030 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1031 dwarf::DW_ACCESS_public); 1032 if (SP.isExplicit()) 1033 addFlag(ElemDie, dwarf::DW_AT_explicit); 1034 } else if (Element.isDerivedType()) { 1035 DIDerivedType DDTy(Element); 1036 if (DDTy.getTag() == dwarf::DW_TAG_friend) { 1037 ElemDie = new DIE(dwarf::DW_TAG_friend); 1038 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend); 1039 } else if (DDTy.isStaticMember()) 1040 ElemDie = createStaticMemberDIE(DDTy); 1041 else 1042 ElemDie = createMemberDIE(DDTy); 1043 } else if (Element.isObjCProperty()) { 1044 DIObjCProperty Property(Element); 1045 ElemDie = new DIE(Property.getTag()); 1046 StringRef PropertyName = Property.getObjCPropertyName(); 1047 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName); 1048 addType(ElemDie, Property.getType()); 1049 addSourceLine(ElemDie, Property); 1050 StringRef GetterName = Property.getObjCPropertyGetterName(); 1051 if (!GetterName.empty()) 1052 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName); 1053 StringRef SetterName = Property.getObjCPropertySetterName(); 1054 if (!SetterName.empty()) 1055 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName); 1056 unsigned PropertyAttributes = 0; 1057 if (Property.isReadOnlyObjCProperty()) 1058 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly; 1059 if (Property.isReadWriteObjCProperty()) 1060 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite; 1061 if (Property.isAssignObjCProperty()) 1062 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign; 1063 if (Property.isRetainObjCProperty()) 1064 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain; 1065 if (Property.isCopyObjCProperty()) 1066 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy; 1067 if (Property.isNonAtomicObjCProperty()) 1068 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic; 1069 if (PropertyAttributes) 1070 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0, 1071 PropertyAttributes); 1072 1073 DIEEntry *Entry = getDIEEntry(Element); 1074 if (!Entry) { 1075 Entry = createDIEEntry(ElemDie); 1076 insertDIEEntry(Element, Entry); 1077 } 1078 } else 1079 continue; 1080 Buffer.addChild(ElemDie); 1081 } 1082 1083 if (CTy.isAppleBlockExtension()) 1084 addFlag(&Buffer, dwarf::DW_AT_APPLE_block); 1085 1086 DICompositeType ContainingType(DD->resolve(CTy.getContainingType())); 1087 if (DIDescriptor(ContainingType).isCompositeType()) 1088 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 1089 getOrCreateTypeDIE(DIType(ContainingType))); 1090 else 1091 addToContextOwner(&Buffer, CTy.getContext()); 1092 1093 if (CTy.isObjcClassComplete()) 1094 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type); 1095 1096 // Add template parameters to a class, structure or union types. 1097 // FIXME: The support isn't in the metadata for this yet. 1098 if (Tag == dwarf::DW_TAG_class_type || 1099 Tag == dwarf::DW_TAG_structure_type || 1100 Tag == dwarf::DW_TAG_union_type) 1101 addTemplateParams(Buffer, CTy.getTemplateParams()); 1102 1103 break; 1104 } 1105 default: 1106 break; 1107 } 1108 1109 // Add name if not anonymous or intermediate type. 1110 if (!Name.empty()) 1111 addString(&Buffer, dwarf::DW_AT_name, Name); 1112 1113 if (Tag == dwarf::DW_TAG_enumeration_type || 1114 Tag == dwarf::DW_TAG_class_type || 1115 Tag == dwarf::DW_TAG_structure_type || 1116 Tag == dwarf::DW_TAG_union_type) { 1117 // Add size if non-zero (derived types might be zero-sized.) 1118 // TODO: Do we care about size for enum forward declarations? 1119 if (Size) 1120 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 1121 else if (!CTy.isForwardDecl()) 1122 // Add zero size if it is not a forward declaration. 1123 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0); 1124 1125 // If we're a forward decl, say so. 1126 if (CTy.isForwardDecl()) 1127 addFlag(&Buffer, dwarf::DW_AT_declaration); 1128 1129 // Add source line info if available. 1130 if (!CTy.isForwardDecl()) 1131 addSourceLine(&Buffer, CTy); 1132 1133 // No harm in adding the runtime language to the declaration. 1134 unsigned RLang = CTy.getRunTimeLang(); 1135 if (RLang) 1136 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, 1137 dwarf::DW_FORM_data1, RLang); 1138 } 1139 // If this is a type applicable to a type unit it then add it to the 1140 // list of types we'll compute a hash for later. 1141 if (shouldCreateTypeUnit(CTy)) 1142 DD->addTypeUnitType(&Buffer); 1143 } 1144 1145 /// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE 1146 /// for the given DITemplateTypeParameter. 1147 DIE * 1148 CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) { 1149 DIE *ParamDIE = getDIE(TP); 1150 if (ParamDIE) 1151 return ParamDIE; 1152 1153 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter); 1154 // Add the type if it exists, it could be void and therefore no type. 1155 if (TP.getType()) 1156 addType(ParamDIE, TP.getType()); 1157 if (!TP.getName().empty()) 1158 addString(ParamDIE, dwarf::DW_AT_name, TP.getName()); 1159 return ParamDIE; 1160 } 1161 1162 /// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE 1163 /// for the given DITemplateValueParameter. 1164 DIE * 1165 CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) { 1166 DIE *ParamDIE = getDIE(VP); 1167 if (ParamDIE) 1168 return ParamDIE; 1169 1170 ParamDIE = new DIE(VP.getTag()); 1171 1172 // Add the type if there is one, template template and template parameter 1173 // packs will not have a type. 1174 if (VP.getType()) 1175 addType(ParamDIE, VP.getType()); 1176 if (!VP.getName().empty()) 1177 addString(ParamDIE, dwarf::DW_AT_name, VP.getName()); 1178 if (Value *Val = VP.getValue()) { 1179 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val)) 1180 addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType()); 1181 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) { 1182 // For declaration non-type template parameters (such as global values and 1183 // functions) 1184 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1185 addOpAddress(Block, Asm->Mang->getSymbol(GV)); 1186 // Emit DW_OP_stack_value to use the address as the immediate value of the 1187 // parameter, rather than a pointer to it. 1188 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value); 1189 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block); 1190 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) { 1191 assert(isa<MDString>(Val)); 1192 addString(ParamDIE, dwarf::DW_AT_GNU_template_name, 1193 cast<MDString>(Val)->getString()); 1194 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) { 1195 assert(isa<MDNode>(Val)); 1196 DIArray A(cast<MDNode>(Val)); 1197 addTemplateParams(*ParamDIE, A); 1198 } 1199 } 1200 1201 return ParamDIE; 1202 } 1203 1204 /// getOrCreateNameSpace - Create a DIE for DINameSpace. 1205 DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) { 1206 DIE *NDie = getDIE(NS); 1207 if (NDie) 1208 return NDie; 1209 NDie = new DIE(dwarf::DW_TAG_namespace); 1210 insertDIE(NS, NDie); 1211 if (!NS.getName().empty()) { 1212 addString(NDie, dwarf::DW_AT_name, NS.getName()); 1213 addAccelNamespace(NS.getName(), NDie); 1214 } else 1215 addAccelNamespace("(anonymous namespace)", NDie); 1216 addSourceLine(NDie, NS); 1217 addToContextOwner(NDie, NS.getContext()); 1218 return NDie; 1219 } 1220 1221 /// getOrCreateSubprogramDIE - Create new DIE using SP. 1222 DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) { 1223 DIE *SPDie = getDIE(SP); 1224 if (SPDie) 1225 return SPDie; 1226 1227 SPDie = new DIE(dwarf::DW_TAG_subprogram); 1228 1229 // DW_TAG_inlined_subroutine may refer to this DIE. 1230 insertDIE(SP, SPDie); 1231 1232 DISubprogram SPDecl = SP.getFunctionDeclaration(); 1233 DIE *DeclDie = NULL; 1234 if (SPDecl.isSubprogram()) { 1235 DeclDie = getOrCreateSubprogramDIE(SPDecl); 1236 } 1237 1238 // Add to context owner. 1239 addToContextOwner(SPDie, SP.getContext()); 1240 1241 // Add function template parameters. 1242 addTemplateParams(*SPDie, SP.getTemplateParams()); 1243 1244 // If this DIE is going to refer declaration info using AT_specification 1245 // then there is no need to add other attributes. 1246 if (DeclDie) { 1247 // Refer function declaration directly. 1248 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 1249 DeclDie); 1250 1251 return SPDie; 1252 } 1253 1254 // Add the linkage name if we have one. 1255 StringRef LinkageName = SP.getLinkageName(); 1256 if (!LinkageName.empty()) 1257 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, 1258 GlobalValue::getRealLinkageName(LinkageName)); 1259 1260 // Constructors and operators for anonymous aggregates do not have names. 1261 if (!SP.getName().empty()) 1262 addString(SPDie, dwarf::DW_AT_name, SP.getName()); 1263 1264 addSourceLine(SPDie, SP); 1265 1266 // Add the prototype if we have a prototype and we have a C like 1267 // language. 1268 uint16_t Language = DICompileUnit(Node).getLanguage(); 1269 if (SP.isPrototyped() && 1270 (Language == dwarf::DW_LANG_C89 || 1271 Language == dwarf::DW_LANG_C99 || 1272 Language == dwarf::DW_LANG_ObjC)) 1273 addFlag(SPDie, dwarf::DW_AT_prototyped); 1274 1275 // Add Return Type. A void return type will not have a type. 1276 DICompositeType SPTy = SP.getType(); 1277 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type && 1278 "the type of a subprogram should be a subroutine"); 1279 1280 DIArray Args = SPTy.getTypeArray(); 1281 if (Args.getElement(0)) 1282 addType(SPDie, DIType(Args.getElement(0))); 1283 1284 unsigned VK = SP.getVirtuality(); 1285 if (VK) { 1286 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK); 1287 DIEBlock *Block = getDIEBlock(); 1288 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1289 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex()); 1290 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block); 1291 ContainingTypeMap.insert(std::make_pair(SPDie, 1292 DD->resolve(SP.getContainingType()))); 1293 } 1294 1295 if (!SP.isDefinition()) { 1296 addFlag(SPDie, dwarf::DW_AT_declaration); 1297 1298 // Add arguments. Do not add arguments for subprogram definition. They will 1299 // be handled while processing variables. 1300 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1301 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1302 DIType ATy = DIType(Args.getElement(i)); 1303 addType(Arg, ATy); 1304 if (ATy.isArtificial()) 1305 addFlag(Arg, dwarf::DW_AT_artificial); 1306 SPDie->addChild(Arg); 1307 } 1308 } 1309 1310 if (SP.isArtificial()) 1311 addFlag(SPDie, dwarf::DW_AT_artificial); 1312 1313 if (!SP.isLocalToUnit()) 1314 addFlag(SPDie, dwarf::DW_AT_external); 1315 1316 if (SP.isOptimized()) 1317 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized); 1318 1319 if (unsigned isa = Asm->getISAEncoding()) { 1320 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa); 1321 } 1322 1323 return SPDie; 1324 } 1325 1326 // Return const expression if value is a GEP to access merged global 1327 // constant. e.g. 1328 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0) 1329 static const ConstantExpr *getMergedGlobalExpr(const Value *V) { 1330 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V); 1331 if (!CE || CE->getNumOperands() != 3 || 1332 CE->getOpcode() != Instruction::GetElementPtr) 1333 return NULL; 1334 1335 // First operand points to a global struct. 1336 Value *Ptr = CE->getOperand(0); 1337 if (!isa<GlobalValue>(Ptr) || 1338 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType())) 1339 return NULL; 1340 1341 // Second operand is zero. 1342 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1)); 1343 if (!CI || !CI->isZero()) 1344 return NULL; 1345 1346 // Third operand is offset. 1347 if (!isa<ConstantInt>(CE->getOperand(2))) 1348 return NULL; 1349 1350 return CE; 1351 } 1352 1353 /// createGlobalVariableDIE - create global variable DIE. 1354 void CompileUnit::createGlobalVariableDIE(const MDNode *N) { 1355 // Check for pre-existence. 1356 if (getDIE(N)) 1357 return; 1358 1359 DIGlobalVariable GV(N); 1360 if (!GV.isGlobalVariable()) 1361 return; 1362 1363 DIDescriptor GVContext = GV.getContext(); 1364 DIType GTy = GV.getType(); 1365 1366 // If this is a static data member definition, some attributes belong 1367 // to the declaration DIE. 1368 DIE *VariableDIE = NULL; 1369 bool IsStaticMember = false; 1370 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration(); 1371 if (SDMDecl.Verify()) { 1372 assert(SDMDecl.isStaticMember() && "Expected static member decl"); 1373 // We need the declaration DIE that is in the static member's class. 1374 // But that class might not exist in the DWARF yet. 1375 // Creating the class will create the static member decl DIE. 1376 getOrCreateContextDIE(SDMDecl.getContext()); 1377 VariableDIE = getDIE(SDMDecl); 1378 assert(VariableDIE && "Static member decl has no context?"); 1379 IsStaticMember = true; 1380 } 1381 1382 // If this is not a static data member definition, create the variable 1383 // DIE and add the initial set of attributes to it. 1384 if (!VariableDIE) { 1385 VariableDIE = new DIE(GV.getTag()); 1386 // Add to map. 1387 insertDIE(N, VariableDIE); 1388 1389 // Add name and type. 1390 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName()); 1391 addType(VariableDIE, GTy); 1392 1393 // Add scoping info. 1394 if (!GV.isLocalToUnit()) { 1395 addFlag(VariableDIE, dwarf::DW_AT_external); 1396 addGlobalName(GV.getName(), VariableDIE); 1397 } 1398 1399 // Add line number info. 1400 addSourceLine(VariableDIE, GV); 1401 // Add to context owner. 1402 addToContextOwner(VariableDIE, GVContext); 1403 } 1404 1405 // Add location. 1406 bool addToAccelTable = false; 1407 DIE *VariableSpecDIE = NULL; 1408 bool isGlobalVariable = GV.getGlobal() != NULL; 1409 if (isGlobalVariable) { 1410 addToAccelTable = true; 1411 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1412 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal()); 1413 if (GV.getGlobal()->isThreadLocal()) { 1414 // FIXME: Make this work with -gsplit-dwarf. 1415 unsigned PointerSize = Asm->getDataLayout().getPointerSize(); 1416 assert((PointerSize == 4 || PointerSize == 8) && 1417 "Add support for other sizes if necessary"); 1418 const MCExpr *Expr = 1419 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym); 1420 // Based on GCC's support for TLS: 1421 if (!DD->useSplitDwarf()) { 1422 // 1) Start with a constNu of the appropriate pointer size 1423 addUInt(Block, 0, dwarf::DW_FORM_data1, 1424 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u); 1425 // 2) containing the (relocated) address of the TLS variable 1426 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr); 1427 } else { 1428 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index); 1429 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr)); 1430 } 1431 // 3) followed by a custom OP to tell the debugger about TLS (presumably) 1432 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user); 1433 } else 1434 addOpAddress(Block, Sym); 1435 // Do not create specification DIE if context is either compile unit 1436 // or a subprogram. 1437 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() && 1438 !GVContext.isFile() && !isSubprogramContext(GVContext)) { 1439 // Create specification DIE. 1440 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable); 1441 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, 1442 dwarf::DW_FORM_ref4, VariableDIE); 1443 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block); 1444 // A static member's declaration is already flagged as such. 1445 if (!SDMDecl.Verify()) 1446 addFlag(VariableDIE, dwarf::DW_AT_declaration); 1447 addDie(VariableSpecDIE); 1448 } else { 1449 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); 1450 } 1451 // Add the linkage name. 1452 StringRef LinkageName = GV.getLinkageName(); 1453 if (!LinkageName.empty()) 1454 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include: 1455 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and 1456 // TAG_variable. 1457 addString(IsStaticMember && VariableSpecDIE ? 1458 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name, 1459 GlobalValue::getRealLinkageName(LinkageName)); 1460 } else if (const ConstantInt *CI = 1461 dyn_cast_or_null<ConstantInt>(GV.getConstant())) { 1462 // AT_const_value was added when the static member was created. To avoid 1463 // emitting AT_const_value multiple times, we only add AT_const_value when 1464 // it is not a static member. 1465 if (!IsStaticMember) 1466 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType()); 1467 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) { 1468 addToAccelTable = true; 1469 // GV is a merged global. 1470 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1471 Value *Ptr = CE->getOperand(0); 1472 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr))); 1473 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1474 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end()); 1475 addUInt(Block, 0, dwarf::DW_FORM_udata, 1476 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx)); 1477 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1478 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); 1479 } 1480 1481 if (addToAccelTable) { 1482 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE; 1483 addAccelName(GV.getName(), AddrDIE); 1484 1485 // If the linkage name is different than the name, go ahead and output 1486 // that as well into the name table. 1487 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName()) 1488 addAccelName(GV.getLinkageName(), AddrDIE); 1489 } 1490 } 1491 1492 /// constructSubrangeDIE - Construct subrange DIE from DISubrange. 1493 void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, 1494 DIE *IndexTy) { 1495 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type); 1496 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy); 1497 1498 // The LowerBound value defines the lower bounds which is typically zero for 1499 // C/C++. The Count value is the number of elements. Values are 64 bit. If 1500 // Count == -1 then the array is unbounded and we do not emit 1501 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and 1502 // Count == 0, then the array has zero elements in which case we do not emit 1503 // an upper bound. 1504 int64_t LowerBound = SR.getLo(); 1505 int64_t DefaultLowerBound = getDefaultLowerBound(); 1506 int64_t Count = SR.getCount(); 1507 1508 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound) 1509 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound); 1510 1511 if (Count != -1 && Count != 0) 1512 // FIXME: An unbounded array should reference the expression that defines 1513 // the array. 1514 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1); 1515 1516 Buffer.addChild(DW_Subrange); 1517 } 1518 1519 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 1520 void CompileUnit::constructArrayTypeDIE(DIE &Buffer, 1521 DICompositeType *CTy) { 1522 Buffer.setTag(dwarf::DW_TAG_array_type); 1523 if (CTy->isVector()) 1524 addFlag(&Buffer, dwarf::DW_AT_GNU_vector); 1525 1526 // Emit the element type. 1527 addType(&Buffer, CTy->getTypeDerivedFrom()); 1528 1529 // Get an anonymous type for index type. 1530 // FIXME: This type should be passed down from the front end 1531 // as different languages may have different sizes for indexes. 1532 DIE *IdxTy = getIndexTyDie(); 1533 if (!IdxTy) { 1534 // Construct an anonymous type for index type. 1535 IdxTy = new DIE(dwarf::DW_TAG_base_type); 1536 addString(IdxTy, dwarf::DW_AT_name, "int"); 1537 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t)); 1538 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 1539 dwarf::DW_ATE_signed); 1540 addDie(IdxTy); 1541 setIndexTyDie(IdxTy); 1542 } 1543 1544 // Add subranges to array type. 1545 DIArray Elements = CTy->getTypeArray(); 1546 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 1547 DIDescriptor Element = Elements.getElement(i); 1548 if (Element.getTag() == dwarf::DW_TAG_subrange_type) 1549 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy); 1550 } 1551 } 1552 1553 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator. 1554 DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) { 1555 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator); 1556 StringRef Name = ETy.getName(); 1557 addString(Enumerator, dwarf::DW_AT_name, Name); 1558 int64_t Value = ETy.getEnumValue(); 1559 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value); 1560 return Enumerator; 1561 } 1562 1563 /// constructContainingTypeDIEs - Construct DIEs for types that contain 1564 /// vtables. 1565 void CompileUnit::constructContainingTypeDIEs() { 1566 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(), 1567 CE = ContainingTypeMap.end(); CI != CE; ++CI) { 1568 DIE *SPDie = CI->first; 1569 const MDNode *N = CI->second; 1570 if (!N) continue; 1571 DIE *NDie = getDIE(N); 1572 if (!NDie) continue; 1573 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie); 1574 } 1575 } 1576 1577 /// constructVariableDIE - Construct a DIE for the given DbgVariable. 1578 DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, 1579 bool isScopeAbstract) { 1580 StringRef Name = DV->getName(); 1581 1582 // Translate tag to proper Dwarf tag. 1583 uint16_t Tag = DV->getTag(); 1584 1585 // Define variable debug information entry. 1586 DIE *VariableDie = new DIE(Tag); 1587 DbgVariable *AbsVar = DV->getAbstractVariable(); 1588 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL; 1589 if (AbsDIE) 1590 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, 1591 dwarf::DW_FORM_ref4, AbsDIE); 1592 else { 1593 if (!Name.empty()) 1594 addString(VariableDie, dwarf::DW_AT_name, Name); 1595 addSourceLine(VariableDie, DV->getVariable()); 1596 addType(VariableDie, DV->getType()); 1597 } 1598 1599 if (DV->isArtificial()) 1600 addFlag(VariableDie, dwarf::DW_AT_artificial); 1601 1602 if (isScopeAbstract) { 1603 DV->setDIE(VariableDie); 1604 return VariableDie; 1605 } 1606 1607 // Add variable address. 1608 1609 unsigned Offset = DV->getDotDebugLocOffset(); 1610 if (Offset != ~0U) { 1611 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4, 1612 Asm->GetTempSymbol("debug_loc", Offset)); 1613 DV->setDIE(VariableDie); 1614 return VariableDie; 1615 } 1616 1617 // Check if variable is described by a DBG_VALUE instruction. 1618 if (const MachineInstr *DVInsn = DV->getMInsn()) { 1619 assert(DVInsn->getNumOperands() == 3); 1620 if (DVInsn->getOperand(0).isReg()) { 1621 const MachineOperand RegOp = DVInsn->getOperand(0); 1622 // If the second operand is an immediate, this is an indirect value. 1623 if (DVInsn->getOperand(1).isImm()) { 1624 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm()); 1625 addVariableAddress(*DV, VariableDie, Location); 1626 } else if (RegOp.getReg()) 1627 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg())); 1628 } else if (DVInsn->getOperand(0).isImm()) 1629 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType()); 1630 else if (DVInsn->getOperand(0).isFPImm()) 1631 addConstantFPValue(VariableDie, DVInsn->getOperand(0)); 1632 else if (DVInsn->getOperand(0).isCImm()) 1633 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(), 1634 DV->getType().isUnsignedDIType()); 1635 1636 DV->setDIE(VariableDie); 1637 return VariableDie; 1638 } else { 1639 // .. else use frame index. 1640 int FI = DV->getFrameIndex(); 1641 if (FI != ~0) { 1642 unsigned FrameReg = 0; 1643 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering(); 1644 int Offset = 1645 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg); 1646 MachineLocation Location(FrameReg, Offset); 1647 addVariableAddress(*DV, VariableDie, Location); 1648 } 1649 } 1650 1651 DV->setDIE(VariableDie); 1652 return VariableDie; 1653 } 1654 1655 /// createMemberDIE - Create new member DIE. 1656 DIE *CompileUnit::createMemberDIE(DIDerivedType DT) { 1657 DIE *MemberDie = new DIE(DT.getTag()); 1658 StringRef Name = DT.getName(); 1659 if (!Name.empty()) 1660 addString(MemberDie, dwarf::DW_AT_name, Name); 1661 1662 addType(MemberDie, DT.getTypeDerivedFrom()); 1663 1664 addSourceLine(MemberDie, DT); 1665 1666 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock(); 1667 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1668 1669 uint64_t Size = DT.getSizeInBits(); 1670 uint64_t FieldSize = DT.getOriginalTypeSize(); 1671 1672 if (Size != FieldSize) { 1673 // Handle bitfield. 1674 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3); 1675 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits()); 1676 1677 uint64_t Offset = DT.getOffsetInBits(); 1678 uint64_t AlignMask = ~(DT.getAlignInBits() - 1); 1679 uint64_t HiMark = (Offset + FieldSize) & AlignMask; 1680 uint64_t FieldOffset = (HiMark - FieldSize); 1681 Offset -= FieldOffset; 1682 1683 // Maybe we need to work from the other end. 1684 if (Asm->getDataLayout().isLittleEndian()) 1685 Offset = FieldSize - (Offset + Size); 1686 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset); 1687 1688 // Here WD_AT_data_member_location points to the anonymous 1689 // field that includes this bit field. 1690 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3); 1691 1692 } else 1693 // This is not a bitfield. 1694 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3); 1695 1696 if (DT.getTag() == dwarf::DW_TAG_inheritance 1697 && DT.isVirtual()) { 1698 1699 // For C++, virtual base classes are not at fixed offset. Use following 1700 // expression to extract appropriate offset from vtable. 1701 // BaseAddr = ObAddr + *((*ObAddr) - Offset) 1702 1703 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock(); 1704 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup); 1705 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1706 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1707 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits()); 1708 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus); 1709 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1710 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1711 1712 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, 1713 VBaseLocationDie); 1714 } else 1715 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie); 1716 1717 if (DT.isProtected()) 1718 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1719 dwarf::DW_ACCESS_protected); 1720 else if (DT.isPrivate()) 1721 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1722 dwarf::DW_ACCESS_private); 1723 // Otherwise C++ member and base classes are considered public. 1724 else 1725 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1726 dwarf::DW_ACCESS_public); 1727 if (DT.isVirtual()) 1728 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, 1729 dwarf::DW_VIRTUALITY_virtual); 1730 1731 // Objective-C properties. 1732 if (MDNode *PNode = DT.getObjCProperty()) 1733 if (DIEEntry *PropertyDie = getDIEEntry(PNode)) 1734 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4, 1735 PropertyDie); 1736 1737 if (DT.isArtificial()) 1738 addFlag(MemberDie, dwarf::DW_AT_artificial); 1739 1740 return MemberDie; 1741 } 1742 1743 /// createStaticMemberDIE - Create new DIE for C++ static member. 1744 DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) { 1745 if (!DT.Verify()) 1746 return NULL; 1747 1748 DIE *StaticMemberDIE = new DIE(DT.getTag()); 1749 DIType Ty = DT.getTypeDerivedFrom(); 1750 1751 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName()); 1752 addType(StaticMemberDIE, Ty); 1753 addSourceLine(StaticMemberDIE, DT); 1754 addFlag(StaticMemberDIE, dwarf::DW_AT_external); 1755 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration); 1756 1757 // FIXME: We could omit private if the parent is a class_type, and 1758 // public if the parent is something else. 1759 if (DT.isProtected()) 1760 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1761 dwarf::DW_ACCESS_protected); 1762 else if (DT.isPrivate()) 1763 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1764 dwarf::DW_ACCESS_private); 1765 else 1766 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1767 dwarf::DW_ACCESS_public); 1768 1769 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant())) 1770 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType()); 1771 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant())) 1772 addConstantFPValue(StaticMemberDIE, CFP); 1773 1774 insertDIE(DT, StaticMemberDIE); 1775 return StaticMemberDIE; 1776 } 1777