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