From 6ef01588f4d75ef43da4ed2a37ba7a8b8daab259 Mon Sep 17 00:00:00 2001 From: Sourabh Singh Tomar Date: Fri, 29 Nov 2019 11:26:00 +0530 Subject: [PATCH] [DWARF5] Start emitting DW_AT_dwo_name when -gdwarf-5 is specified. --- clang/test/CodeGen/split-debug-output.c | 10 +++++-- clang/test/CodeGen/thinlto-split-dwarf.c | 30 +++++++++++++++---- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 16 ++++++---- llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | 4 ++- llvm/test/DebugInfo/X86/debug_addr.ll | 2 +- .../DebugInfo/X86/string-offsets-table.ll | 2 +- 6 files changed, 48 insertions(+), 16 deletions(-) diff --git a/clang/test/CodeGen/split-debug-output.c b/clang/test/CodeGen/split-debug-output.c index 1507edd24849..19569f8d574b 100644 --- a/clang/test/CodeGen/split-debug-output.c +++ b/clang/test/CodeGen/split-debug-output.c @@ -1,7 +1,11 @@ // REQUIRES: x86-registered-target -// RUN: %clang_cc1 -triple x86_64-unknown-linux -debug-info-kind=limited -split-dwarf-file foo.dwo -split-dwarf-output %t -emit-obj -o - %s | llvm-dwarfdump -debug-info - | FileCheck %s -// RUN: llvm-dwarfdump -debug-info %t | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux -debug-info-kind=limited -dwarf-version=4 -split-dwarf-file foo.dwo -split-dwarf-output %t -emit-obj -o - %s | llvm-dwarfdump -debug-info - | FileCheck --check-prefix=DWARFv4 %s +// RUN: llvm-dwarfdump -debug-info %t | FileCheck --check-prefix=DWARFv4 %s + +// RUN: %clang_cc1 -triple x86_64-unknown-linux -debug-info-kind=limited -dwarf-version=5 -split-dwarf-file foo.dwo -split-dwarf-output %t -emit-obj -o - %s | llvm-dwarfdump -debug-info - | FileCheck --check-prefix=DWARFv5 %s +// RUN: llvm-dwarfdump -debug-info %t | FileCheck --check-prefix=DWARFv5 %s int f() { return 0; } -// CHECK: DW_AT_GNU_dwo_name ("foo.dwo") +// DWARFv4: DW_AT_GNU_dwo_name ("foo.dwo") +// DWARFv5: DW_AT_dwo_name ("foo.dwo") diff --git a/clang/test/CodeGen/thinlto-split-dwarf.c b/clang/test/CodeGen/thinlto-split-dwarf.c index 60649b0881bb..419bd1320bb2 100644 --- a/clang/test/CodeGen/thinlto-split-dwarf.c +++ b/clang/test/CodeGen/thinlto-split-dwarf.c @@ -13,11 +13,31 @@ // RUN: -o %t.native.o -split-dwarf-file %t.file.dwo \ // RUN: -split-dwarf-output %t.output.dwo -x ir %t.o -// RUN: llvm-dwarfdump %t.native.o | FileCheck --check-prefix=O %s -// RUN: llvm-dwarfdump %t.output.dwo | FileCheck --check-prefix=DWO %s +// RUN: llvm-dwarfdump %t.native.o | FileCheck --check-prefix=DWARFv4-O %s +// RUN: llvm-dwarfdump %t.output.dwo | FileCheck --check-prefix=DWARFv4-DWO %s -// O: DW_AT_GNU_dwo_name ("{{.*}}.file.dwo") -// O-NOT: DW_TAG_subprogram -// DWO: DW_TAG_subprogram +// DWARFv4-O: DW_AT_GNU_dwo_name ("{{.*}}.file.dwo") +// DWARFv4-O-NOT: DW_TAG_subprogram +// DWARFv4-DWO: DW_TAG_subprogram + +// RUN: %clang_cc1 -debug-info-kind=limited -dwarf-version=5 -triple x86_64-unknown-linux-gnu \ +// RUN: -flto=thin -emit-llvm-bc \ +// RUN: -o %t.o %s + +// RUN: llvm-lto2 run -thinlto-distributed-indexes %t.o \ +// RUN: -o %t2.index \ +// RUN: -r=%t.o,main,px + +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu \ +// RUN: -emit-obj -fthinlto-index=%t.o.thinlto.bc \ +// RUN: -o %t.native.o -dwarf-version=5 -split-dwarf-file %t.file.dwo \ +// RUN: -split-dwarf-output %t.output.dwo -x ir %t.o + +// RUN: llvm-dwarfdump %t.native.o | FileCheck --check-prefix=DWARFv5-O %s +// RUN: llvm-dwarfdump %t.output.dwo | FileCheck --check-prefix=DWARFv5-DWO %s + +// DWARFv5-O: DW_AT_dwo_name ("{{.*}}.file.dwo") +// DWARFv5-O-NOT: DW_TAG_subprogram +// DWARFv5-DWO: DW_TAG_subprogram int main() {} diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 89a0e350f8fe..f6039cc5bc00 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -856,10 +856,13 @@ void DwarfDebug::finishUnitAttributes(const DICompileUnit *DIUnit, // This CU is either a clang module DWO or a skeleton CU. NewCU.addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, DIUnit->getDWOId()); - if (!DIUnit->getSplitDebugFilename().empty()) + if (!DIUnit->getSplitDebugFilename().empty()) { // This is a prefabricated skeleton CU. - NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name, - DIUnit->getSplitDebugFilename()); + dwarf::Attribute attrDWOName = getDwarfVersion() >= 5 + ? dwarf::DW_AT_dwo_name + : dwarf::DW_AT_GNU_dwo_name; + NewCU.addString(Die, attrDWOName, DIUnit->getSplitDebugFilename()); + } } } // Create new DwarfCompileUnit for the given metadata node with tag @@ -1101,10 +1104,13 @@ void DwarfDebug::finalizeModuleInfo() { bool HasSplitUnit = SkCU && !TheCU.getUnitDie().children().empty(); if (HasSplitUnit) { + dwarf::Attribute attrDWOName = getDwarfVersion() >= 5 + ? dwarf::DW_AT_dwo_name + : dwarf::DW_AT_GNU_dwo_name; finishUnitAttributes(TheCU.getCUNode(), TheCU); - TheCU.addString(TheCU.getUnitDie(), dwarf::DW_AT_GNU_dwo_name, + TheCU.addString(TheCU.getUnitDie(), attrDWOName, Asm->TM.Options.MCOptions.SplitDwarfFile); - SkCU->addString(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_name, + SkCU->addString(SkCU->getUnitDie(), attrDWOName, Asm->TM.Options.MCOptions.SplitDwarfFile); // Emit a unique identifier for this CU. uint64_t ID = diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp index 4ccda628093c..02f915bc6f7b 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -554,7 +554,9 @@ bool DWARFUnit::parseDWO() { DWARFDie UnitDie = getUnitDIE(); if (!UnitDie) return false; - auto DWOFileName = dwarf::toString(UnitDie.find(DW_AT_GNU_dwo_name)); + auto DWOFileName = getVersion() >= 5 + ? dwarf::toString(UnitDie.find(DW_AT_dwo_name)) + : dwarf::toString(UnitDie.find(DW_AT_GNU_dwo_name)); if (!DWOFileName) return false; auto CompilationDir = dwarf::toString(UnitDie.find(DW_AT_comp_dir)); diff --git a/llvm/test/DebugInfo/X86/debug_addr.ll b/llvm/test/DebugInfo/X86/debug_addr.ll index 55e24b2764c1..424313ac2e64 100644 --- a/llvm/test/DebugInfo/X86/debug_addr.ll +++ b/llvm/test/DebugInfo/X86/debug_addr.ll @@ -30,7 +30,7 @@ ; DWARF5-NOT: Compile Unit ; DWARF5: DW_TAG_skeleton_unit ; DWARF5-NOT: DW_TAG_{{.*}} -; DWARF5: DW_AT_GNU_dwo_name{{.*}}test.dwo +; DWARF5: DW_AT_dwo_name{{.*}}test.dwo ; DWARF5: DW_AT_addr_base{{.*}}0x00000008 ; DWARF5: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000000) address = 0x0000000000000000 ".text") ; DWARF5: .debug_addr contents: diff --git a/llvm/test/DebugInfo/X86/string-offsets-table.ll b/llvm/test/DebugInfo/X86/string-offsets-table.ll index be960d1e017c..cff779445ed2 100644 --- a/llvm/test/DebugInfo/X86/string-offsets-table.ll +++ b/llvm/test/DebugInfo/X86/string-offsets-table.ll @@ -60,7 +60,7 @@ ; SPLIT-NOT: {{DW_TAG|contents:}} ; SPLIT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008) ; SPLIT: DW_AT_comp_dir [DW_FORM_strx1] (indexed (00000000) string = "/home/test") -; SPLIT: DW_AT_GNU_dwo_name [DW_FORM_strx1] (indexed (00000001) string = "foo.dwo") +; SPLIT: DW_AT_dwo_name [DW_FORM_strx1] (indexed (00000001) string = "foo.dwo") ; Check for the split CU in .debug_info.dwo. ; SPLIT: .debug_info.dwo contents: