DwarfDebug.cpp revision 97c3472bf915ce9124f682f6c8ce9e4baff7c284
1//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===// 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 debug info into asm files. 11// 12//===----------------------------------------------------------------------===// 13 14#define DEBUG_TYPE "dwarfdebug" 15#include "DwarfDebug.h" 16#include "DIE.h" 17#include "DwarfAccelTable.h" 18#include "DwarfCompileUnit.h" 19#include "llvm/Constants.h" 20#include "llvm/DebugInfo.h" 21#include "llvm/DIBuilder.h" 22#include "llvm/Module.h" 23#include "llvm/Instructions.h" 24#include "llvm/CodeGen/MachineFunction.h" 25#include "llvm/CodeGen/MachineModuleInfo.h" 26#include "llvm/MC/MCAsmInfo.h" 27#include "llvm/MC/MCSection.h" 28#include "llvm/MC/MCStreamer.h" 29#include "llvm/MC/MCSymbol.h" 30#include "llvm/DataLayout.h" 31#include "llvm/Target/TargetFrameLowering.h" 32#include "llvm/Target/TargetLoweringObjectFile.h" 33#include "llvm/Target/TargetMachine.h" 34#include "llvm/Target/TargetRegisterInfo.h" 35#include "llvm/Target/TargetOptions.h" 36#include "llvm/ADT/Statistic.h" 37#include "llvm/ADT/STLExtras.h" 38#include "llvm/ADT/StringExtras.h" 39#include "llvm/ADT/Triple.h" 40#include "llvm/Support/CommandLine.h" 41#include "llvm/Support/Debug.h" 42#include "llvm/Support/ErrorHandling.h" 43#include "llvm/Support/ValueHandle.h" 44#include "llvm/Support/FormattedStream.h" 45#include "llvm/Support/Timer.h" 46#include "llvm/Support/Path.h" 47using namespace llvm; 48 49static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print", 50 cl::Hidden, 51 cl::desc("Disable debug info printing")); 52 53static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden, 54 cl::desc("Make an absence of debug location information explicit."), 55 cl::init(false)); 56 57namespace { 58 enum DefaultOnOff { 59 Default, Enable, Disable 60 }; 61} 62 63static cl::opt<DefaultOnOff> DwarfAccelTables("dwarf-accel-tables", cl::Hidden, 64 cl::desc("Output prototype dwarf accelerator tables."), 65 cl::values( 66 clEnumVal(Default, "Default for platform"), 67 clEnumVal(Enable, "Enabled"), 68 clEnumVal(Disable, "Disabled"), 69 clEnumValEnd), 70 cl::init(Default)); 71 72static cl::opt<DefaultOnOff> DarwinGDBCompat("darwin-gdb-compat", cl::Hidden, 73 cl::desc("Compatibility with Darwin gdb."), 74 cl::values( 75 clEnumVal(Default, "Default for platform"), 76 clEnumVal(Enable, "Enabled"), 77 clEnumVal(Disable, "Disabled"), 78 clEnumValEnd), 79 cl::init(Default)); 80 81static cl::opt<DefaultOnOff> DwarfFission("dwarf-fission", cl::Hidden, 82 cl::desc("Output prototype dwarf fission."), 83 cl::values( 84 clEnumVal(Default, "Default for platform"), 85 clEnumVal(Enable, "Enabled"), 86 clEnumVal(Disable, "Disabled"), 87 clEnumValEnd), 88 cl::init(Default)); 89 90namespace { 91 const char *DWARFGroupName = "DWARF Emission"; 92 const char *DbgTimerName = "DWARF Debug Writer"; 93} // end anonymous namespace 94 95//===----------------------------------------------------------------------===// 96 97/// Configuration values for initial hash set sizes (log2). 98/// 99static const unsigned InitAbbreviationsSetSize = 9; // log2(512) 100 101namespace llvm { 102 103DIType DbgVariable::getType() const { 104 DIType Ty = Var.getType(); 105 // FIXME: isBlockByrefVariable should be reformulated in terms of complex 106 // addresses instead. 107 if (Var.isBlockByrefVariable()) { 108 /* Byref variables, in Blocks, are declared by the programmer as 109 "SomeType VarName;", but the compiler creates a 110 __Block_byref_x_VarName struct, and gives the variable VarName 111 either the struct, or a pointer to the struct, as its type. This 112 is necessary for various behind-the-scenes things the compiler 113 needs to do with by-reference variables in blocks. 114 115 However, as far as the original *programmer* is concerned, the 116 variable should still have type 'SomeType', as originally declared. 117 118 The following function dives into the __Block_byref_x_VarName 119 struct to find the original type of the variable. This will be 120 passed back to the code generating the type for the Debug 121 Information Entry for the variable 'VarName'. 'VarName' will then 122 have the original type 'SomeType' in its debug information. 123 124 The original type 'SomeType' will be the type of the field named 125 'VarName' inside the __Block_byref_x_VarName struct. 126 127 NOTE: In order for this to not completely fail on the debugger 128 side, the Debug Information Entry for the variable VarName needs to 129 have a DW_AT_location that tells the debugger how to unwind through 130 the pointers and __Block_byref_x_VarName struct to find the actual 131 value of the variable. The function addBlockByrefType does this. */ 132 DIType subType = Ty; 133 unsigned tag = Ty.getTag(); 134 135 if (tag == dwarf::DW_TAG_pointer_type) { 136 DIDerivedType DTy = DIDerivedType(Ty); 137 subType = DTy.getTypeDerivedFrom(); 138 } 139 140 DICompositeType blockStruct = DICompositeType(subType); 141 DIArray Elements = blockStruct.getTypeArray(); 142 143 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 144 DIDescriptor Element = Elements.getElement(i); 145 DIDerivedType DT = DIDerivedType(Element); 146 if (getName() == DT.getName()) 147 return (DT.getTypeDerivedFrom()); 148 } 149 } 150 return Ty; 151} 152 153} // end llvm namespace 154 155DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) 156 : Asm(A), MMI(Asm->MMI), FirstCU(0), 157 AbbreviationsSet(InitAbbreviationsSetSize), 158 SourceIdMap(DIEValueAllocator), StringPool(DIEValueAllocator), 159 PrevLabel(NULL) { 160 NextStringPoolNumber = 0; 161 162 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0; 163 DwarfStrSectionSym = TextSectionSym = 0; 164 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0; 165 FunctionBeginSym = FunctionEndSym = 0; 166 167 // Turn on accelerator tables and older gdb compatibility 168 // for Darwin. 169 bool isDarwin = Triple(M->getTargetTriple()).isOSDarwin(); 170 if (DarwinGDBCompat == Default) { 171 if (isDarwin) 172 isDarwinGDBCompat = true; 173 else 174 isDarwinGDBCompat = false; 175 } else 176 isDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false; 177 178 if (DwarfAccelTables == Default) { 179 if (isDarwin) 180 hasDwarfAccelTables = true; 181 else 182 hasDwarfAccelTables = false; 183 } else 184 hasDwarfAccelTables = DwarfAccelTables == Enable ? true : false; 185 186 if (DwarfFission == Default) 187 hasDwarfFission = false; 188 else 189 hasDwarfFission = DwarfFission == Enable ? true : false; 190 191 { 192 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 193 beginModule(M); 194 } 195} 196DwarfDebug::~DwarfDebug() { 197} 198 199/// EmitSectionSym - Switch to the specified MCSection and emit an assembler 200/// temporary label to it if SymbolStem is specified. 201static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section, 202 const char *SymbolStem = 0) { 203 Asm->OutStreamer.SwitchSection(Section); 204 if (!SymbolStem) return 0; 205 206 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem); 207 Asm->OutStreamer.EmitLabel(TmpSym); 208 return TmpSym; 209} 210 211MCSymbol *DwarfDebug::getStringPool() { 212 return Asm->GetTempSymbol("section_str"); 213} 214 215MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) { 216 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str]; 217 if (Entry.first) return Entry.first; 218 219 Entry.second = NextStringPoolNumber++; 220 return Entry.first = Asm->GetTempSymbol("string", Entry.second); 221} 222 223/// assignAbbrevNumber - Define a unique number for the abbreviation. 224/// 225void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) { 226 // Profile the node so that we can make it unique. 227 FoldingSetNodeID ID; 228 Abbrev.Profile(ID); 229 230 // Check the set for priors. 231 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev); 232 233 // If it's newly added. 234 if (InSet == &Abbrev) { 235 // Add to abbreviation list. 236 Abbreviations.push_back(&Abbrev); 237 238 // Assign the vector position + 1 as its number. 239 Abbrev.setNumber(Abbreviations.size()); 240 } else { 241 // Assign existing abbreviation number. 242 Abbrev.setNumber(InSet->getNumber()); 243 } 244} 245 246/// getRealLinkageName - If special LLVM prefix that is used to inform the asm 247/// printer to not emit usual symbol prefix before the symbol name is used then 248/// return linkage name after skipping this special LLVM prefix. 249static StringRef getRealLinkageName(StringRef LinkageName) { 250 char One = '\1'; 251 if (LinkageName.startswith(StringRef(&One, 1))) 252 return LinkageName.substr(1); 253 return LinkageName; 254} 255 256static bool isObjCClass(StringRef Name) { 257 return Name.startswith("+") || Name.startswith("-"); 258} 259 260static bool hasObjCCategory(StringRef Name) { 261 if (!isObjCClass(Name)) return false; 262 263 size_t pos = Name.find(')'); 264 if (pos != std::string::npos) { 265 if (Name[pos+1] != ' ') return false; 266 return true; 267 } 268 return false; 269} 270 271static void getObjCClassCategory(StringRef In, StringRef &Class, 272 StringRef &Category) { 273 if (!hasObjCCategory(In)) { 274 Class = In.slice(In.find('[') + 1, In.find(' ')); 275 Category = ""; 276 return; 277 } 278 279 Class = In.slice(In.find('[') + 1, In.find('(')); 280 Category = In.slice(In.find('[') + 1, In.find(' ')); 281 return; 282} 283 284static StringRef getObjCMethodName(StringRef In) { 285 return In.slice(In.find(' ') + 1, In.find(']')); 286} 287 288// Add the various names to the Dwarf accelerator table names. 289static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP, 290 DIE* Die) { 291 if (!SP.isDefinition()) return; 292 293 TheCU->addAccelName(SP.getName(), Die); 294 295 // If the linkage name is different than the name, go ahead and output 296 // that as well into the name table. 297 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName()) 298 TheCU->addAccelName(SP.getLinkageName(), Die); 299 300 // If this is an Objective-C selector name add it to the ObjC accelerator 301 // too. 302 if (isObjCClass(SP.getName())) { 303 StringRef Class, Category; 304 getObjCClassCategory(SP.getName(), Class, Category); 305 TheCU->addAccelObjC(Class, Die); 306 if (Category != "") 307 TheCU->addAccelObjC(Category, Die); 308 // Also add the base method name to the name table. 309 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die); 310 } 311} 312 313/// updateSubprogramScopeDIE - Find DIE for the given subprogram and 314/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes. 315/// If there are global variables in this scope then create and insert 316/// DIEs for these variables. 317DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU, 318 const MDNode *SPNode) { 319 DIE *SPDie = SPCU->getDIE(SPNode); 320 321 assert(SPDie && "Unable to find subprogram DIE!"); 322 DISubprogram SP(SPNode); 323 324 // If we're updating an abstract DIE, then we will be adding the children and 325 // object pointer later on. But what we don't want to do is process the 326 // concrete DIE twice. 327 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) { 328 // Pick up abstract subprogram DIE. 329 SPDie = new DIE(dwarf::DW_TAG_subprogram); 330 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin, 331 dwarf::DW_FORM_ref4, AbsSPDIE); 332 SPCU->addDie(SPDie); 333 } else { 334 DISubprogram SPDecl = SP.getFunctionDeclaration(); 335 if (!SPDecl.isSubprogram()) { 336 // There is not any need to generate specification DIE for a function 337 // defined at compile unit level. If a function is defined inside another 338 // function then gdb prefers the definition at top level and but does not 339 // expect specification DIE in parent function. So avoid creating 340 // specification DIE for a function defined inside a function. 341 if (SP.isDefinition() && !SP.getContext().isCompileUnit() && 342 !SP.getContext().isFile() && 343 !isSubprogramContext(SP.getContext())) { 344 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration); 345 346 // Add arguments. 347 DICompositeType SPTy = SP.getType(); 348 DIArray Args = SPTy.getTypeArray(); 349 unsigned SPTag = SPTy.getTag(); 350 if (SPTag == dwarf::DW_TAG_subroutine_type) 351 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 352 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 353 DIType ATy = DIType(Args.getElement(i)); 354 SPCU->addType(Arg, ATy); 355 if (ATy.isArtificial()) 356 SPCU->addFlag(Arg, dwarf::DW_AT_artificial); 357 if (ATy.isObjectPointer()) 358 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer, 359 dwarf::DW_FORM_ref4, Arg); 360 SPDie->addChild(Arg); 361 } 362 DIE *SPDeclDie = SPDie; 363 SPDie = new DIE(dwarf::DW_TAG_subprogram); 364 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 365 SPDeclDie); 366 SPCU->addDie(SPDie); 367 } 368 } 369 } 370 371 SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 372 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber())); 373 SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 374 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber())); 375 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 376 MachineLocation Location(RI->getFrameRegister(*Asm->MF)); 377 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location); 378 379 // Add name to the name table, we do this here because we're guaranteed 380 // to have concrete versions of our DW_TAG_subprogram nodes. 381 addSubprogramNames(SPCU, SP, SPDie); 382 383 return SPDie; 384} 385 386/// constructLexicalScope - Construct new DW_TAG_lexical_block 387/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels. 388DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU, 389 LexicalScope *Scope) { 390 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block); 391 if (Scope->isAbstractScope()) 392 return ScopeDIE; 393 394 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges(); 395 if (Ranges.empty()) 396 return 0; 397 398 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(); 399 if (Ranges.size() > 1) { 400 // .debug_range section has not been laid out yet. Emit offset in 401 // .debug_range as a uint, size 4, for now. emitDIE will handle 402 // DW_AT_ranges appropriately. 403 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4, 404 DebugRangeSymbols.size() 405 * Asm->getDataLayout().getPointerSize()); 406 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(), 407 RE = Ranges.end(); RI != RE; ++RI) { 408 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first)); 409 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second)); 410 } 411 DebugRangeSymbols.push_back(NULL); 412 DebugRangeSymbols.push_back(NULL); 413 return ScopeDIE; 414 } 415 416 const MCSymbol *Start = getLabelBeforeInsn(RI->first); 417 const MCSymbol *End = getLabelAfterInsn(RI->second); 418 419 if (End == 0) return 0; 420 421 assert(Start->isDefined() && "Invalid starting label for an inlined scope!"); 422 assert(End->isDefined() && "Invalid end label for an inlined scope!"); 423 424 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start); 425 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End); 426 427 return ScopeDIE; 428} 429 430/// constructInlinedScopeDIE - This scope represents inlined body of 431/// a function. Construct DIE to represent this concrete inlined copy 432/// of the function. 433DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU, 434 LexicalScope *Scope) { 435 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges(); 436 assert(Ranges.empty() == false && 437 "LexicalScope does not have instruction markers!"); 438 439 if (!Scope->getScopeNode()) 440 return NULL; 441 DIScope DS(Scope->getScopeNode()); 442 DISubprogram InlinedSP = getDISubprogram(DS); 443 DIE *OriginDIE = TheCU->getDIE(InlinedSP); 444 if (!OriginDIE) { 445 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram."); 446 return NULL; 447 } 448 449 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(); 450 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first); 451 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second); 452 453 if (StartLabel == 0 || EndLabel == 0) { 454 llvm_unreachable("Unexpected Start and End labels for an inlined scope!"); 455 } 456 assert(StartLabel->isDefined() && 457 "Invalid starting label for an inlined scope!"); 458 assert(EndLabel->isDefined() && 459 "Invalid end label for an inlined scope!"); 460 461 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine); 462 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, 463 dwarf::DW_FORM_ref4, OriginDIE); 464 465 if (Ranges.size() > 1) { 466 // .debug_range section has not been laid out yet. Emit offset in 467 // .debug_range as a uint, size 4, for now. emitDIE will handle 468 // DW_AT_ranges appropriately. 469 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4, 470 DebugRangeSymbols.size() 471 * Asm->getDataLayout().getPointerSize()); 472 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(), 473 RE = Ranges.end(); RI != RE; ++RI) { 474 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first)); 475 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second)); 476 } 477 DebugRangeSymbols.push_back(NULL); 478 DebugRangeSymbols.push_back(NULL); 479 } else { 480 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 481 StartLabel); 482 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 483 EndLabel); 484 } 485 486 InlinedSubprogramDIEs.insert(OriginDIE); 487 488 // Track the start label for this inlined function. 489 //.debug_inlined section specification does not clearly state how 490 // to emit inlined scope that is split into multiple instruction ranges. 491 // For now, use first instruction range and emit low_pc/high_pc pair and 492 // corresponding .debug_inlined section entry for this pair. 493 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator 494 I = InlineInfo.find(InlinedSP); 495 496 if (I == InlineInfo.end()) { 497 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE)); 498 InlinedSPNodes.push_back(InlinedSP); 499 } else 500 I->second.push_back(std::make_pair(StartLabel, ScopeDIE)); 501 502 DILocation DL(Scope->getInlinedAt()); 503 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, 504 GetOrCreateSourceID(DL.getFilename(), DL.getDirectory())); 505 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber()); 506 507 // Add name to the name table, we do this here because we're guaranteed 508 // to have concrete versions of our DW_TAG_inlined_subprogram nodes. 509 addSubprogramNames(TheCU, InlinedSP, ScopeDIE); 510 511 return ScopeDIE; 512} 513 514/// constructScopeDIE - Construct a DIE for this scope. 515DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) { 516 if (!Scope || !Scope->getScopeNode()) 517 return NULL; 518 519 SmallVector<DIE *, 8> Children; 520 DIE *ObjectPointer = NULL; 521 522 // Collect arguments for current function. 523 if (LScopes.isCurrentFunctionScope(Scope)) 524 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i) 525 if (DbgVariable *ArgDV = CurrentFnArguments[i]) 526 if (DIE *Arg = 527 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) { 528 Children.push_back(Arg); 529 if (ArgDV->isObjectPointer()) ObjectPointer = Arg; 530 } 531 532 // Collect lexical scope children first. 533 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope); 534 for (unsigned i = 0, N = Variables.size(); i < N; ++i) 535 if (DIE *Variable = 536 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) { 537 Children.push_back(Variable); 538 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable; 539 } 540 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren(); 541 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) 542 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j])) 543 Children.push_back(Nested); 544 DIScope DS(Scope->getScopeNode()); 545 DIE *ScopeDIE = NULL; 546 if (Scope->getInlinedAt()) 547 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope); 548 else if (DS.isSubprogram()) { 549 ProcessedSPNodes.insert(DS); 550 if (Scope->isAbstractScope()) { 551 ScopeDIE = TheCU->getDIE(DS); 552 // Note down abstract DIE. 553 if (ScopeDIE) 554 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE)); 555 } 556 else 557 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS); 558 } 559 else { 560 // There is no need to emit empty lexical block DIE. 561 if (Children.empty()) 562 return NULL; 563 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope); 564 } 565 566 if (!ScopeDIE) return NULL; 567 568 // Add children 569 for (SmallVector<DIE *, 8>::iterator I = Children.begin(), 570 E = Children.end(); I != E; ++I) 571 ScopeDIE->addChild(*I); 572 573 if (DS.isSubprogram() && ObjectPointer != NULL) 574 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, 575 dwarf::DW_FORM_ref4, ObjectPointer); 576 577 if (DS.isSubprogram()) 578 TheCU->addPubTypes(DISubprogram(DS)); 579 580 return ScopeDIE; 581} 582 583/// GetOrCreateSourceID - Look up the source id with the given directory and 584/// source file names. If none currently exists, create a new id and insert it 585/// in the SourceIds map. This can update DirectoryNames and SourceFileNames 586/// maps as well. 587unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName, 588 StringRef DirName) { 589 // If FE did not provide a file name, then assume stdin. 590 if (FileName.empty()) 591 return GetOrCreateSourceID("<stdin>", StringRef()); 592 593 // TODO: this might not belong here. See if we can factor this better. 594 if (DirName == CompilationDir) 595 DirName = ""; 596 597 unsigned SrcId = SourceIdMap.size()+1; 598 599 // We look up the file/dir pair by concatenating them with a zero byte. 600 SmallString<128> NamePair; 601 NamePair += DirName; 602 NamePair += '\0'; // Zero bytes are not allowed in paths. 603 NamePair += FileName; 604 605 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId); 606 if (Ent.getValue() != SrcId) 607 return Ent.getValue(); 608 609 // Print out a .file directive to specify files for .loc directives. 610 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName); 611 612 return SrcId; 613} 614 615/// constructCompileUnit - Create new CompileUnit for the given 616/// metadata node with tag DW_TAG_compile_unit. 617CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) { 618 DICompileUnit DIUnit(N); 619 StringRef FN = DIUnit.getFilename(); 620 CompilationDir = DIUnit.getDirectory(); 621 unsigned ID = GetOrCreateSourceID(FN, CompilationDir); 622 623 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); 624 CompileUnit *NewCU = new CompileUnit(ID, DIUnit.getLanguage(), Die, 625 Asm, this); 626 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer()); 627 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2, 628 DIUnit.getLanguage()); 629 NewCU->addString(Die, dwarf::DW_AT_name, FN); 630 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point 631 // into an entity. 632 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0); 633 // DW_AT_stmt_list is a offset of line number information for this 634 // compile unit in debug_line section. 635 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 636 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 637 Asm->GetTempSymbol("section_line")); 638 else 639 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0); 640 641 if (!CompilationDir.empty()) 642 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 643 if (DIUnit.isOptimized()) 644 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized); 645 646 StringRef Flags = DIUnit.getFlags(); 647 if (!Flags.empty()) 648 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags); 649 650 if (unsigned RVer = DIUnit.getRunTimeVersion()) 651 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers, 652 dwarf::DW_FORM_data1, RVer); 653 654 if (!FirstCU) 655 FirstCU = NewCU; 656 CUMap.insert(std::make_pair(N, NewCU)); 657 return NewCU; 658} 659 660/// construct SubprogramDIE - Construct subprogram DIE. 661void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU, 662 const MDNode *N) { 663 CompileUnit *&CURef = SPMap[N]; 664 if (CURef) 665 return; 666 CURef = TheCU; 667 668 DISubprogram SP(N); 669 if (!SP.isDefinition()) 670 // This is a method declaration which will be handled while constructing 671 // class type. 672 return; 673 674 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP); 675 676 // Add to map. 677 TheCU->insertDIE(N, SubprogramDie); 678 679 // Add to context owner. 680 TheCU->addToContextOwner(SubprogramDie, SP.getContext()); 681 682 return; 683} 684 685/// collectInfoFromNamedMDNodes - Collect debug info from named mdnodes such 686/// as llvm.dbg.enum and llvm.dbg.ty 687void DwarfDebug::collectInfoFromNamedMDNodes(Module *M) { 688 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp")) 689 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 690 const MDNode *N = NMD->getOperand(i); 691 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit())) 692 constructSubprogramDIE(CU, N); 693 } 694 695 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv")) 696 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 697 const MDNode *N = NMD->getOperand(i); 698 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit())) 699 CU->createGlobalVariableDIE(N); 700 } 701 702 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum")) 703 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 704 DIType Ty(NMD->getOperand(i)); 705 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit())) 706 CU->getOrCreateTypeDIE(Ty); 707 } 708 709 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty")) 710 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 711 DIType Ty(NMD->getOperand(i)); 712 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit())) 713 CU->getOrCreateTypeDIE(Ty); 714 } 715} 716 717/// collectLegacyDebugInfo - Collect debug info using DebugInfoFinder. 718/// FIXME - Remove this when dragon-egg and llvm-gcc switch to DIBuilder. 719bool DwarfDebug::collectLegacyDebugInfo(Module *M) { 720 DebugInfoFinder DbgFinder; 721 DbgFinder.processModule(*M); 722 723 bool HasDebugInfo = false; 724 // Scan all the compile-units to see if there are any marked as the main 725 // unit. If not, we do not generate debug info. 726 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(), 727 E = DbgFinder.compile_unit_end(); I != E; ++I) { 728 if (DICompileUnit(*I).isMain()) { 729 HasDebugInfo = true; 730 break; 731 } 732 } 733 if (!HasDebugInfo) return false; 734 735 // Create all the compile unit DIEs. 736 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(), 737 E = DbgFinder.compile_unit_end(); I != E; ++I) 738 constructCompileUnit(*I); 739 740 // Create DIEs for each global variable. 741 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(), 742 E = DbgFinder.global_variable_end(); I != E; ++I) { 743 const MDNode *N = *I; 744 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit())) 745 CU->createGlobalVariableDIE(N); 746 } 747 748 // Create DIEs for each subprogram. 749 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(), 750 E = DbgFinder.subprogram_end(); I != E; ++I) { 751 const MDNode *N = *I; 752 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit())) 753 constructSubprogramDIE(CU, N); 754 } 755 756 return HasDebugInfo; 757} 758 759/// beginModule - Emit all Dwarf sections that should come prior to the 760/// content. Create global DIEs and emit initial debug info sections. 761/// This is invoked by the target AsmPrinter. 762void DwarfDebug::beginModule(Module *M) { 763 if (DisableDebugInfoPrinting) 764 return; 765 766 // If module has named metadata anchors then use them, otherwise scan the 767 // module using debug info finder to collect debug info. 768 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu"); 769 if (CU_Nodes) { 770 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { 771 DICompileUnit CUNode(CU_Nodes->getOperand(i)); 772 CompileUnit *CU = constructCompileUnit(CUNode); 773 DIArray GVs = CUNode.getGlobalVariables(); 774 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) 775 CU->createGlobalVariableDIE(GVs.getElement(i)); 776 DIArray SPs = CUNode.getSubprograms(); 777 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) 778 constructSubprogramDIE(CU, SPs.getElement(i)); 779 DIArray EnumTypes = CUNode.getEnumTypes(); 780 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i) 781 CU->getOrCreateTypeDIE(EnumTypes.getElement(i)); 782 DIArray RetainedTypes = CUNode.getRetainedTypes(); 783 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) 784 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i)); 785 } 786 } else if (!collectLegacyDebugInfo(M)) 787 return; 788 789 collectInfoFromNamedMDNodes(M); 790 791 // Tell MMI that we have debug info. 792 MMI->setDebugInfoAvailability(true); 793 794 // Prime section data. 795 SectionMap.insert(Asm->getObjFileLowering().getTextSection()); 796} 797 798/// endModule - Emit all Dwarf sections that should come after the content. 799/// 800void DwarfDebug::endModule() { 801 if (!FirstCU) return; 802 const Module *M = MMI->getModule(); 803 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap; 804 805 // Collect info for variables that were optimized out. 806 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) { 807 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { 808 DICompileUnit TheCU(CU_Nodes->getOperand(i)); 809 DIArray Subprograms = TheCU.getSubprograms(); 810 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) { 811 DISubprogram SP(Subprograms.getElement(i)); 812 if (ProcessedSPNodes.count(SP) != 0) continue; 813 if (!SP.Verify()) continue; 814 if (!SP.isDefinition()) continue; 815 DIArray Variables = SP.getVariables(); 816 if (Variables.getNumElements() == 0) continue; 817 818 LexicalScope *Scope = 819 new LexicalScope(NULL, DIDescriptor(SP), NULL, false); 820 DeadFnScopeMap[SP] = Scope; 821 822 // Construct subprogram DIE and add variables DIEs. 823 CompileUnit *SPCU = CUMap.lookup(TheCU); 824 assert(SPCU && "Unable to find Compile Unit!"); 825 constructSubprogramDIE(SPCU, SP); 826 DIE *ScopeDIE = SPCU->getDIE(SP); 827 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) { 828 DIVariable DV(Variables.getElement(vi)); 829 if (!DV.Verify()) continue; 830 DbgVariable *NewVar = new DbgVariable(DV, NULL); 831 if (DIE *VariableDIE = 832 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope())) 833 ScopeDIE->addChild(VariableDIE); 834 } 835 } 836 } 837 } 838 839 // Attach DW_AT_inline attribute with inlined subprogram DIEs. 840 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(), 841 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) { 842 DIE *ISP = *AI; 843 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined); 844 } 845 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(), 846 AE = AbstractSPDies.end(); AI != AE; ++AI) { 847 DIE *ISP = AI->second; 848 if (InlinedSubprogramDIEs.count(ISP)) 849 continue; 850 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined); 851 } 852 853 // Emit DW_AT_containing_type attribute to connect types with their 854 // vtable holding type. 855 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(), 856 CUE = CUMap.end(); CUI != CUE; ++CUI) { 857 CompileUnit *TheCU = CUI->second; 858 TheCU->constructContainingTypeDIEs(); 859 } 860 861 // Standard sections final addresses. 862 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection()); 863 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end")); 864 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection()); 865 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end")); 866 867 // End text sections. 868 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) { 869 Asm->OutStreamer.SwitchSection(SectionMap[I]); 870 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1)); 871 } 872 873 // Compute DIE offsets and sizes. 874 computeSizeAndOffsets(); 875 876 // Emit initial sections. 877 EmitSectionLabels(); 878 879 // Emit all the DIEs into a debug info section 880 emitDebugInfo(); 881 882 // Corresponding abbreviations into a abbrev section. 883 emitAbbreviations(); 884 885 // Emit info into the dwarf accelerator table sections. 886 if (useDwarfAccelTables()) { 887 emitAccelNames(); 888 emitAccelObjC(); 889 emitAccelNamespaces(); 890 emitAccelTypes(); 891 } 892 893 // Emit info into a debug pubtypes section. 894 // TODO: When we don't need the option anymore we can 895 // remove all of the code that adds to the table. 896 if (useDarwinGDBCompat()) 897 emitDebugPubTypes(); 898 899 // Emit info into a debug loc section. 900 emitDebugLoc(); 901 902 // Emit info into a debug aranges section. 903 EmitDebugARanges(); 904 905 // Emit info into a debug ranges section. 906 emitDebugRanges(); 907 908 // Emit info into a debug macinfo section. 909 emitDebugMacInfo(); 910 911 // Emit inline info. 912 // TODO: When we don't need the option anymore we 913 // can remove all of the code that this section 914 // depends upon. 915 if (useDarwinGDBCompat()) 916 emitDebugInlineInfo(); 917 918 // Emit info into a debug str section. 919 emitDebugStr(); 920 921 // clean up. 922 DeleteContainerSeconds(DeadFnScopeMap); 923 SPMap.clear(); 924 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 925 E = CUMap.end(); I != E; ++I) 926 delete I->second; 927 FirstCU = NULL; // Reset for the next Module, if any. 928} 929 930/// findAbstractVariable - Find abstract variable, if any, associated with Var. 931DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV, 932 DebugLoc ScopeLoc) { 933 LLVMContext &Ctx = DV->getContext(); 934 // More then one inlined variable corresponds to one abstract variable. 935 DIVariable Var = cleanseInlinedVariable(DV, Ctx); 936 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var); 937 if (AbsDbgVariable) 938 return AbsDbgVariable; 939 940 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx)); 941 if (!Scope) 942 return NULL; 943 944 AbsDbgVariable = new DbgVariable(Var, NULL); 945 addScopeVariable(Scope, AbsDbgVariable); 946 AbstractVariables[Var] = AbsDbgVariable; 947 return AbsDbgVariable; 948} 949 950/// addCurrentFnArgument - If Var is a current function argument then add 951/// it to CurrentFnArguments list. 952bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF, 953 DbgVariable *Var, LexicalScope *Scope) { 954 if (!LScopes.isCurrentFunctionScope(Scope)) 955 return false; 956 DIVariable DV = Var->getVariable(); 957 if (DV.getTag() != dwarf::DW_TAG_arg_variable) 958 return false; 959 unsigned ArgNo = DV.getArgNumber(); 960 if (ArgNo == 0) 961 return false; 962 963 size_t Size = CurrentFnArguments.size(); 964 if (Size == 0) 965 CurrentFnArguments.resize(MF->getFunction()->arg_size()); 966 // llvm::Function argument size is not good indicator of how many 967 // arguments does the function have at source level. 968 if (ArgNo > Size) 969 CurrentFnArguments.resize(ArgNo * 2); 970 CurrentFnArguments[ArgNo - 1] = Var; 971 return true; 972} 973 974/// collectVariableInfoFromMMITable - Collect variable information from 975/// side table maintained by MMI. 976void 977DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF, 978 SmallPtrSet<const MDNode *, 16> &Processed) { 979 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo(); 980 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(), 981 VE = VMap.end(); VI != VE; ++VI) { 982 const MDNode *Var = VI->first; 983 if (!Var) continue; 984 Processed.insert(Var); 985 DIVariable DV(Var); 986 const std::pair<unsigned, DebugLoc> &VP = VI->second; 987 988 LexicalScope *Scope = LScopes.findLexicalScope(VP.second); 989 990 // If variable scope is not found then skip this variable. 991 if (Scope == 0) 992 continue; 993 994 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second); 995 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable); 996 RegVar->setFrameIndex(VP.first); 997 if (!addCurrentFnArgument(MF, RegVar, Scope)) 998 addScopeVariable(Scope, RegVar); 999 if (AbsDbgVariable) 1000 AbsDbgVariable->setFrameIndex(VP.first); 1001 } 1002} 1003 1004/// isDbgValueInDefinedReg - Return true if debug value, encoded by 1005/// DBG_VALUE instruction, is in a defined reg. 1006static bool isDbgValueInDefinedReg(const MachineInstr *MI) { 1007 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!"); 1008 return MI->getNumOperands() == 3 && 1009 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() && 1010 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0; 1011} 1012 1013/// getDebugLocEntry - Get .debug_loc entry for the instruction range starting 1014/// at MI. 1015static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm, 1016 const MCSymbol *FLabel, 1017 const MCSymbol *SLabel, 1018 const MachineInstr *MI) { 1019 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata(); 1020 1021 if (MI->getNumOperands() != 3) { 1022 MachineLocation MLoc = Asm->getDebugValueLocation(MI); 1023 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var); 1024 } 1025 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) { 1026 MachineLocation MLoc; 1027 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm()); 1028 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var); 1029 } 1030 if (MI->getOperand(0).isImm()) 1031 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm()); 1032 if (MI->getOperand(0).isFPImm()) 1033 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm()); 1034 if (MI->getOperand(0).isCImm()) 1035 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm()); 1036 1037 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!"); 1038} 1039 1040/// collectVariableInfo - Find variables for each lexical scope. 1041void 1042DwarfDebug::collectVariableInfo(const MachineFunction *MF, 1043 SmallPtrSet<const MDNode *, 16> &Processed) { 1044 1045 /// collection info from MMI table. 1046 collectVariableInfoFromMMITable(MF, Processed); 1047 1048 for (SmallVectorImpl<const MDNode*>::const_iterator 1049 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE; 1050 ++UVI) { 1051 const MDNode *Var = *UVI; 1052 if (Processed.count(Var)) 1053 continue; 1054 1055 // History contains relevant DBG_VALUE instructions for Var and instructions 1056 // clobbering it. 1057 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var]; 1058 if (History.empty()) 1059 continue; 1060 const MachineInstr *MInsn = History.front(); 1061 1062 DIVariable DV(Var); 1063 LexicalScope *Scope = NULL; 1064 if (DV.getTag() == dwarf::DW_TAG_arg_variable && 1065 DISubprogram(DV.getContext()).describes(MF->getFunction())) 1066 Scope = LScopes.getCurrentFunctionScope(); 1067 else { 1068 if (DV.getVersion() <= LLVMDebugVersion9) 1069 Scope = LScopes.findLexicalScope(MInsn->getDebugLoc()); 1070 else { 1071 if (MDNode *IA = DV.getInlinedAt()) 1072 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA)); 1073 else 1074 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1))); 1075 } 1076 } 1077 // If variable scope is not found then skip this variable. 1078 if (!Scope) 1079 continue; 1080 1081 Processed.insert(DV); 1082 assert(MInsn->isDebugValue() && "History must begin with debug value"); 1083 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc()); 1084 DbgVariable *RegVar = new DbgVariable(DV, AbsVar); 1085 if (!addCurrentFnArgument(MF, RegVar, Scope)) 1086 addScopeVariable(Scope, RegVar); 1087 if (AbsVar) 1088 AbsVar->setMInsn(MInsn); 1089 1090 // Simplify ranges that are fully coalesced. 1091 if (History.size() <= 1 || (History.size() == 2 && 1092 MInsn->isIdenticalTo(History.back()))) { 1093 RegVar->setMInsn(MInsn); 1094 continue; 1095 } 1096 1097 // handle multiple DBG_VALUE instructions describing one variable. 1098 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size()); 1099 1100 for (SmallVectorImpl<const MachineInstr*>::const_iterator 1101 HI = History.begin(), HE = History.end(); HI != HE; ++HI) { 1102 const MachineInstr *Begin = *HI; 1103 assert(Begin->isDebugValue() && "Invalid History entry"); 1104 1105 // Check if DBG_VALUE is truncating a range. 1106 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() 1107 && !Begin->getOperand(0).getReg()) 1108 continue; 1109 1110 // Compute the range for a register location. 1111 const MCSymbol *FLabel = getLabelBeforeInsn(Begin); 1112 const MCSymbol *SLabel = 0; 1113 1114 if (HI + 1 == HE) 1115 // If Begin is the last instruction in History then its value is valid 1116 // until the end of the function. 1117 SLabel = FunctionEndSym; 1118 else { 1119 const MachineInstr *End = HI[1]; 1120 DEBUG(dbgs() << "DotDebugLoc Pair:\n" 1121 << "\t" << *Begin << "\t" << *End << "\n"); 1122 if (End->isDebugValue()) 1123 SLabel = getLabelBeforeInsn(End); 1124 else { 1125 // End is a normal instruction clobbering the range. 1126 SLabel = getLabelAfterInsn(End); 1127 assert(SLabel && "Forgot label after clobber instruction"); 1128 ++HI; 1129 } 1130 } 1131 1132 // The value is valid until the next DBG_VALUE or clobber. 1133 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel, 1134 Begin)); 1135 } 1136 DotDebugLocEntries.push_back(DotDebugLocEntry()); 1137 } 1138 1139 // Collect info for variables that were optimized out. 1140 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1141 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables(); 1142 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { 1143 DIVariable DV(Variables.getElement(i)); 1144 if (!DV || !DV.Verify() || !Processed.insert(DV)) 1145 continue; 1146 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) 1147 addScopeVariable(Scope, new DbgVariable(DV, NULL)); 1148 } 1149} 1150 1151/// getLabelBeforeInsn - Return Label preceding the instruction. 1152const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) { 1153 MCSymbol *Label = LabelsBeforeInsn.lookup(MI); 1154 assert(Label && "Didn't insert label before instruction"); 1155 return Label; 1156} 1157 1158/// getLabelAfterInsn - Return Label immediately following the instruction. 1159const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) { 1160 return LabelsAfterInsn.lookup(MI); 1161} 1162 1163/// beginInstruction - Process beginning of an instruction. 1164void DwarfDebug::beginInstruction(const MachineInstr *MI) { 1165 // Check if source location changes, but ignore DBG_VALUE locations. 1166 if (!MI->isDebugValue()) { 1167 DebugLoc DL = MI->getDebugLoc(); 1168 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) { 1169 unsigned Flags = 0; 1170 PrevInstLoc = DL; 1171 if (DL == PrologEndLoc) { 1172 Flags |= DWARF2_FLAG_PROLOGUE_END; 1173 PrologEndLoc = DebugLoc(); 1174 } 1175 if (PrologEndLoc.isUnknown()) 1176 Flags |= DWARF2_FLAG_IS_STMT; 1177 1178 if (!DL.isUnknown()) { 1179 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext()); 1180 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags); 1181 } else 1182 recordSourceLine(0, 0, 0, 0); 1183 } 1184 } 1185 1186 // Insert labels where requested. 1187 DenseMap<const MachineInstr*, MCSymbol*>::iterator I = 1188 LabelsBeforeInsn.find(MI); 1189 1190 // No label needed. 1191 if (I == LabelsBeforeInsn.end()) 1192 return; 1193 1194 // Label already assigned. 1195 if (I->second) 1196 return; 1197 1198 if (!PrevLabel) { 1199 PrevLabel = MMI->getContext().CreateTempSymbol(); 1200 Asm->OutStreamer.EmitLabel(PrevLabel); 1201 } 1202 I->second = PrevLabel; 1203} 1204 1205/// endInstruction - Process end of an instruction. 1206void DwarfDebug::endInstruction(const MachineInstr *MI) { 1207 // Don't create a new label after DBG_VALUE instructions. 1208 // They don't generate code. 1209 if (!MI->isDebugValue()) 1210 PrevLabel = 0; 1211 1212 DenseMap<const MachineInstr*, MCSymbol*>::iterator I = 1213 LabelsAfterInsn.find(MI); 1214 1215 // No label needed. 1216 if (I == LabelsAfterInsn.end()) 1217 return; 1218 1219 // Label already assigned. 1220 if (I->second) 1221 return; 1222 1223 // We need a label after this instruction. 1224 if (!PrevLabel) { 1225 PrevLabel = MMI->getContext().CreateTempSymbol(); 1226 Asm->OutStreamer.EmitLabel(PrevLabel); 1227 } 1228 I->second = PrevLabel; 1229} 1230 1231/// identifyScopeMarkers() - 1232/// Each LexicalScope has first instruction and last instruction to mark 1233/// beginning and end of a scope respectively. Create an inverse map that list 1234/// scopes starts (and ends) with an instruction. One instruction may start (or 1235/// end) multiple scopes. Ignore scopes that are not reachable. 1236void DwarfDebug::identifyScopeMarkers() { 1237 SmallVector<LexicalScope *, 4> WorkList; 1238 WorkList.push_back(LScopes.getCurrentFunctionScope()); 1239 while (!WorkList.empty()) { 1240 LexicalScope *S = WorkList.pop_back_val(); 1241 1242 const SmallVector<LexicalScope *, 4> &Children = S->getChildren(); 1243 if (!Children.empty()) 1244 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(), 1245 SE = Children.end(); SI != SE; ++SI) 1246 WorkList.push_back(*SI); 1247 1248 if (S->isAbstractScope()) 1249 continue; 1250 1251 const SmallVector<InsnRange, 4> &Ranges = S->getRanges(); 1252 if (Ranges.empty()) 1253 continue; 1254 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(), 1255 RE = Ranges.end(); RI != RE; ++RI) { 1256 assert(RI->first && "InsnRange does not have first instruction!"); 1257 assert(RI->second && "InsnRange does not have second instruction!"); 1258 requestLabelBeforeInsn(RI->first); 1259 requestLabelAfterInsn(RI->second); 1260 } 1261 } 1262} 1263 1264/// getScopeNode - Get MDNode for DebugLoc's scope. 1265static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) { 1266 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx)) 1267 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx); 1268 return DL.getScope(Ctx); 1269} 1270 1271/// getFnDebugLoc - Walk up the scope chain of given debug loc and find 1272/// line number info for the function. 1273static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) { 1274 const MDNode *Scope = getScopeNode(DL, Ctx); 1275 DISubprogram SP = getDISubprogram(Scope); 1276 if (SP.Verify()) { 1277 // Check for number of operands since the compatibility is 1278 // cheap here. 1279 if (SP->getNumOperands() > 19) 1280 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP); 1281 else 1282 return DebugLoc::get(SP.getLineNumber(), 0, SP); 1283 } 1284 1285 return DebugLoc(); 1286} 1287 1288/// beginFunction - Gather pre-function debug information. Assumes being 1289/// emitted immediately after the function entry point. 1290void DwarfDebug::beginFunction(const MachineFunction *MF) { 1291 if (!MMI->hasDebugInfo()) return; 1292 LScopes.initialize(*MF); 1293 if (LScopes.empty()) return; 1294 identifyScopeMarkers(); 1295 1296 FunctionBeginSym = Asm->GetTempSymbol("func_begin", 1297 Asm->getFunctionNumber()); 1298 // Assumes in correct section after the entry point. 1299 Asm->OutStreamer.EmitLabel(FunctionBeginSym); 1300 1301 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned"); 1302 1303 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 1304 /// LiveUserVar - Map physreg numbers to the MDNode they contain. 1305 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs()); 1306 1307 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 1308 I != E; ++I) { 1309 bool AtBlockEntry = true; 1310 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 1311 II != IE; ++II) { 1312 const MachineInstr *MI = II; 1313 1314 if (MI->isDebugValue()) { 1315 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!"); 1316 1317 // Keep track of user variables. 1318 const MDNode *Var = 1319 MI->getOperand(MI->getNumOperands() - 1).getMetadata(); 1320 1321 // Variable is in a register, we need to check for clobbers. 1322 if (isDbgValueInDefinedReg(MI)) 1323 LiveUserVar[MI->getOperand(0).getReg()] = Var; 1324 1325 // Check the history of this variable. 1326 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var]; 1327 if (History.empty()) { 1328 UserVariables.push_back(Var); 1329 // The first mention of a function argument gets the FunctionBeginSym 1330 // label, so arguments are visible when breaking at function entry. 1331 DIVariable DV(Var); 1332 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable && 1333 DISubprogram(getDISubprogram(DV.getContext())) 1334 .describes(MF->getFunction())) 1335 LabelsBeforeInsn[MI] = FunctionBeginSym; 1336 } else { 1337 // We have seen this variable before. Try to coalesce DBG_VALUEs. 1338 const MachineInstr *Prev = History.back(); 1339 if (Prev->isDebugValue()) { 1340 // Coalesce identical entries at the end of History. 1341 if (History.size() >= 2 && 1342 Prev->isIdenticalTo(History[History.size() - 2])) { 1343 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n" 1344 << "\t" << *Prev 1345 << "\t" << *History[History.size() - 2] << "\n"); 1346 History.pop_back(); 1347 } 1348 1349 // Terminate old register assignments that don't reach MI; 1350 MachineFunction::const_iterator PrevMBB = Prev->getParent(); 1351 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) && 1352 isDbgValueInDefinedReg(Prev)) { 1353 // Previous register assignment needs to terminate at the end of 1354 // its basic block. 1355 MachineBasicBlock::const_iterator LastMI = 1356 PrevMBB->getLastNonDebugInstr(); 1357 if (LastMI == PrevMBB->end()) { 1358 // Drop DBG_VALUE for empty range. 1359 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n" 1360 << "\t" << *Prev << "\n"); 1361 History.pop_back(); 1362 } 1363 else { 1364 // Terminate after LastMI. 1365 History.push_back(LastMI); 1366 } 1367 } 1368 } 1369 } 1370 History.push_back(MI); 1371 } else { 1372 // Not a DBG_VALUE instruction. 1373 if (!MI->isLabel()) 1374 AtBlockEntry = false; 1375 1376 // First known non-DBG_VALUE and non-frame setup location marks 1377 // the beginning of the function body. 1378 if (!MI->getFlag(MachineInstr::FrameSetup) && 1379 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())) 1380 PrologEndLoc = MI->getDebugLoc(); 1381 1382 // Check if the instruction clobbers any registers with debug vars. 1383 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(), 1384 MOE = MI->operands_end(); MOI != MOE; ++MOI) { 1385 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg()) 1386 continue; 1387 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true); 1388 AI.isValid(); ++AI) { 1389 unsigned Reg = *AI; 1390 const MDNode *Var = LiveUserVar[Reg]; 1391 if (!Var) 1392 continue; 1393 // Reg is now clobbered. 1394 LiveUserVar[Reg] = 0; 1395 1396 // Was MD last defined by a DBG_VALUE referring to Reg? 1397 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var); 1398 if (HistI == DbgValues.end()) 1399 continue; 1400 SmallVectorImpl<const MachineInstr*> &History = HistI->second; 1401 if (History.empty()) 1402 continue; 1403 const MachineInstr *Prev = History.back(); 1404 // Sanity-check: Register assignments are terminated at the end of 1405 // their block. 1406 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent()) 1407 continue; 1408 // Is the variable still in Reg? 1409 if (!isDbgValueInDefinedReg(Prev) || 1410 Prev->getOperand(0).getReg() != Reg) 1411 continue; 1412 // Var is clobbered. Make sure the next instruction gets a label. 1413 History.push_back(MI); 1414 } 1415 } 1416 } 1417 } 1418 } 1419 1420 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end(); 1421 I != E; ++I) { 1422 SmallVectorImpl<const MachineInstr*> &History = I->second; 1423 if (History.empty()) 1424 continue; 1425 1426 // Make sure the final register assignments are terminated. 1427 const MachineInstr *Prev = History.back(); 1428 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) { 1429 const MachineBasicBlock *PrevMBB = Prev->getParent(); 1430 MachineBasicBlock::const_iterator LastMI = 1431 PrevMBB->getLastNonDebugInstr(); 1432 if (LastMI == PrevMBB->end()) 1433 // Drop DBG_VALUE for empty range. 1434 History.pop_back(); 1435 else { 1436 // Terminate after LastMI. 1437 History.push_back(LastMI); 1438 } 1439 } 1440 // Request labels for the full history. 1441 for (unsigned i = 0, e = History.size(); i != e; ++i) { 1442 const MachineInstr *MI = History[i]; 1443 if (MI->isDebugValue()) 1444 requestLabelBeforeInsn(MI); 1445 else 1446 requestLabelAfterInsn(MI); 1447 } 1448 } 1449 1450 PrevInstLoc = DebugLoc(); 1451 PrevLabel = FunctionBeginSym; 1452 1453 // Record beginning of function. 1454 if (!PrologEndLoc.isUnknown()) { 1455 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc, 1456 MF->getFunction()->getContext()); 1457 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(), 1458 FnStartDL.getScope(MF->getFunction()->getContext()), 1459 0); 1460 } 1461} 1462 1463void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) { 1464// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS); 1465 ScopeVariables[LS].push_back(Var); 1466// Vars.push_back(Var); 1467} 1468 1469/// endFunction - Gather and emit post-function debug information. 1470/// 1471void DwarfDebug::endFunction(const MachineFunction *MF) { 1472 if (!MMI->hasDebugInfo() || LScopes.empty()) return; 1473 1474 // Define end label for subprogram. 1475 FunctionEndSym = Asm->GetTempSymbol("func_end", 1476 Asm->getFunctionNumber()); 1477 // Assumes in correct section after the entry point. 1478 Asm->OutStreamer.EmitLabel(FunctionEndSym); 1479 1480 SmallPtrSet<const MDNode *, 16> ProcessedVars; 1481 collectVariableInfo(MF, ProcessedVars); 1482 1483 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1484 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode()); 1485 assert(TheCU && "Unable to find compile unit!"); 1486 1487 // Construct abstract scopes. 1488 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList(); 1489 for (unsigned i = 0, e = AList.size(); i != e; ++i) { 1490 LexicalScope *AScope = AList[i]; 1491 DISubprogram SP(AScope->getScopeNode()); 1492 if (SP.Verify()) { 1493 // Collect info for variables that were optimized out. 1494 DIArray Variables = SP.getVariables(); 1495 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { 1496 DIVariable DV(Variables.getElement(i)); 1497 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV)) 1498 continue; 1499 // Check that DbgVariable for DV wasn't created earlier, when 1500 // findAbstractVariable() was called for inlined instance of DV. 1501 LLVMContext &Ctx = DV->getContext(); 1502 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx); 1503 if (AbstractVariables.lookup(CleanDV)) 1504 continue; 1505 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext())) 1506 addScopeVariable(Scope, new DbgVariable(DV, NULL)); 1507 } 1508 } 1509 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0) 1510 constructScopeDIE(TheCU, AScope); 1511 } 1512 1513 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope); 1514 1515 if (!MF->getTarget().Options.DisableFramePointerElim(*MF)) 1516 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr); 1517 1518 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(), 1519 MMI->getFrameMoves())); 1520 1521 // Clear debug info 1522 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator 1523 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I) 1524 DeleteContainerPointers(I->second); 1525 ScopeVariables.clear(); 1526 DeleteContainerPointers(CurrentFnArguments); 1527 UserVariables.clear(); 1528 DbgValues.clear(); 1529 AbstractVariables.clear(); 1530 LabelsBeforeInsn.clear(); 1531 LabelsAfterInsn.clear(); 1532 PrevLabel = NULL; 1533} 1534 1535/// recordSourceLine - Register a source line with debug info. Returns the 1536/// unique label that was emitted and which provides correspondence to 1537/// the source line list. 1538void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S, 1539 unsigned Flags) { 1540 StringRef Fn; 1541 StringRef Dir; 1542 unsigned Src = 1; 1543 if (S) { 1544 DIDescriptor Scope(S); 1545 1546 if (Scope.isCompileUnit()) { 1547 DICompileUnit CU(S); 1548 Fn = CU.getFilename(); 1549 Dir = CU.getDirectory(); 1550 } else if (Scope.isFile()) { 1551 DIFile F(S); 1552 Fn = F.getFilename(); 1553 Dir = F.getDirectory(); 1554 } else if (Scope.isSubprogram()) { 1555 DISubprogram SP(S); 1556 Fn = SP.getFilename(); 1557 Dir = SP.getDirectory(); 1558 } else if (Scope.isLexicalBlockFile()) { 1559 DILexicalBlockFile DBF(S); 1560 Fn = DBF.getFilename(); 1561 Dir = DBF.getDirectory(); 1562 } else if (Scope.isLexicalBlock()) { 1563 DILexicalBlock DB(S); 1564 Fn = DB.getFilename(); 1565 Dir = DB.getDirectory(); 1566 } else 1567 llvm_unreachable("Unexpected scope info"); 1568 1569 Src = GetOrCreateSourceID(Fn, Dir); 1570 } 1571 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn); 1572} 1573 1574//===----------------------------------------------------------------------===// 1575// Emit Methods 1576//===----------------------------------------------------------------------===// 1577 1578/// computeSizeAndOffset - Compute the size and offset of a DIE. 1579/// 1580unsigned 1581DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) { 1582 // Get the children. 1583 const std::vector<DIE *> &Children = Die->getChildren(); 1584 1585 // Record the abbreviation. 1586 assignAbbrevNumber(Die->getAbbrev()); 1587 1588 // Get the abbreviation for this DIE. 1589 unsigned AbbrevNumber = Die->getAbbrevNumber(); 1590 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 1591 1592 // Set DIE offset 1593 Die->setOffset(Offset); 1594 1595 // Start the size with the size of abbreviation code. 1596 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber); 1597 1598 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 1599 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 1600 1601 // Size the DIE attribute values. 1602 for (unsigned i = 0, N = Values.size(); i < N; ++i) 1603 // Size attribute value. 1604 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm()); 1605 1606 // Size the DIE children if any. 1607 if (!Children.empty()) { 1608 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes && 1609 "Children flag not set"); 1610 1611 for (unsigned j = 0, M = Children.size(); j < M; ++j) 1612 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M); 1613 1614 // End of children marker. 1615 Offset += sizeof(int8_t); 1616 } 1617 1618 Die->setSize(Offset - Die->getOffset()); 1619 return Offset; 1620} 1621 1622/// computeSizeAndOffsets - Compute the size and offset of all the DIEs. 1623/// 1624void DwarfDebug::computeSizeAndOffsets() { 1625 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1626 E = CUMap.end(); I != E; ++I) { 1627 // Compute size of compile unit header. 1628 unsigned Offset = 1629 sizeof(int32_t) + // Length of Compilation Unit Info 1630 sizeof(int16_t) + // DWARF version number 1631 sizeof(int32_t) + // Offset Into Abbrev. Section 1632 sizeof(int8_t); // Pointer Size (in bytes) 1633 computeSizeAndOffset(I->second->getCUDie(), Offset, true); 1634 } 1635} 1636 1637/// EmitSectionLabels - Emit initial Dwarf sections with a label at 1638/// the start of each one. 1639void DwarfDebug::EmitSectionLabels() { 1640 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 1641 1642 // Dwarf sections base addresses. 1643 DwarfInfoSectionSym = 1644 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info"); 1645 DwarfAbbrevSectionSym = 1646 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev"); 1647 EmitSectionSym(Asm, TLOF.getDwarfARangesSection()); 1648 1649 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection()) 1650 EmitSectionSym(Asm, MacroInfo); 1651 1652 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line"); 1653 EmitSectionSym(Asm, TLOF.getDwarfLocSection()); 1654 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); 1655 DwarfStrSectionSym = 1656 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str"); 1657 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(), 1658 "debug_range"); 1659 1660 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(), 1661 "section_debug_loc"); 1662 1663 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin"); 1664 EmitSectionSym(Asm, TLOF.getDataSection()); 1665} 1666 1667/// emitDIE - Recursively emits a debug information entry. 1668/// 1669void DwarfDebug::emitDIE(DIE *Die) { 1670 // Get the abbreviation for this DIE. 1671 unsigned AbbrevNumber = Die->getAbbrevNumber(); 1672 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 1673 1674 // Emit the code (index) for the abbreviation. 1675 if (Asm->isVerbose()) 1676 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" + 1677 Twine::utohexstr(Die->getOffset()) + ":0x" + 1678 Twine::utohexstr(Die->getSize()) + " " + 1679 dwarf::TagString(Abbrev->getTag())); 1680 Asm->EmitULEB128(AbbrevNumber); 1681 1682 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 1683 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 1684 1685 // Emit the DIE attribute values. 1686 for (unsigned i = 0, N = Values.size(); i < N; ++i) { 1687 unsigned Attr = AbbrevData[i].getAttribute(); 1688 unsigned Form = AbbrevData[i].getForm(); 1689 assert(Form && "Too many attributes for DIE (check abbreviation)"); 1690 1691 if (Asm->isVerbose()) 1692 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr)); 1693 1694 switch (Attr) { 1695 case dwarf::DW_AT_abstract_origin: { 1696 DIEEntry *E = cast<DIEEntry>(Values[i]); 1697 DIE *Origin = E->getEntry(); 1698 unsigned Addr = Origin->getOffset(); 1699 Asm->EmitInt32(Addr); 1700 break; 1701 } 1702 case dwarf::DW_AT_ranges: { 1703 // DW_AT_range Value encodes offset in debug_range section. 1704 DIEInteger *V = cast<DIEInteger>(Values[i]); 1705 1706 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) { 1707 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym, 1708 V->getValue(), 1709 4); 1710 } else { 1711 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym, 1712 V->getValue(), 1713 DwarfDebugRangeSectionSym, 1714 4); 1715 } 1716 break; 1717 } 1718 case dwarf::DW_AT_location: { 1719 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) { 1720 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 1721 Asm->EmitLabelReference(L->getValue(), 4); 1722 else 1723 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4); 1724 } else { 1725 Values[i]->EmitValue(Asm, Form); 1726 } 1727 break; 1728 } 1729 case dwarf::DW_AT_accessibility: { 1730 if (Asm->isVerbose()) { 1731 DIEInteger *V = cast<DIEInteger>(Values[i]); 1732 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue())); 1733 } 1734 Values[i]->EmitValue(Asm, Form); 1735 break; 1736 } 1737 default: 1738 // Emit an attribute using the defined form. 1739 Values[i]->EmitValue(Asm, Form); 1740 break; 1741 } 1742 } 1743 1744 // Emit the DIE children if any. 1745 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) { 1746 const std::vector<DIE *> &Children = Die->getChildren(); 1747 1748 for (unsigned j = 0, M = Children.size(); j < M; ++j) 1749 emitDIE(Children[j]); 1750 1751 if (Asm->isVerbose()) 1752 Asm->OutStreamer.AddComment("End Of Children Mark"); 1753 Asm->EmitInt8(0); 1754 } 1755} 1756 1757/// emitDebugInfo - Emit the debug info section. 1758/// 1759void DwarfDebug::emitDebugInfo() { 1760 // Start debug info section. 1761 Asm->OutStreamer.SwitchSection( 1762 Asm->getObjFileLowering().getDwarfInfoSection()); 1763 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1764 E = CUMap.end(); I != E; ++I) { 1765 CompileUnit *TheCU = I->second; 1766 DIE *Die = TheCU->getCUDie(); 1767 1768 // Emit the compile units header. 1769 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin", 1770 TheCU->getID())); 1771 1772 // Emit size of content not including length itself 1773 unsigned ContentSize = Die->getSize() + 1774 sizeof(int16_t) + // DWARF version number 1775 sizeof(int32_t) + // Offset Into Abbrev. Section 1776 sizeof(int8_t); // Pointer Size (in bytes) 1777 1778 Asm->OutStreamer.AddComment("Length of Compilation Unit Info"); 1779 Asm->EmitInt32(ContentSize); 1780 Asm->OutStreamer.AddComment("DWARF version number"); 1781 Asm->EmitInt16(dwarf::DWARF_VERSION); 1782 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section"); 1783 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), 1784 DwarfAbbrevSectionSym); 1785 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 1786 Asm->EmitInt8(Asm->getDataLayout().getPointerSize()); 1787 1788 emitDIE(Die); 1789 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID())); 1790 } 1791} 1792 1793/// emitAbbreviations - Emit the abbreviation section. 1794/// 1795void DwarfDebug::emitAbbreviations() const { 1796 // Check to see if it is worth the effort. 1797 if (!Abbreviations.empty()) { 1798 // Start the debug abbrev section. 1799 Asm->OutStreamer.SwitchSection( 1800 Asm->getObjFileLowering().getDwarfAbbrevSection()); 1801 1802 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin")); 1803 1804 // For each abbrevation. 1805 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) { 1806 // Get abbreviation data 1807 const DIEAbbrev *Abbrev = Abbreviations[i]; 1808 1809 // Emit the abbrevations code (base 1 index.) 1810 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code"); 1811 1812 // Emit the abbreviations data. 1813 Abbrev->Emit(Asm); 1814 } 1815 1816 // Mark end of abbreviations. 1817 Asm->EmitULEB128(0, "EOM(3)"); 1818 1819 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end")); 1820 } 1821} 1822 1823/// emitEndOfLineMatrix - Emit the last address of the section and the end of 1824/// the line matrix. 1825/// 1826void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { 1827 // Define last address of section. 1828 Asm->OutStreamer.AddComment("Extended Op"); 1829 Asm->EmitInt8(0); 1830 1831 Asm->OutStreamer.AddComment("Op size"); 1832 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1); 1833 Asm->OutStreamer.AddComment("DW_LNE_set_address"); 1834 Asm->EmitInt8(dwarf::DW_LNE_set_address); 1835 1836 Asm->OutStreamer.AddComment("Section end label"); 1837 1838 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd), 1839 Asm->getDataLayout().getPointerSize(), 1840 0/*AddrSpace*/); 1841 1842 // Mark end of matrix. 1843 Asm->OutStreamer.AddComment("DW_LNE_end_sequence"); 1844 Asm->EmitInt8(0); 1845 Asm->EmitInt8(1); 1846 Asm->EmitInt8(1); 1847} 1848 1849/// emitAccelNames - Emit visible names into a hashed accelerator table 1850/// section. 1851void DwarfDebug::emitAccelNames() { 1852 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1853 dwarf::DW_FORM_data4)); 1854 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1855 E = CUMap.end(); I != E; ++I) { 1856 CompileUnit *TheCU = I->second; 1857 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames(); 1858 for (StringMap<std::vector<DIE*> >::const_iterator 1859 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1860 const char *Name = GI->getKeyData(); 1861 const std::vector<DIE *> &Entities = GI->second; 1862 for (std::vector<DIE *>::const_iterator DI = Entities.begin(), 1863 DE = Entities.end(); DI != DE; ++DI) 1864 AT.AddName(Name, (*DI)); 1865 } 1866 } 1867 1868 AT.FinalizeTable(Asm, "Names"); 1869 Asm->OutStreamer.SwitchSection( 1870 Asm->getObjFileLowering().getDwarfAccelNamesSection()); 1871 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin"); 1872 Asm->OutStreamer.EmitLabel(SectionBegin); 1873 1874 // Emit the full data. 1875 AT.Emit(Asm, SectionBegin, this); 1876} 1877 1878/// emitAccelObjC - Emit objective C classes and categories into a hashed 1879/// accelerator table section. 1880void DwarfDebug::emitAccelObjC() { 1881 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1882 dwarf::DW_FORM_data4)); 1883 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1884 E = CUMap.end(); I != E; ++I) { 1885 CompileUnit *TheCU = I->second; 1886 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC(); 1887 for (StringMap<std::vector<DIE*> >::const_iterator 1888 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1889 const char *Name = GI->getKeyData(); 1890 const std::vector<DIE *> &Entities = GI->second; 1891 for (std::vector<DIE *>::const_iterator DI = Entities.begin(), 1892 DE = Entities.end(); DI != DE; ++DI) 1893 AT.AddName(Name, (*DI)); 1894 } 1895 } 1896 1897 AT.FinalizeTable(Asm, "ObjC"); 1898 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering() 1899 .getDwarfAccelObjCSection()); 1900 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin"); 1901 Asm->OutStreamer.EmitLabel(SectionBegin); 1902 1903 // Emit the full data. 1904 AT.Emit(Asm, SectionBegin, this); 1905} 1906 1907/// emitAccelNamespace - Emit namespace dies into a hashed accelerator 1908/// table. 1909void DwarfDebug::emitAccelNamespaces() { 1910 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1911 dwarf::DW_FORM_data4)); 1912 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1913 E = CUMap.end(); I != E; ++I) { 1914 CompileUnit *TheCU = I->second; 1915 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace(); 1916 for (StringMap<std::vector<DIE*> >::const_iterator 1917 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1918 const char *Name = GI->getKeyData(); 1919 const std::vector<DIE *> &Entities = GI->second; 1920 for (std::vector<DIE *>::const_iterator DI = Entities.begin(), 1921 DE = Entities.end(); DI != DE; ++DI) 1922 AT.AddName(Name, (*DI)); 1923 } 1924 } 1925 1926 AT.FinalizeTable(Asm, "namespac"); 1927 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering() 1928 .getDwarfAccelNamespaceSection()); 1929 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin"); 1930 Asm->OutStreamer.EmitLabel(SectionBegin); 1931 1932 // Emit the full data. 1933 AT.Emit(Asm, SectionBegin, this); 1934} 1935 1936/// emitAccelTypes() - Emit type dies into a hashed accelerator table. 1937void DwarfDebug::emitAccelTypes() { 1938 std::vector<DwarfAccelTable::Atom> Atoms; 1939 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1940 dwarf::DW_FORM_data4)); 1941 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag, 1942 dwarf::DW_FORM_data2)); 1943 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags, 1944 dwarf::DW_FORM_data1)); 1945 DwarfAccelTable AT(Atoms); 1946 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1947 E = CUMap.end(); I != E; ++I) { 1948 CompileUnit *TheCU = I->second; 1949 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names 1950 = TheCU->getAccelTypes(); 1951 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator 1952 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1953 const char *Name = GI->getKeyData(); 1954 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second; 1955 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI 1956 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI) 1957 AT.AddName(Name, (*DI).first, (*DI).second); 1958 } 1959 } 1960 1961 AT.FinalizeTable(Asm, "types"); 1962 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering() 1963 .getDwarfAccelTypesSection()); 1964 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin"); 1965 Asm->OutStreamer.EmitLabel(SectionBegin); 1966 1967 // Emit the full data. 1968 AT.Emit(Asm, SectionBegin, this); 1969} 1970 1971void DwarfDebug::emitDebugPubTypes() { 1972 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1973 E = CUMap.end(); I != E; ++I) { 1974 CompileUnit *TheCU = I->second; 1975 // Start the dwarf pubtypes section. 1976 Asm->OutStreamer.SwitchSection( 1977 Asm->getObjFileLowering().getDwarfPubTypesSection()); 1978 Asm->OutStreamer.AddComment("Length of Public Types Info"); 1979 Asm->EmitLabelDifference( 1980 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()), 1981 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4); 1982 1983 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin", 1984 TheCU->getID())); 1985 1986 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version"); 1987 Asm->EmitInt16(dwarf::DWARF_VERSION); 1988 1989 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info"); 1990 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()), 1991 DwarfInfoSectionSym); 1992 1993 Asm->OutStreamer.AddComment("Compilation Unit Length"); 1994 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()), 1995 Asm->GetTempSymbol("info_begin", TheCU->getID()), 1996 4); 1997 1998 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes(); 1999 for (StringMap<DIE*>::const_iterator 2000 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 2001 const char *Name = GI->getKeyData(); 2002 DIE *Entity = GI->second; 2003 2004 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset"); 2005 Asm->EmitInt32(Entity->getOffset()); 2006 2007 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name"); 2008 // Emit the name with a terminating null byte. 2009 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0); 2010 } 2011 2012 Asm->OutStreamer.AddComment("End Mark"); 2013 Asm->EmitInt32(0); 2014 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end", 2015 TheCU->getID())); 2016 } 2017} 2018 2019/// emitDebugStr - Emit visible names into a debug str section. 2020/// 2021void DwarfDebug::emitDebugStr() { 2022 // Check to see if it is worth the effort. 2023 if (StringPool.empty()) return; 2024 2025 // Start the dwarf str section. 2026 Asm->OutStreamer.SwitchSection( 2027 Asm->getObjFileLowering().getDwarfStrSection()); 2028 2029 // Get all of the string pool entries and put them in an array by their ID so 2030 // we can sort them. 2031 SmallVector<std::pair<unsigned, 2032 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries; 2033 2034 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator 2035 I = StringPool.begin(), E = StringPool.end(); I != E; ++I) 2036 Entries.push_back(std::make_pair(I->second.second, &*I)); 2037 2038 array_pod_sort(Entries.begin(), Entries.end()); 2039 2040 for (unsigned i = 0, e = Entries.size(); i != e; ++i) { 2041 // Emit a label for reference from debug information entries. 2042 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first); 2043 2044 // Emit the string itself with a terminating null byte. 2045 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(), 2046 Entries[i].second->getKeyLength()+1), 2047 0/*addrspace*/); 2048 } 2049} 2050 2051/// emitDebugLoc - Emit visible names into a debug loc section. 2052/// 2053void DwarfDebug::emitDebugLoc() { 2054 if (DotDebugLocEntries.empty()) 2055 return; 2056 2057 for (SmallVector<DotDebugLocEntry, 4>::iterator 2058 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end(); 2059 I != E; ++I) { 2060 DotDebugLocEntry &Entry = *I; 2061 if (I + 1 != DotDebugLocEntries.end()) 2062 Entry.Merge(I+1); 2063 } 2064 2065 // Start the dwarf loc section. 2066 Asm->OutStreamer.SwitchSection( 2067 Asm->getObjFileLowering().getDwarfLocSection()); 2068 unsigned char Size = Asm->getDataLayout().getPointerSize(); 2069 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0)); 2070 unsigned index = 1; 2071 for (SmallVector<DotDebugLocEntry, 4>::iterator 2072 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end(); 2073 I != E; ++I, ++index) { 2074 DotDebugLocEntry &Entry = *I; 2075 if (Entry.isMerged()) continue; 2076 if (Entry.isEmpty()) { 2077 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 2078 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 2079 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index)); 2080 } else { 2081 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0); 2082 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0); 2083 DIVariable DV(Entry.Variable); 2084 Asm->OutStreamer.AddComment("Loc expr size"); 2085 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol(); 2086 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol(); 2087 Asm->EmitLabelDifference(end, begin, 2); 2088 Asm->OutStreamer.EmitLabel(begin); 2089 if (Entry.isInt()) { 2090 DIBasicType BTy(DV.getType()); 2091 if (BTy.Verify() && 2092 (BTy.getEncoding() == dwarf::DW_ATE_signed 2093 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) { 2094 Asm->OutStreamer.AddComment("DW_OP_consts"); 2095 Asm->EmitInt8(dwarf::DW_OP_consts); 2096 Asm->EmitSLEB128(Entry.getInt()); 2097 } else { 2098 Asm->OutStreamer.AddComment("DW_OP_constu"); 2099 Asm->EmitInt8(dwarf::DW_OP_constu); 2100 Asm->EmitULEB128(Entry.getInt()); 2101 } 2102 } else if (Entry.isLocation()) { 2103 if (!DV.hasComplexAddress()) 2104 // Regular entry. 2105 Asm->EmitDwarfRegOp(Entry.Loc); 2106 else { 2107 // Complex address entry. 2108 unsigned N = DV.getNumAddrElements(); 2109 unsigned i = 0; 2110 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) { 2111 if (Entry.Loc.getOffset()) { 2112 i = 2; 2113 Asm->EmitDwarfRegOp(Entry.Loc); 2114 Asm->OutStreamer.AddComment("DW_OP_deref"); 2115 Asm->EmitInt8(dwarf::DW_OP_deref); 2116 Asm->OutStreamer.AddComment("DW_OP_plus_uconst"); 2117 Asm->EmitInt8(dwarf::DW_OP_plus_uconst); 2118 Asm->EmitSLEB128(DV.getAddrElement(1)); 2119 } else { 2120 // If first address element is OpPlus then emit 2121 // DW_OP_breg + Offset instead of DW_OP_reg + Offset. 2122 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1)); 2123 Asm->EmitDwarfRegOp(Loc); 2124 i = 2; 2125 } 2126 } else { 2127 Asm->EmitDwarfRegOp(Entry.Loc); 2128 } 2129 2130 // Emit remaining complex address elements. 2131 for (; i < N; ++i) { 2132 uint64_t Element = DV.getAddrElement(i); 2133 if (Element == DIBuilder::OpPlus) { 2134 Asm->EmitInt8(dwarf::DW_OP_plus_uconst); 2135 Asm->EmitULEB128(DV.getAddrElement(++i)); 2136 } else if (Element == DIBuilder::OpDeref) { 2137 if (!Entry.Loc.isReg()) 2138 Asm->EmitInt8(dwarf::DW_OP_deref); 2139 } else 2140 llvm_unreachable("unknown Opcode found in complex address"); 2141 } 2142 } 2143 } 2144 // else ... ignore constant fp. There is not any good way to 2145 // to represent them here in dwarf. 2146 Asm->OutStreamer.EmitLabel(end); 2147 } 2148 } 2149} 2150 2151/// EmitDebugARanges - Emit visible names into a debug aranges section. 2152/// 2153void DwarfDebug::EmitDebugARanges() { 2154 // Start the dwarf aranges section. 2155 Asm->OutStreamer.SwitchSection( 2156 Asm->getObjFileLowering().getDwarfARangesSection()); 2157} 2158 2159/// emitDebugRanges - Emit visible names into a debug ranges section. 2160/// 2161void DwarfDebug::emitDebugRanges() { 2162 // Start the dwarf ranges section. 2163 Asm->OutStreamer.SwitchSection( 2164 Asm->getObjFileLowering().getDwarfRangesSection()); 2165 unsigned char Size = Asm->getDataLayout().getPointerSize(); 2166 for (SmallVector<const MCSymbol *, 8>::iterator 2167 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end(); 2168 I != E; ++I) { 2169 if (*I) 2170 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0); 2171 else 2172 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 2173 } 2174} 2175 2176/// emitDebugMacInfo - Emit visible names into a debug macinfo section. 2177/// 2178void DwarfDebug::emitDebugMacInfo() { 2179 if (const MCSection *LineInfo = 2180 Asm->getObjFileLowering().getDwarfMacroInfoSection()) { 2181 // Start the dwarf macinfo section. 2182 Asm->OutStreamer.SwitchSection(LineInfo); 2183 } 2184} 2185 2186/// emitDebugInlineInfo - Emit inline info using following format. 2187/// Section Header: 2188/// 1. length of section 2189/// 2. Dwarf version number 2190/// 3. address size. 2191/// 2192/// Entries (one "entry" for each function that was inlined): 2193/// 2194/// 1. offset into __debug_str section for MIPS linkage name, if exists; 2195/// otherwise offset into __debug_str for regular function name. 2196/// 2. offset into __debug_str section for regular function name. 2197/// 3. an unsigned LEB128 number indicating the number of distinct inlining 2198/// instances for the function. 2199/// 2200/// The rest of the entry consists of a {die_offset, low_pc} pair for each 2201/// inlined instance; the die_offset points to the inlined_subroutine die in the 2202/// __debug_info section, and the low_pc is the starting address for the 2203/// inlining instance. 2204void DwarfDebug::emitDebugInlineInfo() { 2205 if (!Asm->MAI->doesDwarfUseInlineInfoSection()) 2206 return; 2207 2208 if (!FirstCU) 2209 return; 2210 2211 Asm->OutStreamer.SwitchSection( 2212 Asm->getObjFileLowering().getDwarfDebugInlineSection()); 2213 2214 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry"); 2215 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1), 2216 Asm->GetTempSymbol("debug_inlined_begin", 1), 4); 2217 2218 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1)); 2219 2220 Asm->OutStreamer.AddComment("Dwarf Version"); 2221 Asm->EmitInt16(dwarf::DWARF_VERSION); 2222 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 2223 Asm->EmitInt8(Asm->getDataLayout().getPointerSize()); 2224 2225 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(), 2226 E = InlinedSPNodes.end(); I != E; ++I) { 2227 2228 const MDNode *Node = *I; 2229 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II 2230 = InlineInfo.find(Node); 2231 SmallVector<InlineInfoLabels, 4> &Labels = II->second; 2232 DISubprogram SP(Node); 2233 StringRef LName = SP.getLinkageName(); 2234 StringRef Name = SP.getName(); 2235 2236 Asm->OutStreamer.AddComment("MIPS linkage name"); 2237 if (LName.empty()) 2238 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym); 2239 else 2240 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)), 2241 DwarfStrSectionSym); 2242 2243 Asm->OutStreamer.AddComment("Function name"); 2244 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym); 2245 Asm->EmitULEB128(Labels.size(), "Inline count"); 2246 2247 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(), 2248 LE = Labels.end(); LI != LE; ++LI) { 2249 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset"); 2250 Asm->EmitInt32(LI->second->getOffset()); 2251 2252 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc"); 2253 Asm->OutStreamer.EmitSymbolValue(LI->first, 2254 Asm->getDataLayout().getPointerSize(),0); 2255 } 2256 } 2257 2258 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1)); 2259} 2260