Index: clang/test/CodeGen/split-debug-output.c =================================================================== --- clang/test/CodeGen/split-debug-output.c +++ 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") Index: clang/test/CodeGen/thinlto-split-dwarf.c =================================================================== --- clang/test/CodeGen/thinlto-split-dwarf.c +++ 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() {} Index: llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -856,10 +856,13 @@ // 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 @@ 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 = Index: llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp =================================================================== --- llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ 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)); Index: llvm/test/DebugInfo/X86/debug_addr.ll =================================================================== --- llvm/test/DebugInfo/X86/debug_addr.ll +++ 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: Index: llvm/test/DebugInfo/X86/string-offsets-table.ll =================================================================== --- llvm/test/DebugInfo/X86/string-offsets-table.ll +++ 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: