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