diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 89 |
1 files changed, 69 insertions, 20 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 7353875ad39..76a360d2ca2 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -107,13 +107,14 @@ static cl::opt<DefaultOnOff> UnknownLocations( clEnumVal(Enable, "In all cases"), clEnumVal(Disable, "Never")), cl::init(Default)); -static cl::opt<DefaultOnOff> -DwarfAccelTables("dwarf-accel-tables", cl::Hidden, - cl::desc("Output prototype dwarf accelerator tables."), - cl::values(clEnumVal(Default, "Default for platform"), - clEnumVal(Enable, "Enabled"), - clEnumVal(Disable, "Disabled")), - cl::init(Default)); +static cl::opt<AccelTableKind> AccelTables( + "accel-tables", cl::Hidden, cl::desc("Output dwarf accelerator tables."), + cl::values(clEnumValN(AccelTableKind::Default, "Default", + "Default for platform"), + clEnumValN(AccelTableKind::None, "Disable", "Disabled."), + clEnumValN(AccelTableKind::Apple, "Apple", "Apple"), + clEnumValN(AccelTableKind::Dwarf, "Dwarf", "DWARF")), + cl::init(AccelTableKind::Default)); static cl::opt<DefaultOnOff> DwarfInlinedStrings("dwarf-inlined-strings", cl::Hidden, @@ -303,11 +304,13 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) // Turn on accelerator tables by default, if tuning for LLDB and the target is // supported. - if (DwarfAccelTables == Default) - HasDwarfAccelTables = - tuneForLLDB() && A->TM.getTargetTriple().isOSBinFormatMachO(); - else - HasDwarfAccelTables = DwarfAccelTables == Enable; + if (AccelTables == AccelTableKind::Default) { + if (tuneForLLDB() && A->TM.getTargetTriple().isOSBinFormatMachO()) + AccelTableKind = AccelTableKind::Apple; + else + AccelTableKind = AccelTableKind::None; + } else + AccelTableKind = AccelTables; UseInlineStrings = DwarfInlinedStrings == Enable; HasAppleExtensionAttributes = tuneForLLDB(); @@ -839,11 +842,20 @@ void DwarfDebug::endModule() { } // Emit info into the dwarf accelerator table sections. - if (useDwarfAccelTables()) { + switch (getAccelTableKind()) { + case AccelTableKind::Apple: emitAccelNames(); emitAccelObjC(); emitAccelNamespaces(); emitAccelTypes(); + break; + case AccelTableKind::Dwarf: + emitAccelDebugNames(); + break; + case AccelTableKind::None: + break; + case AccelTableKind::Default: + llvm_unreachable("Default should have already been resolved."); } // Emit the pubnames and pubtypes sections if requested. @@ -1455,6 +1467,12 @@ void DwarfDebug::emitAccel(AccelTableT &Accel, MCSection *Section, emitAppleAccelTable(Asm, Accel, TableName, Section->getBeginSymbol()); } +void DwarfDebug::emitAccelDebugNames() { + Asm->OutStreamer->SwitchSection( + Asm->getObjFileLowering().getDwarfDebugNamesSection()); + emitDWARF5AccelTable(Asm, AccelDebugNames, *this, getUnits()); +} + // Emit visible names into a hashed accelerator table section. void DwarfDebug::emitAccelNames() { emitAccel(AccelNames, Asm->getObjFileLowering().getDwarfAccelNamesSection(), @@ -2250,27 +2268,58 @@ void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU, // to reference is in the string table. We do this since the names we // add may not only be identical to the names in the DIE. void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) { - if (!useDwarfAccelTables()) + switch (getAccelTableKind()) { + case AccelTableKind::Apple: + AccelNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die); + break; + case AccelTableKind::Dwarf: + AccelDebugNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), + Die); + break; + case AccelTableKind::None: return; - AccelNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die); + case AccelTableKind::Default: + llvm_unreachable("Default should have already been resolved."); + } } void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) { - if (!useDwarfAccelTables()) + if (getAccelTableKind() != AccelTableKind::Apple) return; AccelObjC.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die); } void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) { - if (!useDwarfAccelTables()) + switch (getAccelTableKind()) { + case AccelTableKind::Apple: + AccelNamespace.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), + &Die); + break; + case AccelTableKind::Dwarf: + AccelDebugNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), + Die); + break; + case AccelTableKind::None: return; - AccelNamespace.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die); + case AccelTableKind::Default: + llvm_unreachable("Default should have already been resolved."); + } } void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) { - if (!useDwarfAccelTables()) + switch (getAccelTableKind()) { + case AccelTableKind::Apple: + AccelTypes.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die); + break; + case AccelTableKind::Dwarf: + AccelDebugNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), + Die); + break; + case AccelTableKind::None: return; - AccelTypes.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die); + case AccelTableKind::Default: + llvm_unreachable("Default should have already been resolved."); + } } uint16_t DwarfDebug::getDwarfVersion() const { |