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