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