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