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 // We'd like to list the prologue as "not statements" but GDB behaves 1515 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing. 1516 DWARF2_FLAG_IS_STMT); 1517 } 1518 } 1519 1520 void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) { 1521 // SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS); 1522 ScopeVariables[LS].push_back(Var); 1523 // Vars.push_back(Var); 1524 } 1525 1526 // Gather and emit post-function debug information. 1527 void DwarfDebug::endFunction(const MachineFunction *MF) { 1528 if (!MMI->hasDebugInfo() || LScopes.empty()) return; 1529 1530 // Define end label for subprogram. 1531 FunctionEndSym = Asm->GetTempSymbol("func_end", 1532 Asm->getFunctionNumber()); 1533 // Assumes in correct section after the entry point. 1534 Asm->OutStreamer.EmitLabel(FunctionEndSym); 1535 1536 SmallPtrSet<const MDNode *, 16> ProcessedVars; 1537 collectVariableInfo(MF, ProcessedVars); 1538 1539 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1540 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode()); 1541 assert(TheCU && "Unable to find compile unit!"); 1542 1543 // Construct abstract scopes. 1544 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList(); 1545 for (unsigned i = 0, e = AList.size(); i != e; ++i) { 1546 LexicalScope *AScope = AList[i]; 1547 DISubprogram SP(AScope->getScopeNode()); 1548 if (SP.Verify()) { 1549 // Collect info for variables that were optimized out. 1550 DIArray Variables = SP.getVariables(); 1551 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { 1552 DIVariable DV(Variables.getElement(i)); 1553 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV)) 1554 continue; 1555 // Check that DbgVariable for DV wasn't created earlier, when 1556 // findAbstractVariable() was called for inlined instance of DV. 1557 LLVMContext &Ctx = DV->getContext(); 1558 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx); 1559 if (AbstractVariables.lookup(CleanDV)) 1560 continue; 1561 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext())) 1562 addScopeVariable(Scope, new DbgVariable(DV, NULL)); 1563 } 1564 } 1565 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0) 1566 constructScopeDIE(TheCU, AScope); 1567 } 1568 1569 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope); 1570 1571 if (!MF->getTarget().Options.DisableFramePointerElim(*MF)) 1572 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr); 1573 1574 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(), 1575 MMI->getFrameMoves())); 1576 1577 // Clear debug info 1578 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator 1579 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I) 1580 DeleteContainerPointers(I->second); 1581 ScopeVariables.clear(); 1582 DeleteContainerPointers(CurrentFnArguments); 1583 UserVariables.clear(); 1584 DbgValues.clear(); 1585 AbstractVariables.clear(); 1586 LabelsBeforeInsn.clear(); 1587 LabelsAfterInsn.clear(); 1588 PrevLabel = NULL; 1589 } 1590 1591 // Register a source line with debug info. Returns the unique label that was 1592 // emitted and which provides correspondence to the source line list. 1593 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S, 1594 unsigned Flags) { 1595 StringRef Fn; 1596 StringRef Dir; 1597 unsigned Src = 1; 1598 if (S) { 1599 DIDescriptor Scope(S); 1600 1601 if (Scope.isCompileUnit()) { 1602 DICompileUnit CU(S); 1603 Fn = CU.getFilename(); 1604 Dir = CU.getDirectory(); 1605 } else if (Scope.isFile()) { 1606 DIFile F(S); 1607 Fn = F.getFilename(); 1608 Dir = F.getDirectory(); 1609 } else if (Scope.isSubprogram()) { 1610 DISubprogram SP(S); 1611 Fn = SP.getFilename(); 1612 Dir = SP.getDirectory(); 1613 } else if (Scope.isLexicalBlockFile()) { 1614 DILexicalBlockFile DBF(S); 1615 Fn = DBF.getFilename(); 1616 Dir = DBF.getDirectory(); 1617 } else if (Scope.isLexicalBlock()) { 1618 DILexicalBlock DB(S); 1619 Fn = DB.getFilename(); 1620 Dir = DB.getDirectory(); 1621 } else 1622 llvm_unreachable("Unexpected scope info"); 1623 1624 Src = getOrCreateSourceID(Fn, Dir); 1625 } 1626 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn); 1627 } 1628 1629 //===----------------------------------------------------------------------===// 1630 // Emit Methods 1631 //===----------------------------------------------------------------------===// 1632 1633 // Compute the size and offset of a DIE. 1634 unsigned 1635 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset) { 1636 // Get the children. 1637 const std::vector<DIE *> &Children = Die->getChildren(); 1638 1639 // Record the abbreviation. 1640 assignAbbrevNumber(Die->getAbbrev()); 1641 1642 // Get the abbreviation for this DIE. 1643 unsigned AbbrevNumber = Die->getAbbrevNumber(); 1644 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 1645 1646 // Set DIE offset 1647 Die->setOffset(Offset); 1648 1649 // Start the size with the size of abbreviation code. 1650 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber); 1651 1652 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 1653 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 1654 1655 // Size the DIE attribute values. 1656 for (unsigned i = 0, N = Values.size(); i < N; ++i) 1657 // Size attribute value. 1658 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm()); 1659 1660 // Size the DIE children if any. 1661 if (!Children.empty()) { 1662 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes && 1663 "Children flag not set"); 1664 1665 for (unsigned j = 0, M = Children.size(); j < M; ++j) 1666 Offset = computeSizeAndOffset(Children[j], Offset); 1667 1668 // End of children marker. 1669 Offset += sizeof(int8_t); 1670 } 1671 1672 Die->setSize(Offset - Die->getOffset()); 1673 return Offset; 1674 } 1675 1676 // Compute the size and offset of all the DIEs. 1677 void DwarfDebug::computeSizeAndOffsets() { 1678 if (FissionCU) { 1679 unsigned Offset = 1680 sizeof(int32_t) + // Length of Compilation Unit Info 1681 sizeof(int16_t) + // DWARF version number 1682 sizeof(int32_t) + // Offset Into Abbrev. Section 1683 sizeof(int8_t); // Pointer Size (in bytes) 1684 1685 computeSizeAndOffset(FissionCU->getCUDie(), Offset); 1686 } 1687 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1688 E = CUMap.end(); I != E; ++I) { 1689 // Compute size of compile unit header. 1690 unsigned Offset = 1691 sizeof(int32_t) + // Length of Compilation Unit Info 1692 sizeof(int16_t) + // DWARF version number 1693 sizeof(int32_t) + // Offset Into Abbrev. Section 1694 sizeof(int8_t); // Pointer Size (in bytes) 1695 computeSizeAndOffset(I->second->getCUDie(), Offset); 1696 } 1697 } 1698 1699 // Emit initial Dwarf sections with a label at the start of each one. 1700 void DwarfDebug::emitSectionLabels() { 1701 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 1702 1703 // Dwarf sections base addresses. 1704 DwarfInfoSectionSym = 1705 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info"); 1706 DwarfAbbrevSectionSym = 1707 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev"); 1708 emitSectionSym(Asm, TLOF.getDwarfARangesSection()); 1709 1710 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection()) 1711 emitSectionSym(Asm, MacroInfo); 1712 1713 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line"); 1714 emitSectionSym(Asm, TLOF.getDwarfLocSection()); 1715 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); 1716 DwarfStrSectionSym = 1717 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str"); 1718 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(), 1719 "debug_range"); 1720 1721 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(), 1722 "section_debug_loc"); 1723 1724 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin"); 1725 emitSectionSym(Asm, TLOF.getDataSection()); 1726 } 1727 1728 // Recursively emits a debug information entry. 1729 void DwarfDebug::emitDIE(DIE *Die) { 1730 // Get the abbreviation for this DIE. 1731 unsigned AbbrevNumber = Die->getAbbrevNumber(); 1732 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 1733 1734 // Emit the code (index) for the abbreviation. 1735 if (Asm->isVerbose()) 1736 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" + 1737 Twine::utohexstr(Die->getOffset()) + ":0x" + 1738 Twine::utohexstr(Die->getSize()) + " " + 1739 dwarf::TagString(Abbrev->getTag())); 1740 Asm->EmitULEB128(AbbrevNumber); 1741 1742 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 1743 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 1744 1745 // Emit the DIE attribute values. 1746 for (unsigned i = 0, N = Values.size(); i < N; ++i) { 1747 unsigned Attr = AbbrevData[i].getAttribute(); 1748 unsigned Form = AbbrevData[i].getForm(); 1749 assert(Form && "Too many attributes for DIE (check abbreviation)"); 1750 1751 if (Asm->isVerbose()) 1752 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr)); 1753 1754 switch (Attr) { 1755 case dwarf::DW_AT_abstract_origin: { 1756 DIEEntry *E = cast<DIEEntry>(Values[i]); 1757 DIE *Origin = E->getEntry(); 1758 unsigned Addr = Origin->getOffset(); 1759 Asm->EmitInt32(Addr); 1760 break; 1761 } 1762 case dwarf::DW_AT_ranges: { 1763 // DW_AT_range Value encodes offset in debug_range section. 1764 DIEInteger *V = cast<DIEInteger>(Values[i]); 1765 1766 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) { 1767 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym, 1768 V->getValue(), 1769 4); 1770 } else { 1771 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym, 1772 V->getValue(), 1773 DwarfDebugRangeSectionSym, 1774 4); 1775 } 1776 break; 1777 } 1778 case dwarf::DW_AT_location: { 1779 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) { 1780 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 1781 Asm->EmitLabelReference(L->getValue(), 4); 1782 else 1783 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4); 1784 } else { 1785 Values[i]->EmitValue(Asm, Form); 1786 } 1787 break; 1788 } 1789 case dwarf::DW_AT_accessibility: { 1790 if (Asm->isVerbose()) { 1791 DIEInteger *V = cast<DIEInteger>(Values[i]); 1792 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue())); 1793 } 1794 Values[i]->EmitValue(Asm, Form); 1795 break; 1796 } 1797 default: 1798 // Emit an attribute using the defined form. 1799 Values[i]->EmitValue(Asm, Form); 1800 break; 1801 } 1802 } 1803 1804 // Emit the DIE children if any. 1805 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) { 1806 const std::vector<DIE *> &Children = Die->getChildren(); 1807 1808 for (unsigned j = 0, M = Children.size(); j < M; ++j) 1809 emitDIE(Children[j]); 1810 1811 if (Asm->isVerbose()) 1812 Asm->OutStreamer.AddComment("End Of Children Mark"); 1813 Asm->EmitInt8(0); 1814 } 1815 } 1816 1817 void DwarfDebug::emitCompileUnits(const MCSection *Section) { 1818 Asm->OutStreamer.SwitchSection(Section); 1819 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1820 E = CUMap.end(); I != E; ++I) { 1821 CompileUnit *TheCU = I->second; 1822 DIE *Die = TheCU->getCUDie(); 1823 1824 // Emit the compile units header. 1825 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin", 1826 TheCU->getUniqueID())); 1827 1828 // Emit size of content not including length itself 1829 unsigned ContentSize = Die->getSize() + 1830 sizeof(int16_t) + // DWARF version number 1831 sizeof(int32_t) + // Offset Into Abbrev. Section 1832 sizeof(int8_t); // Pointer Size (in bytes) 1833 1834 Asm->OutStreamer.AddComment("Length of Compilation Unit Info"); 1835 Asm->EmitInt32(ContentSize); 1836 Asm->OutStreamer.AddComment("DWARF version number"); 1837 Asm->EmitInt16(dwarf::DWARF_VERSION); 1838 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section"); 1839 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), 1840 DwarfAbbrevSectionSym); 1841 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 1842 Asm->EmitInt8(Asm->getDataLayout().getPointerSize()); 1843 1844 emitDIE(Die); 1845 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", 1846 TheCU->getUniqueID())); 1847 } 1848 } 1849 1850 // Emit the debug info section. 1851 void DwarfDebug::emitDebugInfo() { 1852 if (!useDwarfFission()) 1853 emitCompileUnits(Asm->getObjFileLowering().getDwarfInfoSection()); 1854 else 1855 emitFissionSkeletonCU(Asm->getObjFileLowering().getDwarfInfoSection()); 1856 } 1857 1858 // Emit the abbreviation section. 1859 void DwarfDebug::emitAbbreviations() { 1860 // Check to see if it is worth the effort. 1861 if (!Abbreviations.empty()) { 1862 // Start the debug abbrev section. 1863 Asm->OutStreamer.SwitchSection( 1864 Asm->getObjFileLowering().getDwarfAbbrevSection()); 1865 1866 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin")); 1867 1868 // For each abbrevation. 1869 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) { 1870 // Get abbreviation data 1871 const DIEAbbrev *Abbrev = Abbreviations[i]; 1872 1873 // Emit the abbrevations code (base 1 index.) 1874 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code"); 1875 1876 // Emit the abbreviations data. 1877 Abbrev->Emit(Asm); 1878 } 1879 1880 // Mark end of abbreviations. 1881 Asm->EmitULEB128(0, "EOM(3)"); 1882 1883 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end")); 1884 } 1885 } 1886 1887 // Emit the last address of the section and the end of the line matrix. 1888 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { 1889 // Define last address of section. 1890 Asm->OutStreamer.AddComment("Extended Op"); 1891 Asm->EmitInt8(0); 1892 1893 Asm->OutStreamer.AddComment("Op size"); 1894 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1); 1895 Asm->OutStreamer.AddComment("DW_LNE_set_address"); 1896 Asm->EmitInt8(dwarf::DW_LNE_set_address); 1897 1898 Asm->OutStreamer.AddComment("Section end label"); 1899 1900 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd), 1901 Asm->getDataLayout().getPointerSize(), 1902 0/*AddrSpace*/); 1903 1904 // Mark end of matrix. 1905 Asm->OutStreamer.AddComment("DW_LNE_end_sequence"); 1906 Asm->EmitInt8(0); 1907 Asm->EmitInt8(1); 1908 Asm->EmitInt8(1); 1909 } 1910 1911 // Emit visible names into a hashed accelerator table section. 1912 void DwarfDebug::emitAccelNames() { 1913 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1914 dwarf::DW_FORM_data4)); 1915 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1916 E = CUMap.end(); I != E; ++I) { 1917 CompileUnit *TheCU = I->second; 1918 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames(); 1919 for (StringMap<std::vector<DIE*> >::const_iterator 1920 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1921 const char *Name = GI->getKeyData(); 1922 const std::vector<DIE *> &Entities = GI->second; 1923 for (std::vector<DIE *>::const_iterator DI = Entities.begin(), 1924 DE = Entities.end(); DI != DE; ++DI) 1925 AT.AddName(Name, (*DI)); 1926 } 1927 } 1928 1929 AT.FinalizeTable(Asm, "Names"); 1930 Asm->OutStreamer.SwitchSection( 1931 Asm->getObjFileLowering().getDwarfAccelNamesSection()); 1932 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin"); 1933 Asm->OutStreamer.EmitLabel(SectionBegin); 1934 1935 // Emit the full data. 1936 AT.Emit(Asm, SectionBegin, this); 1937 } 1938 1939 // Emit objective C classes and categories into a hashed accelerator table section. 1940 void DwarfDebug::emitAccelObjC() { 1941 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1942 dwarf::DW_FORM_data4)); 1943 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1944 E = CUMap.end(); I != E; ++I) { 1945 CompileUnit *TheCU = I->second; 1946 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC(); 1947 for (StringMap<std::vector<DIE*> >::const_iterator 1948 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1949 const char *Name = GI->getKeyData(); 1950 const std::vector<DIE *> &Entities = GI->second; 1951 for (std::vector<DIE *>::const_iterator DI = Entities.begin(), 1952 DE = Entities.end(); DI != DE; ++DI) 1953 AT.AddName(Name, (*DI)); 1954 } 1955 } 1956 1957 AT.FinalizeTable(Asm, "ObjC"); 1958 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering() 1959 .getDwarfAccelObjCSection()); 1960 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin"); 1961 Asm->OutStreamer.EmitLabel(SectionBegin); 1962 1963 // Emit the full data. 1964 AT.Emit(Asm, SectionBegin, this); 1965 } 1966 1967 // Emit namespace dies into a hashed accelerator table. 1968 void DwarfDebug::emitAccelNamespaces() { 1969 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1970 dwarf::DW_FORM_data4)); 1971 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1972 E = CUMap.end(); I != E; ++I) { 1973 CompileUnit *TheCU = I->second; 1974 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace(); 1975 for (StringMap<std::vector<DIE*> >::const_iterator 1976 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1977 const char *Name = GI->getKeyData(); 1978 const std::vector<DIE *> &Entities = GI->second; 1979 for (std::vector<DIE *>::const_iterator DI = Entities.begin(), 1980 DE = Entities.end(); DI != DE; ++DI) 1981 AT.AddName(Name, (*DI)); 1982 } 1983 } 1984 1985 AT.FinalizeTable(Asm, "namespac"); 1986 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering() 1987 .getDwarfAccelNamespaceSection()); 1988 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin"); 1989 Asm->OutStreamer.EmitLabel(SectionBegin); 1990 1991 // Emit the full data. 1992 AT.Emit(Asm, SectionBegin, this); 1993 } 1994 1995 // Emit type dies into a hashed accelerator table. 1996 void DwarfDebug::emitAccelTypes() { 1997 std::vector<DwarfAccelTable::Atom> Atoms; 1998 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1999 dwarf::DW_FORM_data4)); 2000 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag, 2001 dwarf::DW_FORM_data2)); 2002 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags, 2003 dwarf::DW_FORM_data1)); 2004 DwarfAccelTable AT(Atoms); 2005 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 2006 E = CUMap.end(); I != E; ++I) { 2007 CompileUnit *TheCU = I->second; 2008 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names 2009 = TheCU->getAccelTypes(); 2010 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator 2011 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 2012 const char *Name = GI->getKeyData(); 2013 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second; 2014 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI 2015 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI) 2016 AT.AddName(Name, (*DI).first, (*DI).second); 2017 } 2018 } 2019 2020 AT.FinalizeTable(Asm, "types"); 2021 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering() 2022 .getDwarfAccelTypesSection()); 2023 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin"); 2024 Asm->OutStreamer.EmitLabel(SectionBegin); 2025 2026 // Emit the full data. 2027 AT.Emit(Asm, SectionBegin, this); 2028 } 2029 2030 void DwarfDebug::emitDebugPubTypes() { 2031 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 2032 E = CUMap.end(); I != E; ++I) { 2033 CompileUnit *TheCU = I->second; 2034 // Start the dwarf pubtypes section. 2035 Asm->OutStreamer.SwitchSection( 2036 Asm->getObjFileLowering().getDwarfPubTypesSection()); 2037 Asm->OutStreamer.AddComment("Length of Public Types Info"); 2038 Asm->EmitLabelDifference( 2039 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()), 2040 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4); 2041 2042 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin", 2043 TheCU->getUniqueID())); 2044 2045 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version"); 2046 Asm->EmitInt16(dwarf::DWARF_VERSION); 2047 2048 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info"); 2049 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", 2050 TheCU->getUniqueID()), 2051 DwarfInfoSectionSym); 2052 2053 Asm->OutStreamer.AddComment("Compilation Unit Length"); 2054 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", 2055 TheCU->getUniqueID()), 2056 Asm->GetTempSymbol("info_begin", 2057 TheCU->getUniqueID()), 2058 4); 2059 2060 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes(); 2061 for (StringMap<DIE*>::const_iterator 2062 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 2063 const char *Name = GI->getKeyData(); 2064 DIE *Entity = GI->second; 2065 2066 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset"); 2067 Asm->EmitInt32(Entity->getOffset()); 2068 2069 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name"); 2070 // Emit the name with a terminating null byte. 2071 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0); 2072 } 2073 2074 Asm->OutStreamer.AddComment("End Mark"); 2075 Asm->EmitInt32(0); 2076 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end", 2077 TheCU->getUniqueID())); 2078 } 2079 } 2080 2081 // Emit visible names into a debug str section. 2082 void DwarfDebug::emitDebugStr() { 2083 // Check to see if it is worth the effort. 2084 if (StringPool.empty()) return; 2085 2086 // Start the dwarf str section. 2087 Asm->OutStreamer.SwitchSection( 2088 Asm->getObjFileLowering().getDwarfStrSection()); 2089 2090 // Get all of the string pool entries and put them in an array by their ID so 2091 // we can sort them. 2092 SmallVector<std::pair<unsigned, 2093 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries; 2094 2095 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator 2096 I = StringPool.begin(), E = StringPool.end(); I != E; ++I) 2097 Entries.push_back(std::make_pair(I->second.second, &*I)); 2098 2099 array_pod_sort(Entries.begin(), Entries.end()); 2100 2101 for (unsigned i = 0, e = Entries.size(); i != e; ++i) { 2102 // Emit a label for reference from debug information entries. 2103 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first); 2104 2105 // Emit the string itself with a terminating null byte. 2106 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(), 2107 Entries[i].second->getKeyLength()+1), 2108 0/*addrspace*/); 2109 } 2110 } 2111 2112 // Emit visible names into a debug loc section. 2113 void DwarfDebug::emitDebugLoc() { 2114 if (DotDebugLocEntries.empty()) 2115 return; 2116 2117 for (SmallVector<DotDebugLocEntry, 4>::iterator 2118 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end(); 2119 I != E; ++I) { 2120 DotDebugLocEntry &Entry = *I; 2121 if (I + 1 != DotDebugLocEntries.end()) 2122 Entry.Merge(I+1); 2123 } 2124 2125 // Start the dwarf loc section. 2126 Asm->OutStreamer.SwitchSection( 2127 Asm->getObjFileLowering().getDwarfLocSection()); 2128 unsigned char Size = Asm->getDataLayout().getPointerSize(); 2129 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0)); 2130 unsigned index = 1; 2131 for (SmallVector<DotDebugLocEntry, 4>::iterator 2132 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end(); 2133 I != E; ++I, ++index) { 2134 DotDebugLocEntry &Entry = *I; 2135 if (Entry.isMerged()) continue; 2136 if (Entry.isEmpty()) { 2137 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 2138 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 2139 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index)); 2140 } else { 2141 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0); 2142 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0); 2143 DIVariable DV(Entry.Variable); 2144 Asm->OutStreamer.AddComment("Loc expr size"); 2145 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol(); 2146 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol(); 2147 Asm->EmitLabelDifference(end, begin, 2); 2148 Asm->OutStreamer.EmitLabel(begin); 2149 if (Entry.isInt()) { 2150 DIBasicType BTy(DV.getType()); 2151 if (BTy.Verify() && 2152 (BTy.getEncoding() == dwarf::DW_ATE_signed 2153 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) { 2154 Asm->OutStreamer.AddComment("DW_OP_consts"); 2155 Asm->EmitInt8(dwarf::DW_OP_consts); 2156 Asm->EmitSLEB128(Entry.getInt()); 2157 } else { 2158 Asm->OutStreamer.AddComment("DW_OP_constu"); 2159 Asm->EmitInt8(dwarf::DW_OP_constu); 2160 Asm->EmitULEB128(Entry.getInt()); 2161 } 2162 } else if (Entry.isLocation()) { 2163 if (!DV.hasComplexAddress()) 2164 // Regular entry. 2165 Asm->EmitDwarfRegOp(Entry.Loc); 2166 else { 2167 // Complex address entry. 2168 unsigned N = DV.getNumAddrElements(); 2169 unsigned i = 0; 2170 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) { 2171 if (Entry.Loc.getOffset()) { 2172 i = 2; 2173 Asm->EmitDwarfRegOp(Entry.Loc); 2174 Asm->OutStreamer.AddComment("DW_OP_deref"); 2175 Asm->EmitInt8(dwarf::DW_OP_deref); 2176 Asm->OutStreamer.AddComment("DW_OP_plus_uconst"); 2177 Asm->EmitInt8(dwarf::DW_OP_plus_uconst); 2178 Asm->EmitSLEB128(DV.getAddrElement(1)); 2179 } else { 2180 // If first address element is OpPlus then emit 2181 // DW_OP_breg + Offset instead of DW_OP_reg + Offset. 2182 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1)); 2183 Asm->EmitDwarfRegOp(Loc); 2184 i = 2; 2185 } 2186 } else { 2187 Asm->EmitDwarfRegOp(Entry.Loc); 2188 } 2189 2190 // Emit remaining complex address elements. 2191 for (; i < N; ++i) { 2192 uint64_t Element = DV.getAddrElement(i); 2193 if (Element == DIBuilder::OpPlus) { 2194 Asm->EmitInt8(dwarf::DW_OP_plus_uconst); 2195 Asm->EmitULEB128(DV.getAddrElement(++i)); 2196 } else if (Element == DIBuilder::OpDeref) { 2197 if (!Entry.Loc.isReg()) 2198 Asm->EmitInt8(dwarf::DW_OP_deref); 2199 } else 2200 llvm_unreachable("unknown Opcode found in complex address"); 2201 } 2202 } 2203 } 2204 // else ... ignore constant fp. There is not any good way to 2205 // to represent them here in dwarf. 2206 Asm->OutStreamer.EmitLabel(end); 2207 } 2208 } 2209 } 2210 2211 // Emit visible names into a debug aranges section. 2212 void DwarfDebug::emitDebugARanges() { 2213 // Start the dwarf aranges section. 2214 Asm->OutStreamer.SwitchSection( 2215 Asm->getObjFileLowering().getDwarfARangesSection()); 2216 } 2217 2218 // Emit visible names into a debug ranges section. 2219 void DwarfDebug::emitDebugRanges() { 2220 // Start the dwarf ranges section. 2221 Asm->OutStreamer.SwitchSection( 2222 Asm->getObjFileLowering().getDwarfRangesSection()); 2223 unsigned char Size = Asm->getDataLayout().getPointerSize(); 2224 for (SmallVector<const MCSymbol *, 8>::iterator 2225 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end(); 2226 I != E; ++I) { 2227 if (*I) 2228 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0); 2229 else 2230 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 2231 } 2232 } 2233 2234 // Emit visible names into a debug macinfo section. 2235 void DwarfDebug::emitDebugMacInfo() { 2236 if (const MCSection *LineInfo = 2237 Asm->getObjFileLowering().getDwarfMacroInfoSection()) { 2238 // Start the dwarf macinfo section. 2239 Asm->OutStreamer.SwitchSection(LineInfo); 2240 } 2241 } 2242 2243 // Emit inline info using following format. 2244 // Section Header: 2245 // 1. length of section 2246 // 2. Dwarf version number 2247 // 3. address size. 2248 // 2249 // Entries (one "entry" for each function that was inlined): 2250 // 2251 // 1. offset into __debug_str section for MIPS linkage name, if exists; 2252 // otherwise offset into __debug_str for regular function name. 2253 // 2. offset into __debug_str section for regular function name. 2254 // 3. an unsigned LEB128 number indicating the number of distinct inlining 2255 // instances for the function. 2256 // 2257 // The rest of the entry consists of a {die_offset, low_pc} pair for each 2258 // inlined instance; the die_offset points to the inlined_subroutine die in the 2259 // __debug_info section, and the low_pc is the starting address for the 2260 // inlining instance. 2261 void DwarfDebug::emitDebugInlineInfo() { 2262 if (!Asm->MAI->doesDwarfUseInlineInfoSection()) 2263 return; 2264 2265 if (!FirstCU) 2266 return; 2267 2268 Asm->OutStreamer.SwitchSection( 2269 Asm->getObjFileLowering().getDwarfDebugInlineSection()); 2270 2271 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry"); 2272 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1), 2273 Asm->GetTempSymbol("debug_inlined_begin", 1), 4); 2274 2275 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1)); 2276 2277 Asm->OutStreamer.AddComment("Dwarf Version"); 2278 Asm->EmitInt16(dwarf::DWARF_VERSION); 2279 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 2280 Asm->EmitInt8(Asm->getDataLayout().getPointerSize()); 2281 2282 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(), 2283 E = InlinedSPNodes.end(); I != E; ++I) { 2284 2285 const MDNode *Node = *I; 2286 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II 2287 = InlineInfo.find(Node); 2288 SmallVector<InlineInfoLabels, 4> &Labels = II->second; 2289 DISubprogram SP(Node); 2290 StringRef LName = SP.getLinkageName(); 2291 StringRef Name = SP.getName(); 2292 2293 Asm->OutStreamer.AddComment("MIPS linkage name"); 2294 if (LName.empty()) 2295 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym); 2296 else 2297 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)), 2298 DwarfStrSectionSym); 2299 2300 Asm->OutStreamer.AddComment("Function name"); 2301 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym); 2302 Asm->EmitULEB128(Labels.size(), "Inline count"); 2303 2304 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(), 2305 LE = Labels.end(); LI != LE; ++LI) { 2306 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset"); 2307 Asm->EmitInt32(LI->second->getOffset()); 2308 2309 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc"); 2310 Asm->OutStreamer.EmitSymbolValue(LI->first, 2311 Asm->getDataLayout().getPointerSize(),0); 2312 } 2313 } 2314 2315 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1)); 2316 } 2317 2318 // DWARF5 Experimental Fission emitters. 2319 2320 // This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list, 2321 // DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id, 2322 // DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present, 2323 // DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa. 2324 CompileUnit *DwarfDebug::constructFissionCU(const MDNode *N) { 2325 DICompileUnit DIUnit(N); 2326 StringRef FN = DIUnit.getFilename(); 2327 CompilationDir = DIUnit.getDirectory(); 2328 2329 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); 2330 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++, 2331 DIUnit.getLanguage(), Die, Asm, this); 2332 // FIXME: This should be the .dwo file. 2333 NewCU->addString(Die, dwarf::DW_AT_GNU_dwo_name, FN); 2334 2335 // FIXME: We also need DW_AT_addr_base and DW_AT_dwo_id. 2336 2337 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point 2338 // into an entity. 2339 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0); 2340 // DW_AT_stmt_list is a offset of line number information for this 2341 // compile unit in debug_line section. 2342 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 2343 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 2344 Asm->GetTempSymbol("section_line")); 2345 else 2346 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0); 2347 2348 if (!CompilationDir.empty()) 2349 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 2350 2351 return NewCU; 2352 } 2353 2354 void DwarfDebug::emitFissionSkeletonCU(const MCSection *Section) { 2355 Asm->OutStreamer.SwitchSection(Section); 2356 DIE *Die = FissionCU->getCUDie(); 2357 2358 // Emit the compile units header. 2359 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("skel_info_begin", 2360 FissionCU->getUniqueID())); 2361 2362 // Emit size of content not including length itself 2363 unsigned ContentSize = Die->getSize() + 2364 sizeof(int16_t) + // DWARF version number 2365 sizeof(int32_t) + // Offset Into Abbrev. Section 2366 sizeof(int8_t); // Pointer Size (in bytes) 2367 2368 Asm->OutStreamer.AddComment("Length of Compilation Unit Info"); 2369 Asm->EmitInt32(ContentSize); 2370 Asm->OutStreamer.AddComment("DWARF version number"); 2371 Asm->EmitInt16(dwarf::DWARF_VERSION); 2372 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section"); 2373 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), 2374 DwarfAbbrevSectionSym); 2375 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 2376 Asm->EmitInt8(Asm->getDataLayout().getPointerSize()); 2377 2378 emitDIE(Die); 2379 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("skel_info_end", 2380 FissionCU->getUniqueID())); 2381 2382 2383 } 2384 2385 // Emit the .debug_info.dwo section for fission. This contains the compile 2386 // units that would normally be in debug_info. 2387 void DwarfDebug::emitDebugInfoDWO() { 2388 assert(useDwarfFission() && "Got fission?"); 2389 emitCompileUnits(Asm->getObjFileLowering().getDwarfInfoDWOSection()); 2390 } 2391