diff --git a/clang/test/CodeGen/split-debug-output.c b/clang/test/CodeGen/split-debug-output.c --- 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 --- 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 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -861,12 +861,14 @@ if (DIUnit->getDWOId()) { // This CU is either a clang module DWO or a skeleton CU. + dwarf::Attribute attrDWOName = getDwarfVersion() >= 5 + ? dwarf::DW_AT_dwo_name + : dwarf::DW_AT_GNU_dwo_name; NewCU.addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, DIUnit->getDWOId()); if (!DIUnit->getSplitDebugFilename().empty()) // This is a prefabricated skeleton CU. - NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name, - DIUnit->getSplitDebugFilename()); + NewCU.addString(Die, attrDWOName, DIUnit->getSplitDebugFilename()); } } // Create new DwarfCompileUnit for the given metadata node with tag @@ -1103,15 +1105,18 @@ // Add CU specific attributes if we need to add any. // If we're splitting the dwarf out now that we've got the entire // CU then add the dwo id to it. + dwarf::Attribute attrDWOName = getDwarfVersion() >= 5 + ? dwarf::DW_AT_dwo_name + : dwarf::DW_AT_GNU_dwo_name; auto *SkCU = TheCU.getSkeleton(); bool HasSplitUnit = SkCU && !TheCU.getUnitDie().children().empty(); if (HasSplitUnit) { 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 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -554,7 +554,9 @@ 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 --- 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 --- 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: