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