DwarfDebug.cpp revision c63f8b0fdb11d1723f070de38a3d68de95981990
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 assert(0 && "Unexpected Start and End labels for a inlined scope!"); 393 return 0; 394 } 395 assert(StartLabel->isDefined() && 396 "Invalid starting label for an inlined scope!"); 397 assert(EndLabel->isDefined() && 398 "Invalid end label for an inlined scope!"); 399 400 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine); 401 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, 402 dwarf::DW_FORM_ref4, OriginDIE); 403 404 if (Ranges.size() > 1) { 405 // .debug_range section has not been laid out yet. Emit offset in 406 // .debug_range as a uint, size 4, for now. emitDIE will handle 407 // DW_AT_ranges appropriately. 408 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4, 409 DebugRangeSymbols.size() 410 * Asm->getTargetData().getPointerSize()); 411 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(), 412 RE = Ranges.end(); RI != RE; ++RI) { 413 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first)); 414 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second)); 415 } 416 DebugRangeSymbols.push_back(NULL); 417 DebugRangeSymbols.push_back(NULL); 418 } else { 419 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 420 StartLabel); 421 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 422 EndLabel); 423 } 424 425 InlinedSubprogramDIEs.insert(OriginDIE); 426 427 // Track the start label for this inlined function. 428 //.debug_inlined section specification does not clearly state how 429 // to emit inlined scope that is split into multiple instruction ranges. 430 // For now, use first instruction range and emit low_pc/high_pc pair and 431 // corresponding .debug_inlined section entry for this pair. 432 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator 433 I = InlineInfo.find(InlinedSP); 434 435 if (I == InlineInfo.end()) { 436 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE)); 437 InlinedSPNodes.push_back(InlinedSP); 438 } else 439 I->second.push_back(std::make_pair(StartLabel, ScopeDIE)); 440 441 DILocation DL(Scope->getInlinedAt()); 442 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID()); 443 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber()); 444 445 return ScopeDIE; 446} 447 448 449 450/// constructScopeDIE - Construct a DIE for this scope. 451DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) { 452 if (!Scope || !Scope->getScopeNode()) 453 return NULL; 454 455 SmallVector<DIE *, 8> Children; 456 457 // Collect arguments for current function. 458 if (LScopes.isCurrentFunctionScope(Scope)) 459 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i) 460 if (DbgVariable *ArgDV = CurrentFnArguments[i]) 461 if (DIE *Arg = 462 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) 463 Children.push_back(Arg); 464 465 // Collect lexical scope children first. 466 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope); 467 for (unsigned i = 0, N = Variables.size(); i < N; ++i) 468 if (DIE *Variable = 469 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) 470 Children.push_back(Variable); 471 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren(); 472 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) 473 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j])) 474 Children.push_back(Nested); 475 DIScope DS(Scope->getScopeNode()); 476 DIE *ScopeDIE = NULL; 477 if (Scope->getInlinedAt()) 478 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope); 479 else if (DS.isSubprogram()) { 480 ProcessedSPNodes.insert(DS); 481 if (Scope->isAbstractScope()) { 482 ScopeDIE = TheCU->getDIE(DS); 483 // Note down abstract DIE. 484 if (ScopeDIE) 485 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE)); 486 } 487 else 488 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS); 489 } 490 else { 491 // There is no need to emit empty lexical block DIE. 492 if (Children.empty()) 493 return NULL; 494 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope); 495 } 496 497 if (!ScopeDIE) return NULL; 498 499 // Add children 500 for (SmallVector<DIE *, 8>::iterator I = Children.begin(), 501 E = Children.end(); I != E; ++I) 502 ScopeDIE->addChild(*I); 503 504 if (DS.isSubprogram()) 505 TheCU->addPubTypes(DISubprogram(DS)); 506 507 return ScopeDIE; 508} 509 510/// GetOrCreateSourceID - Look up the source id with the given directory and 511/// source file names. If none currently exists, create a new id and insert it 512/// in the SourceIds map. This can update DirectoryNames and SourceFileNames 513/// maps as well. 514unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName, 515 StringRef DirName) { 516 // If FE did not provide a file name, then assume stdin. 517 if (FileName.empty()) 518 return GetOrCreateSourceID("<stdin>", StringRef()); 519 520 // TODO: this might not belong here. See if we can factor this better. 521 if (DirName == CompilationDir) 522 DirName = ""; 523 524 unsigned SrcId = SourceIdMap.size()+1; 525 std::pair<std::string, std::string> SourceName = 526 std::make_pair(FileName, DirName); 527 std::pair<std::pair<std::string, std::string>, unsigned> Entry = 528 make_pair(SourceName, SrcId); 529 530 std::map<std::pair<std::string, std::string>, unsigned>::iterator I; 531 bool NewlyInserted; 532 tie(I, NewlyInserted) = SourceIdMap.insert(Entry); 533 if (!NewlyInserted) 534 return I->second; 535 536 // Print out a .file directive to specify files for .loc directives. 537 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.first.second, 538 Entry.first.first); 539 540 return SrcId; 541} 542 543/// constructCompileUnit - Create new CompileUnit for the given 544/// metadata node with tag DW_TAG_compile_unit. 545CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) { 546 DICompileUnit DIUnit(N); 547 StringRef FN = DIUnit.getFilename(); 548 CompilationDir = DIUnit.getDirectory(); 549 unsigned ID = GetOrCreateSourceID(FN, CompilationDir); 550 551 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); 552 CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this); 553 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer()); 554 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2, 555 DIUnit.getLanguage()); 556 NewCU->addString(Die, dwarf::DW_AT_name, FN); 557 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This 558 // simplifies debug range entries. 559 NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0); 560 // DW_AT_stmt_list is a offset of line number information for this 561 // compile unit in debug_line section. 562 if (Asm->MAI->doesDwarfRequireRelocationForSectionOffset()) 563 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 564 Asm->GetTempSymbol("section_line")); 565 else 566 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0); 567 568 if (!CompilationDir.empty()) 569 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 570 if (DIUnit.isOptimized()) 571 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1); 572 573 StringRef Flags = DIUnit.getFlags(); 574 if (!Flags.empty()) 575 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags); 576 577 if (unsigned RVer = DIUnit.getRunTimeVersion()) 578 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers, 579 dwarf::DW_FORM_data1, RVer); 580 581 if (!FirstCU) 582 FirstCU = NewCU; 583 CUMap.insert(std::make_pair(N, NewCU)); 584 return NewCU; 585} 586 587/// construct SubprogramDIE - Construct subprogram DIE. 588void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU, 589 const MDNode *N) { 590 CompileUnit *&CURef = SPMap[N]; 591 if (CURef) 592 return; 593 CURef = TheCU; 594 595 DISubprogram SP(N); 596 if (!SP.isDefinition()) 597 // This is a method declaration which will be handled while constructing 598 // class type. 599 return; 600 601 DISubprogram SPDecl = SP.getFunctionDeclaration(); 602 DIE *DeclDie = NULL; 603 if (SPDecl.isSubprogram()) { 604 DeclDie = TheCU->getOrCreateSubprogramDIE(SPDecl); 605 } 606 607 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP); 608 609 if (DeclDie) { 610 // Refer function declaration directly. 611 TheCU->addDIEEntry(SubprogramDie, dwarf::DW_AT_specification, 612 dwarf::DW_FORM_ref4, DeclDie); 613 } 614 615 // Add to map. 616 TheCU->insertDIE(N, SubprogramDie); 617 618 // Add to context owner. 619 TheCU->addToContextOwner(SubprogramDie, SP.getContext()); 620 621 return; 622} 623 624/// collectInfoFromNamedMDNodes - Collect debug info from named mdnodes such 625/// as llvm.dbg.enum and llvm.dbg.ty 626void DwarfDebug::collectInfoFromNamedMDNodes(Module *M) { 627 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp")) 628 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 629 const MDNode *N = NMD->getOperand(i); 630 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit())) 631 constructSubprogramDIE(CU, N); 632 } 633 634 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv")) 635 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 636 const MDNode *N = NMD->getOperand(i); 637 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit())) 638 CU->createGlobalVariableDIE(N); 639 } 640 641 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum")) 642 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 643 DIType Ty(NMD->getOperand(i)); 644 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit())) 645 CU->getOrCreateTypeDIE(Ty); 646 } 647 648 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty")) 649 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 650 DIType Ty(NMD->getOperand(i)); 651 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit())) 652 CU->getOrCreateTypeDIE(Ty); 653 } 654} 655 656/// collectLegacyDebugInfo - Collect debug info using DebugInfoFinder. 657/// FIXME - Remove this when dragon-egg and llvm-gcc switch to DIBuilder. 658bool DwarfDebug::collectLegacyDebugInfo(Module *M) { 659 DebugInfoFinder DbgFinder; 660 DbgFinder.processModule(*M); 661 662 bool HasDebugInfo = false; 663 // Scan all the compile-units to see if there are any marked as the main 664 // unit. If not, we do not generate debug info. 665 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(), 666 E = DbgFinder.compile_unit_end(); I != E; ++I) { 667 if (DICompileUnit(*I).isMain()) { 668 HasDebugInfo = true; 669 break; 670 } 671 } 672 if (!HasDebugInfo) return false; 673 674 // Create all the compile unit DIEs. 675 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(), 676 E = DbgFinder.compile_unit_end(); I != E; ++I) 677 constructCompileUnit(*I); 678 679 // Create DIEs for each global variable. 680 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(), 681 E = DbgFinder.global_variable_end(); I != E; ++I) { 682 const MDNode *N = *I; 683 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit())) 684 CU->createGlobalVariableDIE(N); 685 } 686 687 // Create DIEs for each subprogram. 688 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(), 689 E = DbgFinder.subprogram_end(); I != E; ++I) { 690 const MDNode *N = *I; 691 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit())) 692 constructSubprogramDIE(CU, N); 693 } 694 695 return HasDebugInfo; 696} 697 698/// beginModule - Emit all Dwarf sections that should come prior to the 699/// content. Create global DIEs and emit initial debug info sections. 700/// This is invoked by the target AsmPrinter. 701void DwarfDebug::beginModule(Module *M) { 702 if (DisableDebugInfoPrinting) 703 return; 704 705 // If module has named metadata anchors then use them, otherwise scan the 706 // module using debug info finder to collect debug info. 707 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu"); 708 if (CU_Nodes) { 709 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { 710 DICompileUnit CUNode(CU_Nodes->getOperand(i)); 711 CompileUnit *CU = constructCompileUnit(CUNode); 712 DIArray GVs = CUNode.getGlobalVariables(); 713 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) 714 CU->createGlobalVariableDIE(GVs.getElement(i)); 715 DIArray SPs = CUNode.getSubprograms(); 716 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) 717 constructSubprogramDIE(CU, SPs.getElement(i)); 718 DIArray EnumTypes = CUNode.getEnumTypes(); 719 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i) 720 CU->getOrCreateTypeDIE(EnumTypes.getElement(i)); 721 DIArray RetainedTypes = CUNode.getRetainedTypes(); 722 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) 723 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i)); 724 } 725 } else if (!collectLegacyDebugInfo(M)) 726 return; 727 728 collectInfoFromNamedMDNodes(M); 729 730 // Tell MMI that we have debug info. 731 MMI->setDebugInfoAvailability(true); 732 733 // Emit initial sections. 734 EmitSectionLabels(); 735 736 // Prime section data. 737 SectionMap.insert(Asm->getObjFileLowering().getTextSection()); 738} 739 740/// endModule - Emit all Dwarf sections that should come after the content. 741/// 742void DwarfDebug::endModule() { 743 if (!FirstCU) return; 744 const Module *M = MMI->getModule(); 745 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap; 746 747 // Collect info for variables that were optimized out. 748 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) { 749 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { 750 DICompileUnit TheCU(CU_Nodes->getOperand(i)); 751 DIArray Subprograms = TheCU.getSubprograms(); 752 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) { 753 DISubprogram SP(Subprograms.getElement(i)); 754 if (ProcessedSPNodes.count(SP) != 0) continue; 755 if (!SP.Verify()) continue; 756 if (!SP.isDefinition()) continue; 757 DIArray Variables = SP.getVariables(); 758 if (Variables.getNumElements() == 0) continue; 759 760 LexicalScope *Scope = 761 new LexicalScope(NULL, DIDescriptor(SP), NULL, false); 762 DeadFnScopeMap[SP] = Scope; 763 764 // Construct subprogram DIE and add variables DIEs. 765 CompileUnit *SPCU = CUMap.lookup(TheCU); 766 assert(SPCU && "Unable to find Compile Unit!"); 767 constructSubprogramDIE(SPCU, SP); 768 DIE *ScopeDIE = SPCU->getDIE(SP); 769 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) { 770 DIVariable DV(Variables.getElement(vi)); 771 if (!DV.Verify()) continue; 772 DbgVariable *NewVar = new DbgVariable(DV, NULL); 773 if (DIE *VariableDIE = 774 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope())) 775 ScopeDIE->addChild(VariableDIE); 776 } 777 } 778 } 779 } 780 781 // Attach DW_AT_inline attribute with inlined subprogram DIEs. 782 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(), 783 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) { 784 DIE *ISP = *AI; 785 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined); 786 } 787 788 // Emit DW_AT_containing_type attribute to connect types with their 789 // vtable holding type. 790 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(), 791 CUE = CUMap.end(); CUI != CUE; ++CUI) { 792 CompileUnit *TheCU = CUI->second; 793 TheCU->constructContainingTypeDIEs(); 794 } 795 796 // Standard sections final addresses. 797 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection()); 798 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end")); 799 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection()); 800 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end")); 801 802 // End text sections. 803 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) { 804 Asm->OutStreamer.SwitchSection(SectionMap[i]); 805 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i)); 806 } 807 808 // Compute DIE offsets and sizes. 809 computeSizeAndOffsets(); 810 811 // Emit all the DIEs into a debug info section 812 emitDebugInfo(); 813 814 // Corresponding abbreviations into a abbrev section. 815 emitAbbreviations(); 816 817 // Emit info into a dwarf accelerator table sections. 818 if (DwarfAccelTables) { 819 emitAccelNames(); 820 emitAccelObjC(); 821 emitAccelNamespaces(); 822 emitAccelTypes(); 823 } 824 825 // Emit info into a debug pubtypes section. 826 emitDebugPubTypes(); 827 828 // Emit info into a debug loc section. 829 emitDebugLoc(); 830 831 // Emit info into a debug aranges section. 832 EmitDebugARanges(); 833 834 // Emit info into a debug ranges section. 835 emitDebugRanges(); 836 837 // Emit info into a debug macinfo section. 838 emitDebugMacInfo(); 839 840 // Emit inline info. 841 emitDebugInlineInfo(); 842 843 // Emit info into a debug str section. 844 emitDebugStr(); 845 846 // clean up. 847 DeleteContainerSeconds(DeadFnScopeMap); 848 SPMap.clear(); 849 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 850 E = CUMap.end(); I != E; ++I) 851 delete I->second; 852 FirstCU = NULL; // Reset for the next Module, if any. 853} 854 855/// findAbstractVariable - Find abstract variable, if any, associated with Var. 856DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV, 857 DebugLoc ScopeLoc) { 858 LLVMContext &Ctx = DV->getContext(); 859 // More then one inlined variable corresponds to one abstract variable. 860 DIVariable Var = cleanseInlinedVariable(DV, Ctx); 861 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var); 862 if (AbsDbgVariable) 863 return AbsDbgVariable; 864 865 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx)); 866 if (!Scope) 867 return NULL; 868 869 AbsDbgVariable = new DbgVariable(Var, NULL); 870 addScopeVariable(Scope, AbsDbgVariable); 871 AbstractVariables[Var] = AbsDbgVariable; 872 return AbsDbgVariable; 873} 874 875/// addCurrentFnArgument - If Var is a current function argument then add 876/// it to CurrentFnArguments list. 877bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF, 878 DbgVariable *Var, LexicalScope *Scope) { 879 if (!LScopes.isCurrentFunctionScope(Scope)) 880 return false; 881 DIVariable DV = Var->getVariable(); 882 if (DV.getTag() != dwarf::DW_TAG_arg_variable) 883 return false; 884 unsigned ArgNo = DV.getArgNumber(); 885 if (ArgNo == 0) 886 return false; 887 888 size_t Size = CurrentFnArguments.size(); 889 if (Size == 0) 890 CurrentFnArguments.resize(MF->getFunction()->arg_size()); 891 // llvm::Function argument size is not good indicator of how many 892 // arguments does the function have at source level. 893 if (ArgNo > Size) 894 CurrentFnArguments.resize(ArgNo * 2); 895 CurrentFnArguments[ArgNo - 1] = Var; 896 return true; 897} 898 899/// collectVariableInfoFromMMITable - Collect variable information from 900/// side table maintained by MMI. 901void 902DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF, 903 SmallPtrSet<const MDNode *, 16> &Processed) { 904 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo(); 905 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(), 906 VE = VMap.end(); VI != VE; ++VI) { 907 const MDNode *Var = VI->first; 908 if (!Var) continue; 909 Processed.insert(Var); 910 DIVariable DV(Var); 911 const std::pair<unsigned, DebugLoc> &VP = VI->second; 912 913 LexicalScope *Scope = LScopes.findLexicalScope(VP.second); 914 915 // If variable scope is not found then skip this variable. 916 if (Scope == 0) 917 continue; 918 919 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second); 920 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable); 921 RegVar->setFrameIndex(VP.first); 922 if (!addCurrentFnArgument(MF, RegVar, Scope)) 923 addScopeVariable(Scope, RegVar); 924 if (AbsDbgVariable) 925 AbsDbgVariable->setFrameIndex(VP.first); 926 } 927} 928 929/// isDbgValueInDefinedReg - Return true if debug value, encoded by 930/// DBG_VALUE instruction, is in a defined reg. 931static bool isDbgValueInDefinedReg(const MachineInstr *MI) { 932 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!"); 933 return MI->getNumOperands() == 3 && 934 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() && 935 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0; 936} 937 938/// getDebugLocEntry - Get .debug_loc entry for the instruction range starting 939/// at MI. 940static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm, 941 const MCSymbol *FLabel, 942 const MCSymbol *SLabel, 943 const MachineInstr *MI) { 944 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata(); 945 946 if (MI->getNumOperands() != 3) { 947 MachineLocation MLoc = Asm->getDebugValueLocation(MI); 948 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var); 949 } 950 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) { 951 MachineLocation MLoc; 952 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm()); 953 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var); 954 } 955 if (MI->getOperand(0).isImm()) 956 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm()); 957 if (MI->getOperand(0).isFPImm()) 958 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm()); 959 if (MI->getOperand(0).isCImm()) 960 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm()); 961 962 assert(0 && "Unexpected 3 operand DBG_VALUE instruction!"); 963 return DotDebugLocEntry(); 964} 965 966/// collectVariableInfo - Find variables for each lexical scope. 967void 968DwarfDebug::collectVariableInfo(const MachineFunction *MF, 969 SmallPtrSet<const MDNode *, 16> &Processed) { 970 971 /// collection info from MMI table. 972 collectVariableInfoFromMMITable(MF, Processed); 973 974 for (SmallVectorImpl<const MDNode*>::const_iterator 975 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE; 976 ++UVI) { 977 const MDNode *Var = *UVI; 978 if (Processed.count(Var)) 979 continue; 980 981 // History contains relevant DBG_VALUE instructions for Var and instructions 982 // clobbering it. 983 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var]; 984 if (History.empty()) 985 continue; 986 const MachineInstr *MInsn = History.front(); 987 988 DIVariable DV(Var); 989 LexicalScope *Scope = NULL; 990 if (DV.getTag() == dwarf::DW_TAG_arg_variable && 991 DISubprogram(DV.getContext()).describes(MF->getFunction())) 992 Scope = LScopes.getCurrentFunctionScope(); 993 else { 994 if (DV.getVersion() <= LLVMDebugVersion9) 995 Scope = LScopes.findLexicalScope(MInsn->getDebugLoc()); 996 else { 997 if (MDNode *IA = DV.getInlinedAt()) 998 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA)); 999 else 1000 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1))); 1001 } 1002 } 1003 // If variable scope is not found then skip this variable. 1004 if (!Scope) 1005 continue; 1006 1007 Processed.insert(DV); 1008 assert(MInsn->isDebugValue() && "History must begin with debug value"); 1009 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc()); 1010 DbgVariable *RegVar = new DbgVariable(DV, AbsVar); 1011 if (!addCurrentFnArgument(MF, RegVar, Scope)) 1012 addScopeVariable(Scope, RegVar); 1013 if (AbsVar) 1014 AbsVar->setMInsn(MInsn); 1015 1016 // Simple ranges that are fully coalesced. 1017 if (History.size() <= 1 || (History.size() == 2 && 1018 MInsn->isIdenticalTo(History.back()))) { 1019 RegVar->setMInsn(MInsn); 1020 continue; 1021 } 1022 1023 // handle multiple DBG_VALUE instructions describing one variable. 1024 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size()); 1025 1026 for (SmallVectorImpl<const MachineInstr*>::const_iterator 1027 HI = History.begin(), HE = History.end(); HI != HE; ++HI) { 1028 const MachineInstr *Begin = *HI; 1029 assert(Begin->isDebugValue() && "Invalid History entry"); 1030 1031 // Check if DBG_VALUE is truncating a range. 1032 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() 1033 && !Begin->getOperand(0).getReg()) 1034 continue; 1035 1036 // Compute the range for a register location. 1037 const MCSymbol *FLabel = getLabelBeforeInsn(Begin); 1038 const MCSymbol *SLabel = 0; 1039 1040 if (HI + 1 == HE) 1041 // If Begin is the last instruction in History then its value is valid 1042 // until the end of the function. 1043 SLabel = FunctionEndSym; 1044 else { 1045 const MachineInstr *End = HI[1]; 1046 DEBUG(dbgs() << "DotDebugLoc Pair:\n" 1047 << "\t" << *Begin << "\t" << *End << "\n"); 1048 if (End->isDebugValue()) 1049 SLabel = getLabelBeforeInsn(End); 1050 else { 1051 // End is a normal instruction clobbering the range. 1052 SLabel = getLabelAfterInsn(End); 1053 assert(SLabel && "Forgot label after clobber instruction"); 1054 ++HI; 1055 } 1056 } 1057 1058 // The value is valid until the next DBG_VALUE or clobber. 1059 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel, Begin)); 1060 } 1061 DotDebugLocEntries.push_back(DotDebugLocEntry()); 1062 } 1063 1064 // Collect info for variables that were optimized out. 1065 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1066 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables(); 1067 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { 1068 DIVariable DV(Variables.getElement(i)); 1069 if (!DV || !DV.Verify() || !Processed.insert(DV)) 1070 continue; 1071 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) 1072 addScopeVariable(Scope, new DbgVariable(DV, NULL)); 1073 } 1074} 1075 1076/// getLabelBeforeInsn - Return Label preceding the instruction. 1077const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) { 1078 MCSymbol *Label = LabelsBeforeInsn.lookup(MI); 1079 assert(Label && "Didn't insert label before instruction"); 1080 return Label; 1081} 1082 1083/// getLabelAfterInsn - Return Label immediately following the instruction. 1084const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) { 1085 return LabelsAfterInsn.lookup(MI); 1086} 1087 1088/// beginInstruction - Process beginning of an instruction. 1089void DwarfDebug::beginInstruction(const MachineInstr *MI) { 1090 // Check if source location changes, but ignore DBG_VALUE locations. 1091 if (!MI->isDebugValue()) { 1092 DebugLoc DL = MI->getDebugLoc(); 1093 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) { 1094 unsigned Flags = DWARF2_FLAG_IS_STMT; 1095 PrevInstLoc = DL; 1096 if (DL == PrologEndLoc) { 1097 Flags |= DWARF2_FLAG_PROLOGUE_END; 1098 PrologEndLoc = DebugLoc(); 1099 } 1100 if (!DL.isUnknown()) { 1101 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext()); 1102 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags); 1103 } else 1104 recordSourceLine(0, 0, 0, 0); 1105 } 1106 } 1107 1108 // Insert labels where requested. 1109 DenseMap<const MachineInstr*, MCSymbol*>::iterator I = 1110 LabelsBeforeInsn.find(MI); 1111 1112 // No label needed. 1113 if (I == LabelsBeforeInsn.end()) 1114 return; 1115 1116 // Label already assigned. 1117 if (I->second) 1118 return; 1119 1120 if (!PrevLabel) { 1121 PrevLabel = MMI->getContext().CreateTempSymbol(); 1122 Asm->OutStreamer.EmitLabel(PrevLabel); 1123 } 1124 I->second = PrevLabel; 1125} 1126 1127/// endInstruction - Process end of an instruction. 1128void DwarfDebug::endInstruction(const MachineInstr *MI) { 1129 // Don't create a new label after DBG_VALUE instructions. 1130 // They don't generate code. 1131 if (!MI->isDebugValue()) 1132 PrevLabel = 0; 1133 1134 DenseMap<const MachineInstr*, MCSymbol*>::iterator I = 1135 LabelsAfterInsn.find(MI); 1136 1137 // No label needed. 1138 if (I == LabelsAfterInsn.end()) 1139 return; 1140 1141 // Label already assigned. 1142 if (I->second) 1143 return; 1144 1145 // We need a label after this instruction. 1146 if (!PrevLabel) { 1147 PrevLabel = MMI->getContext().CreateTempSymbol(); 1148 Asm->OutStreamer.EmitLabel(PrevLabel); 1149 } 1150 I->second = PrevLabel; 1151} 1152 1153/// identifyScopeMarkers() - 1154/// Each LexicalScope has first instruction and last instruction to mark 1155/// beginning and end of a scope respectively. Create an inverse map that list 1156/// scopes starts (and ends) with an instruction. One instruction may start (or 1157/// end) multiple scopes. Ignore scopes that are not reachable. 1158void DwarfDebug::identifyScopeMarkers() { 1159 SmallVector<LexicalScope *, 4> WorkList; 1160 WorkList.push_back(LScopes.getCurrentFunctionScope()); 1161 while (!WorkList.empty()) { 1162 LexicalScope *S = WorkList.pop_back_val(); 1163 1164 const SmallVector<LexicalScope *, 4> &Children = S->getChildren(); 1165 if (!Children.empty()) 1166 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(), 1167 SE = Children.end(); SI != SE; ++SI) 1168 WorkList.push_back(*SI); 1169 1170 if (S->isAbstractScope()) 1171 continue; 1172 1173 const SmallVector<InsnRange, 4> &Ranges = S->getRanges(); 1174 if (Ranges.empty()) 1175 continue; 1176 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(), 1177 RE = Ranges.end(); RI != RE; ++RI) { 1178 assert(RI->first && "InsnRange does not have first instruction!"); 1179 assert(RI->second && "InsnRange does not have second instruction!"); 1180 requestLabelBeforeInsn(RI->first); 1181 requestLabelAfterInsn(RI->second); 1182 } 1183 } 1184} 1185 1186/// getScopeNode - Get MDNode for DebugLoc's scope. 1187static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) { 1188 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx)) 1189 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx); 1190 return DL.getScope(Ctx); 1191} 1192 1193/// getFnDebugLoc - Walk up the scope chain of given debug loc and find 1194/// line number info for the function. 1195static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) { 1196 const MDNode *Scope = getScopeNode(DL, Ctx); 1197 DISubprogram SP = getDISubprogram(Scope); 1198 if (SP.Verify()) 1199 return DebugLoc::get(SP.getLineNumber(), 0, SP); 1200 return DebugLoc(); 1201} 1202 1203/// beginFunction - Gather pre-function debug information. Assumes being 1204/// emitted immediately after the function entry point. 1205void DwarfDebug::beginFunction(const MachineFunction *MF) { 1206 if (!MMI->hasDebugInfo()) return; 1207 LScopes.initialize(*MF); 1208 if (LScopes.empty()) return; 1209 identifyScopeMarkers(); 1210 1211 FunctionBeginSym = Asm->GetTempSymbol("func_begin", 1212 Asm->getFunctionNumber()); 1213 // Assumes in correct section after the entry point. 1214 Asm->OutStreamer.EmitLabel(FunctionBeginSym); 1215 1216 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned"); 1217 1218 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 1219 /// LiveUserVar - Map physreg numbers to the MDNode they contain. 1220 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs()); 1221 1222 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 1223 I != E; ++I) { 1224 bool AtBlockEntry = true; 1225 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 1226 II != IE; ++II) { 1227 const MachineInstr *MI = II; 1228 1229 if (MI->isDebugValue()) { 1230 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!"); 1231 1232 // Keep track of user variables. 1233 const MDNode *Var = 1234 MI->getOperand(MI->getNumOperands() - 1).getMetadata(); 1235 1236 // Variable is in a register, we need to check for clobbers. 1237 if (isDbgValueInDefinedReg(MI)) 1238 LiveUserVar[MI->getOperand(0).getReg()] = Var; 1239 1240 // Check the history of this variable. 1241 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var]; 1242 if (History.empty()) { 1243 UserVariables.push_back(Var); 1244 // The first mention of a function argument gets the FunctionBeginSym 1245 // label, so arguments are visible when breaking at function entry. 1246 DIVariable DV(Var); 1247 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable && 1248 DISubprogram(getDISubprogram(DV.getContext())) 1249 .describes(MF->getFunction())) 1250 LabelsBeforeInsn[MI] = FunctionBeginSym; 1251 } else { 1252 // We have seen this variable before. Try to coalesce DBG_VALUEs. 1253 const MachineInstr *Prev = History.back(); 1254 if (Prev->isDebugValue()) { 1255 // Coalesce identical entries at the end of History. 1256 if (History.size() >= 2 && 1257 Prev->isIdenticalTo(History[History.size() - 2])) { 1258 DEBUG(dbgs() << "Coalesce identical DBG_VALUE entries:\n" 1259 << "\t" << *Prev 1260 << "\t" << *History[History.size() - 2] << "\n"); 1261 History.pop_back(); 1262 } 1263 1264 // Terminate old register assignments that don't reach MI; 1265 MachineFunction::const_iterator PrevMBB = Prev->getParent(); 1266 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) && 1267 isDbgValueInDefinedReg(Prev)) { 1268 // Previous register assignment needs to terminate at the end of 1269 // its basic block. 1270 MachineBasicBlock::const_iterator LastMI = 1271 PrevMBB->getLastNonDebugInstr(); 1272 if (LastMI == PrevMBB->end()) { 1273 // Drop DBG_VALUE for empty range. 1274 DEBUG(dbgs() << "Drop DBG_VALUE for empty range:\n" 1275 << "\t" << *Prev << "\n"); 1276 History.pop_back(); 1277 } 1278 else { 1279 // Terminate after LastMI. 1280 History.push_back(LastMI); 1281 } 1282 } 1283 } 1284 } 1285 History.push_back(MI); 1286 } else { 1287 // Not a DBG_VALUE instruction. 1288 if (!MI->isLabel()) 1289 AtBlockEntry = false; 1290 1291 // First known non DBG_VALUE location marks beginning of function 1292 // body. 1293 if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()) 1294 PrologEndLoc = MI->getDebugLoc(); 1295 1296 // Check if the instruction clobbers any registers with debug vars. 1297 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(), 1298 MOE = MI->operands_end(); MOI != MOE; ++MOI) { 1299 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg()) 1300 continue; 1301 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg()); 1302 unsigned Reg = *AI; ++AI) { 1303 const MDNode *Var = LiveUserVar[Reg]; 1304 if (!Var) 1305 continue; 1306 // Reg is now clobbered. 1307 LiveUserVar[Reg] = 0; 1308 1309 // Was MD last defined by a DBG_VALUE referring to Reg? 1310 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var); 1311 if (HistI == DbgValues.end()) 1312 continue; 1313 SmallVectorImpl<const MachineInstr*> &History = HistI->second; 1314 if (History.empty()) 1315 continue; 1316 const MachineInstr *Prev = History.back(); 1317 // Sanity-check: Register assignments are terminated at the end of 1318 // their block. 1319 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent()) 1320 continue; 1321 // Is the variable still in Reg? 1322 if (!isDbgValueInDefinedReg(Prev) || 1323 Prev->getOperand(0).getReg() != Reg) 1324 continue; 1325 // Var is clobbered. Make sure the next instruction gets a label. 1326 History.push_back(MI); 1327 } 1328 } 1329 } 1330 } 1331 } 1332 1333 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end(); 1334 I != E; ++I) { 1335 SmallVectorImpl<const MachineInstr*> &History = I->second; 1336 if (History.empty()) 1337 continue; 1338 1339 // Make sure the final register assignments are terminated. 1340 const MachineInstr *Prev = History.back(); 1341 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) { 1342 const MachineBasicBlock *PrevMBB = Prev->getParent(); 1343 MachineBasicBlock::const_iterator LastMI = 1344 PrevMBB->getLastNonDebugInstr(); 1345 if (LastMI == PrevMBB->end()) 1346 // Drop DBG_VALUE for empty range. 1347 History.pop_back(); 1348 else { 1349 // Terminate after LastMI. 1350 History.push_back(LastMI); 1351 } 1352 } 1353 // Request labels for the full history. 1354 for (unsigned i = 0, e = History.size(); i != e; ++i) { 1355 const MachineInstr *MI = History[i]; 1356 if (MI->isDebugValue()) 1357 requestLabelBeforeInsn(MI); 1358 else 1359 requestLabelAfterInsn(MI); 1360 } 1361 } 1362 1363 PrevInstLoc = DebugLoc(); 1364 PrevLabel = FunctionBeginSym; 1365 1366 // Record beginning of function. 1367 if (!PrologEndLoc.isUnknown()) { 1368 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc, 1369 MF->getFunction()->getContext()); 1370 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(), 1371 FnStartDL.getScope(MF->getFunction()->getContext()), 1372 DWARF2_FLAG_IS_STMT); 1373 } 1374} 1375 1376void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) { 1377// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS); 1378 ScopeVariables[LS].push_back(Var); 1379// Vars.push_back(Var); 1380} 1381 1382/// endFunction - Gather and emit post-function debug information. 1383/// 1384void DwarfDebug::endFunction(const MachineFunction *MF) { 1385 if (!MMI->hasDebugInfo() || LScopes.empty()) return; 1386 1387 // Define end label for subprogram. 1388 FunctionEndSym = Asm->GetTempSymbol("func_end", 1389 Asm->getFunctionNumber()); 1390 // Assumes in correct section after the entry point. 1391 Asm->OutStreamer.EmitLabel(FunctionEndSym); 1392 1393 SmallPtrSet<const MDNode *, 16> ProcessedVars; 1394 collectVariableInfo(MF, ProcessedVars); 1395 1396 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1397 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode()); 1398 assert(TheCU && "Unable to find compile unit!"); 1399 1400 // Construct abstract scopes. 1401 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList(); 1402 for (unsigned i = 0, e = AList.size(); i != e; ++i) { 1403 LexicalScope *AScope = AList[i]; 1404 DISubprogram SP(AScope->getScopeNode()); 1405 if (SP.Verify()) { 1406 // Collect info for variables that were optimized out. 1407 DIArray Variables = SP.getVariables(); 1408 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { 1409 DIVariable DV(Variables.getElement(i)); 1410 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV)) 1411 continue; 1412 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext())) 1413 addScopeVariable(Scope, new DbgVariable(DV, NULL)); 1414 } 1415 } 1416 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0) 1417 constructScopeDIE(TheCU, AScope); 1418 } 1419 1420 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope); 1421 1422 if (!DisableFramePointerElim(*MF)) 1423 TheCU->addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr, 1424 dwarf::DW_FORM_flag, 1); 1425 1426 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(), 1427 MMI->getFrameMoves())); 1428 1429 // Clear debug info 1430 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator 1431 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I) 1432 DeleteContainerPointers(I->second); 1433 ScopeVariables.clear(); 1434 DeleteContainerPointers(CurrentFnArguments); 1435 UserVariables.clear(); 1436 DbgValues.clear(); 1437 AbstractVariables.clear(); 1438 LabelsBeforeInsn.clear(); 1439 LabelsAfterInsn.clear(); 1440 PrevLabel = NULL; 1441} 1442 1443/// recordSourceLine - Register a source line with debug info. Returns the 1444/// unique label that was emitted and which provides correspondence to 1445/// the source line list. 1446void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S, 1447 unsigned Flags) { 1448 StringRef Fn; 1449 StringRef Dir; 1450 unsigned Src = 1; 1451 if (S) { 1452 DIDescriptor Scope(S); 1453 1454 if (Scope.isCompileUnit()) { 1455 DICompileUnit CU(S); 1456 Fn = CU.getFilename(); 1457 Dir = CU.getDirectory(); 1458 } else if (Scope.isFile()) { 1459 DIFile F(S); 1460 Fn = F.getFilename(); 1461 Dir = F.getDirectory(); 1462 } else if (Scope.isSubprogram()) { 1463 DISubprogram SP(S); 1464 Fn = SP.getFilename(); 1465 Dir = SP.getDirectory(); 1466 } else if (Scope.isLexicalBlockFile()) { 1467 DILexicalBlockFile DBF(S); 1468 Fn = DBF.getFilename(); 1469 Dir = DBF.getDirectory(); 1470 } else if (Scope.isLexicalBlock()) { 1471 DILexicalBlock DB(S); 1472 Fn = DB.getFilename(); 1473 Dir = DB.getDirectory(); 1474 } else 1475 assert(0 && "Unexpected scope info"); 1476 1477 Src = GetOrCreateSourceID(Fn, Dir); 1478 } 1479 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn); 1480} 1481 1482//===----------------------------------------------------------------------===// 1483// Emit Methods 1484//===----------------------------------------------------------------------===// 1485 1486/// computeSizeAndOffset - Compute the size and offset of a DIE. 1487/// 1488unsigned 1489DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) { 1490 // Get the children. 1491 const std::vector<DIE *> &Children = Die->getChildren(); 1492 1493 // If not last sibling and has children then add sibling offset attribute. 1494 if (!Last && !Children.empty()) 1495 Die->addSiblingOffset(DIEValueAllocator); 1496 1497 // Record the abbreviation. 1498 assignAbbrevNumber(Die->getAbbrev()); 1499 1500 // Get the abbreviation for this DIE. 1501 unsigned AbbrevNumber = Die->getAbbrevNumber(); 1502 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 1503 1504 // Set DIE offset 1505 Die->setOffset(Offset); 1506 1507 // Start the size with the size of abbreviation code. 1508 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber); 1509 1510 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 1511 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 1512 1513 // Size the DIE attribute values. 1514 for (unsigned i = 0, N = Values.size(); i < N; ++i) 1515 // Size attribute value. 1516 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm()); 1517 1518 // Size the DIE children if any. 1519 if (!Children.empty()) { 1520 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes && 1521 "Children flag not set"); 1522 1523 for (unsigned j = 0, M = Children.size(); j < M; ++j) 1524 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M); 1525 1526 // End of children marker. 1527 Offset += sizeof(int8_t); 1528 } 1529 1530 Die->setSize(Offset - Die->getOffset()); 1531 return Offset; 1532} 1533 1534/// computeSizeAndOffsets - Compute the size and offset of all the DIEs. 1535/// 1536void DwarfDebug::computeSizeAndOffsets() { 1537 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1538 E = CUMap.end(); I != E; ++I) { 1539 // Compute size of compile unit header. 1540 unsigned Offset = 1541 sizeof(int32_t) + // Length of Compilation Unit Info 1542 sizeof(int16_t) + // DWARF version number 1543 sizeof(int32_t) + // Offset Into Abbrev. Section 1544 sizeof(int8_t); // Pointer Size (in bytes) 1545 computeSizeAndOffset(I->second->getCUDie(), Offset, true); 1546 } 1547} 1548 1549/// EmitSectionLabels - Emit initial Dwarf sections with a label at 1550/// the start of each one. 1551void DwarfDebug::EmitSectionLabels() { 1552 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 1553 1554 // Dwarf sections base addresses. 1555 DwarfInfoSectionSym = 1556 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info"); 1557 DwarfAbbrevSectionSym = 1558 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev"); 1559 EmitSectionSym(Asm, TLOF.getDwarfARangesSection()); 1560 1561 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection()) 1562 EmitSectionSym(Asm, MacroInfo); 1563 1564 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line"); 1565 EmitSectionSym(Asm, TLOF.getDwarfLocSection()); 1566 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); 1567 DwarfStrSectionSym = 1568 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str"); 1569 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(), 1570 "debug_range"); 1571 1572 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(), 1573 "section_debug_loc"); 1574 1575 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin"); 1576 EmitSectionSym(Asm, TLOF.getDataSection()); 1577} 1578 1579/// emitDIE - Recursively emits a debug information entry. 1580/// 1581void DwarfDebug::emitDIE(DIE *Die) { 1582 // Get the abbreviation for this DIE. 1583 unsigned AbbrevNumber = Die->getAbbrevNumber(); 1584 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 1585 1586 // Emit the code (index) for the abbreviation. 1587 if (Asm->isVerbose()) 1588 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" + 1589 Twine::utohexstr(Die->getOffset()) + ":0x" + 1590 Twine::utohexstr(Die->getSize()) + " " + 1591 dwarf::TagString(Abbrev->getTag())); 1592 Asm->EmitULEB128(AbbrevNumber); 1593 1594 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 1595 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 1596 1597 // Emit the DIE attribute values. 1598 for (unsigned i = 0, N = Values.size(); i < N; ++i) { 1599 unsigned Attr = AbbrevData[i].getAttribute(); 1600 unsigned Form = AbbrevData[i].getForm(); 1601 assert(Form && "Too many attributes for DIE (check abbreviation)"); 1602 1603 if (Asm->isVerbose()) 1604 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr)); 1605 1606 switch (Attr) { 1607 case dwarf::DW_AT_sibling: 1608 Asm->EmitInt32(Die->getSiblingOffset()); 1609 break; 1610 case dwarf::DW_AT_abstract_origin: { 1611 DIEEntry *E = cast<DIEEntry>(Values[i]); 1612 DIE *Origin = E->getEntry(); 1613 unsigned Addr = Origin->getOffset(); 1614 Asm->EmitInt32(Addr); 1615 break; 1616 } 1617 case dwarf::DW_AT_ranges: { 1618 // DW_AT_range Value encodes offset in debug_range section. 1619 DIEInteger *V = cast<DIEInteger>(Values[i]); 1620 1621 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) { 1622 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym, 1623 V->getValue(), 1624 4); 1625 } else { 1626 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym, 1627 V->getValue(), 1628 DwarfDebugRangeSectionSym, 1629 4); 1630 } 1631 break; 1632 } 1633 case dwarf::DW_AT_location: { 1634 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) 1635 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4); 1636 else 1637 Values[i]->EmitValue(Asm, Form); 1638 break; 1639 } 1640 case dwarf::DW_AT_accessibility: { 1641 if (Asm->isVerbose()) { 1642 DIEInteger *V = cast<DIEInteger>(Values[i]); 1643 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue())); 1644 } 1645 Values[i]->EmitValue(Asm, Form); 1646 break; 1647 } 1648 default: 1649 // Emit an attribute using the defined form. 1650 Values[i]->EmitValue(Asm, Form); 1651 break; 1652 } 1653 } 1654 1655 // Emit the DIE children if any. 1656 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) { 1657 const std::vector<DIE *> &Children = Die->getChildren(); 1658 1659 for (unsigned j = 0, M = Children.size(); j < M; ++j) 1660 emitDIE(Children[j]); 1661 1662 if (Asm->isVerbose()) 1663 Asm->OutStreamer.AddComment("End Of Children Mark"); 1664 Asm->EmitInt8(0); 1665 } 1666} 1667 1668/// emitDebugInfo - Emit the debug info section. 1669/// 1670void DwarfDebug::emitDebugInfo() { 1671 // Start debug info section. 1672 Asm->OutStreamer.SwitchSection( 1673 Asm->getObjFileLowering().getDwarfInfoSection()); 1674 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1675 E = CUMap.end(); I != E; ++I) { 1676 CompileUnit *TheCU = I->second; 1677 DIE *Die = TheCU->getCUDie(); 1678 1679 // Emit the compile units header. 1680 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin", 1681 TheCU->getID())); 1682 1683 // Emit size of content not including length itself 1684 unsigned ContentSize = Die->getSize() + 1685 sizeof(int16_t) + // DWARF version number 1686 sizeof(int32_t) + // Offset Into Abbrev. Section 1687 sizeof(int8_t); // Pointer Size (in bytes) 1688 1689 Asm->OutStreamer.AddComment("Length of Compilation Unit Info"); 1690 Asm->EmitInt32(ContentSize); 1691 Asm->OutStreamer.AddComment("DWARF version number"); 1692 Asm->EmitInt16(dwarf::DWARF_VERSION); 1693 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section"); 1694 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), 1695 DwarfAbbrevSectionSym); 1696 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 1697 Asm->EmitInt8(Asm->getTargetData().getPointerSize()); 1698 1699 emitDIE(Die); 1700 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID())); 1701 } 1702} 1703 1704/// emitAbbreviations - Emit the abbreviation section. 1705/// 1706void DwarfDebug::emitAbbreviations() const { 1707 // Check to see if it is worth the effort. 1708 if (!Abbreviations.empty()) { 1709 // Start the debug abbrev section. 1710 Asm->OutStreamer.SwitchSection( 1711 Asm->getObjFileLowering().getDwarfAbbrevSection()); 1712 1713 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin")); 1714 1715 // For each abbrevation. 1716 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) { 1717 // Get abbreviation data 1718 const DIEAbbrev *Abbrev = Abbreviations[i]; 1719 1720 // Emit the abbrevations code (base 1 index.) 1721 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code"); 1722 1723 // Emit the abbreviations data. 1724 Abbrev->Emit(Asm); 1725 } 1726 1727 // Mark end of abbreviations. 1728 Asm->EmitULEB128(0, "EOM(3)"); 1729 1730 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end")); 1731 } 1732} 1733 1734/// emitEndOfLineMatrix - Emit the last address of the section and the end of 1735/// the line matrix. 1736/// 1737void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { 1738 // Define last address of section. 1739 Asm->OutStreamer.AddComment("Extended Op"); 1740 Asm->EmitInt8(0); 1741 1742 Asm->OutStreamer.AddComment("Op size"); 1743 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1); 1744 Asm->OutStreamer.AddComment("DW_LNE_set_address"); 1745 Asm->EmitInt8(dwarf::DW_LNE_set_address); 1746 1747 Asm->OutStreamer.AddComment("Section end label"); 1748 1749 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd), 1750 Asm->getTargetData().getPointerSize(), 1751 0/*AddrSpace*/); 1752 1753 // Mark end of matrix. 1754 Asm->OutStreamer.AddComment("DW_LNE_end_sequence"); 1755 Asm->EmitInt8(0); 1756 Asm->EmitInt8(1); 1757 Asm->EmitInt8(1); 1758} 1759 1760/// emitAccelNames - Emit visible names into a hashed accelerator table 1761/// section. 1762void DwarfDebug::emitAccelNames() { 1763 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1764 dwarf::DW_FORM_data4)); 1765 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1766 E = CUMap.end(); I != E; ++I) { 1767 CompileUnit *TheCU = I->second; 1768 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames(); 1769 for (StringMap<std::vector<DIE*> >::const_iterator 1770 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1771 const char *Name = GI->getKeyData(); 1772 std::vector<DIE *> Entities = GI->second; 1773 for (std::vector<DIE *>::const_iterator DI = Entities.begin(), 1774 DE = Entities.end(); DI != DE; ++DI) 1775 AT.AddName(Name, (*DI)); 1776 } 1777 } 1778 1779 AT.FinalizeTable(Asm, "Names"); 1780 Asm->OutStreamer.SwitchSection( 1781 Asm->getObjFileLowering().getDwarfAccelNamesSection()); 1782 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin"); 1783 Asm->OutStreamer.EmitLabel(SectionBegin); 1784 1785 // Emit the full data. 1786 AT.Emit(Asm, SectionBegin, this); 1787} 1788 1789/// emitAccelObjC - Emit objective C classes and categories into a hashed 1790/// accelerator table section. 1791void DwarfDebug::emitAccelObjC() { 1792 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1793 dwarf::DW_FORM_data4)); 1794 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1795 E = CUMap.end(); I != E; ++I) { 1796 CompileUnit *TheCU = I->second; 1797 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC(); 1798 for (StringMap<std::vector<DIE*> >::const_iterator 1799 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1800 const char *Name = GI->getKeyData(); 1801 std::vector<DIE *> Entities = GI->second; 1802 for (std::vector<DIE *>::const_iterator DI = Entities.begin(), 1803 DE = Entities.end(); DI != DE; ++DI) 1804 AT.AddName(Name, (*DI)); 1805 } 1806 } 1807 1808 AT.FinalizeTable(Asm, "ObjC"); 1809 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering() 1810 .getDwarfAccelObjCSection()); 1811 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin"); 1812 Asm->OutStreamer.EmitLabel(SectionBegin); 1813 1814 // Emit the full data. 1815 AT.Emit(Asm, SectionBegin, this); 1816} 1817 1818/// emitAccelNamespace - Emit namespace dies into a hashed accelerator 1819/// table. 1820void DwarfDebug::emitAccelNamespaces() { 1821 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1822 dwarf::DW_FORM_data4)); 1823 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1824 E = CUMap.end(); I != E; ++I) { 1825 CompileUnit *TheCU = I->second; 1826 const StringMap<DIE*> &Names = TheCU->getAccelNamespace(); 1827 for (StringMap<DIE*>::const_iterator 1828 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1829 const char *Name = GI->getKeyData(); 1830 DIE *Entity = GI->second; 1831 AT.AddName(Name, Entity); 1832 } 1833 } 1834 1835 AT.FinalizeTable(Asm, "namespac"); 1836 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering() 1837 .getDwarfAccelNamespaceSection()); 1838 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin"); 1839 Asm->OutStreamer.EmitLabel(SectionBegin); 1840 1841 // Emit the full data. 1842 AT.Emit(Asm, SectionBegin, this); 1843} 1844 1845/// emitAccelTypes() - Emit type dies into a hashed accelerator table. 1846void DwarfDebug::emitAccelTypes() { 1847 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset, 1848 dwarf::DW_FORM_data4)); 1849 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1850 E = CUMap.end(); I != E; ++I) { 1851 CompileUnit *TheCU = I->second; 1852 const StringMap<DIE*> &Names = TheCU->getAccelTypes(); 1853 for (StringMap<DIE*>::const_iterator 1854 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) { 1855 const char *Name = GI->getKeyData(); 1856 DIE *Entity = GI->second; 1857 AT.AddName(Name, Entity); 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->doesDwarfUsesInlineInfoSection()) 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->OutStreamer.EmitBytes(Name, 0); 2137 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator. 2138 } else 2139 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)), 2140 DwarfStrSectionSym); 2141 2142 Asm->OutStreamer.AddComment("Function name"); 2143 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym); 2144 Asm->EmitULEB128(Labels.size(), "Inline count"); 2145 2146 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(), 2147 LE = Labels.end(); LI != LE; ++LI) { 2148 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset"); 2149 Asm->EmitInt32(LI->second->getOffset()); 2150 2151 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc"); 2152 Asm->OutStreamer.EmitSymbolValue(LI->first, 2153 Asm->getTargetData().getPointerSize(),0); 2154 } 2155 } 2156 2157 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1)); 2158} 2159