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