Re-commit r329179 after fixing build&test issues
- MSVC was not OK with a static_assert referencing a non-static member
variable, even though it was just in a sizeof(expression). I move the
assert into the emit function, where it is probably more useful.
- Tests were failing in builds which did not have the X86 target
configured. Since this functionality is not target-specific, I have
removed the target specifiers from the .ll files.
llvm-svn: 329201
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 7353875..76a360d 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -107,13 +107,14 @@
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 @@
// 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 @@
}
// 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 @@
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 @@
// 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 {