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