summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2014-03-18 00:11:48 +0000
committerDavid Blaikie <dblaikie@gmail.com>2014-03-18 00:11:48 +0000
commite05274d7d9550c951703be2c2a5432cb6561af78 (patch)
tree08fffc674cf6af51518b5217002b3c73d366f1c2 /llvm/lib/CodeGen
parent19a08bbb9a8e6e43fe250d9c29afde3ca4a3ef51 (diff)
downloadbcm5719-llvm-e05274d7d9550c951703be2c2a5432cb6561af78.tar.gz
bcm5719-llvm-e05274d7d9550c951703be2c2a5432cb6561af78.zip
DebugInfo: Do not rely on the compilation dir (index 0) for files in line tables shared between compilation units
When emitting assembly there's no support for emitting separate line tables for each compilation unit - so LLVM emits .loc directives producing a single line table. Line tables have an implicit directory (index 0) equal to the compilation directory (DW_AT_comp_dir) of the compilation unit that references them. If multiple compilation units (with possibly disparate compilation directories) reference the same line table, we must avoid relying on this ambiguous directory. Achieve this my simply not setting the compilation directory on the line table when we're in this situation (multiple units while emitting assembly). llvm-svn: 204094
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp16
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h3
2 files changed, 13 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 8c499f84936..77765e12f81 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -674,7 +674,8 @@ void DwarfDebug::addGnuPubAttributes(DwarfUnit *U, DIE *D) const {
// Create new DwarfCompileUnit for the given metadata node with tag
// DW_TAG_compile_unit.
-DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
+DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit,
+ bool Singular) {
StringRef FN = DIUnit.getFilename();
CompilationDir = DIUnit.getDirectory();
@@ -682,8 +683,9 @@ DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
DwarfCompileUnit *NewCU = new DwarfCompileUnit(
InfoHolder.getUnits().size(), Die, DIUnit, Asm, this, &InfoHolder);
InfoHolder.addUnit(NewCU);
- Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
- NewCU->getUniqueID(), CompilationDir);
+ if (!Asm->OutStreamer.hasRawTextSupport() || Singular)
+ Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
+ NewCU->getUniqueID(), CompilationDir);
NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
@@ -814,9 +816,13 @@ void DwarfDebug::beginModule() {
// Emit initial sections so we can reference labels later.
emitSectionLabels();
- for (MDNode *N : CU_Nodes->operands()) {
+ auto Operands = CU_Nodes->operands();
+
+ bool SingleCU = std::next(Operands.begin()) == Operands.end();
+
+ for (MDNode *N : Operands) {
DICompileUnit CUNode(N);
- DwarfCompileUnit *CU = constructDwarfCompileUnit(CUNode);
+ DwarfCompileUnit *CU = constructDwarfCompileUnit(CUNode, SingleCU);
DIArray ImportedEntities = CUNode.getImportedEntities();
for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
ScopesWithImportedEntities.push_back(std::make_pair(
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
index 7f4ed6e290a..71ff75d640a 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -630,7 +630,8 @@ class DwarfDebug : public AsmPrinterHandler {
/// \brief Create new DwarfCompileUnit for the given metadata node with tag
/// DW_TAG_compile_unit.
- DwarfCompileUnit *constructDwarfCompileUnit(DICompileUnit DIUnit);
+ DwarfCompileUnit *constructDwarfCompileUnit(DICompileUnit DIUnit,
+ bool Singular);
/// \brief Construct subprogram DIE.
void constructSubprogramDIE(DwarfCompileUnit *TheCU, const MDNode *N);
OpenPOWER on IntegriCloud