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