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