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