Index: lld/COFF/Driver.cpp =================================================================== --- lld/COFF/Driver.cpp +++ lld/COFF/Driver.cpp @@ -966,6 +966,10 @@ for (auto *Arg : Args.filtered(OPT_merge)) parseMerge(Arg->getValue()); + // Add default section merging rules after user rules. User rules take + // precedence, but we will emit a warning if there is a conflict. + parseMerge(".xdata=.rdata"); + // Handle /section for (auto *Arg : Args.filtered(OPT_section)) parseSection(Arg->getValue()); Index: lld/test/COFF/icf-xdata.s =================================================================== --- lld/test/COFF/icf-xdata.s +++ lld/test/COFF/icf-xdata.s @@ -1,13 +1,23 @@ # RUN: llvm-mc %s -triple x86_64-windows-msvc -filetype=obj -o %t.obj +# RUN: lld-link %t.obj -dll -noentry -out:%t.dll -merge:.xdata=.xdata 2>&1 \ +# RUN: | FileCheck %s --check-prefix=WARN +# RUN: llvm-readobj -sections %t.dll | FileCheck %s --check-prefix=XDATA # RUN: lld-link %t.obj -dll -noentry -out:%t.dll -# RUN: llvm-readobj -sections %t.dll | FileCheck %s +# RUN: llvm-readobj -sections %t.dll | FileCheck %s --check-prefix=RDATA # There shouldn't be much xdata, because all three .pdata entries (12 bytes # each) should use the same .xdata unwind info. -# CHECK: Name: .pdata -# CHECK-NEXT: VirtualSize: 0x24 -# CHECK: Name: .xdata -# CHECK-NEXT: VirtualSize: 0x8 +# XDATA: Name: .pdata +# XDATA-NEXT: VirtualSize: 0x24 +# XDATA: Name: .xdata +# XDATA-NEXT: VirtualSize: 0x8 +# +# WARN: warning: .xdata=.rdata: already merged into .xdata +# +# RDATA: Name: .pdata +# RDATA-NEXT: VirtualSize: 0x24 +# RDATA: Name: .rdata +# RDATA-NEXT: VirtualSize: 0x8 .text callee: