diff --git a/llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp b/llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp index 7510326f2e1b3..280d3f1861ff0 100644 --- a/llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp @@ -1412,6 +1412,12 @@ unsigned DWARFLinker::DIECloner::cloneScalarAttribute( unsigned AttrSize, AttributesInfo &Info) { uint64_t Value; + // We don't emit any skeleton CUs with dsymutil. So avoid emitting + // a redundant DW_AT_GNU_dwo_id on the non-skeleton CU. + if (AttrSpec.Attr == dwarf::DW_AT_GNU_dwo_id || + AttrSpec.Attr == dwarf::DW_AT_dwo_id) + return 0; + // Check for the offset to the macro table. If offset is incorrect then we // need to remove the attribute. if (AttrSpec.Attr == dwarf::DW_AT_macro_info) { diff --git a/llvm/test/tools/dsymutil/X86/modules.m b/llvm/test/tools/dsymutil/X86/modules.m index 9467dcb35955c..5145e07dd65e5 100644 --- a/llvm/test/tools/dsymutil/X86/modules.m +++ b/llvm/test/tools/dsymutil/X86/modules.m @@ -31,6 +31,7 @@ #ifdef BAR_H // --------------------------------------------------------------------- // CHECK: DW_TAG_compile_unit +// CHECK-NOT: DW_AT_GNU_dwo_id // CHECK-NOT: DW_TAG // CHECK: DW_TAG_module // CHECK-NEXT: DW_AT_name{{.*}}"Bar" @@ -55,6 +56,7 @@ #ifdef FOO_H // --------------------------------------------------------------------- // CHECK: DW_TAG_compile_unit +// CHECK-NOT: DW_AT_GNU_dwo_id // CHECK-NOT: DW_TAG // CHECK: 0x0[[FOO:.*]]: DW_TAG_module // CHECK-NEXT: DW_AT_name{{.*}}"Foo" @@ -92,8 +94,9 @@ @interface Foo { #else // --------------------------------------------------------------------- -// CHECK: DW_TAG_compile_unit -// CHECK: DW_AT_low_pc +// CHECK: DW_TAG_compile_unit +// CHECK-NOT: DW_AT_GNU_dwo_id +// CHECK: DW_AT_low_pc // CHECK-NOT: DW_TAG_module // CHECK-NOT: DW_TAG_typedef // @@ -130,8 +133,9 @@ int main(int argc, char **argv) { #endif #endif -// CHECK: DW_TAG_compile_unit -// CHECK: DW_AT_name {{.*}}"odr_violation.c" +// CHECK: DW_TAG_compile_unit +// CHECK-NOT: DW_AT_GNU_dwo_id +// CHECK: DW_AT_name {{.*}}"odr_violation.c" // CHECK: DW_TAG_variable // CHECK: DW_AT_name {{.*}}"odr_violation" // CHECK: DW_AT_type [DW_FORM_ref4] ({{.*}}{0x{{0*}}[[BAR2:.*]]}