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