Index: ELF/SyntheticSections.cpp =================================================================== --- ELF/SyntheticSections.cpp +++ ELF/SyntheticSections.cpp @@ -2919,6 +2919,7 @@ void MergeSyntheticSection::addSection(MergeInputSection *MS) { MS->Parent = this; Sections.push_back(MS); + Alignment = std::max(Alignment, MS->Alignment); } MergeTailSection::MergeTailSection(StringRef Name, uint32_t Type, @@ -3063,7 +3064,7 @@ // Using Entsize in here also allows us to propagate it to the synthetic // section. return Sec->Name == OutsecName && Sec->Flags == MS->Flags && - Sec->Entsize == MS->Entsize && Sec->Alignment == MS->Alignment; + Sec->Entsize == MS->Entsize; }); if (I == MergeSections.end()) { MergeSyntheticSection *Syn = Index: test/ELF/merge-align2.s =================================================================== --- /dev/null +++ test/ELF/merge-align2.s @@ -0,0 +1,25 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: ld.lld -r %t.o -o %t1.o +# RUN: llvm-readelf -S %t1.o | FileCheck --check-prefix=SEC %s +# RUN: llvm-readelf -x .cst8 %t1.o | FileCheck %s + +## Check that if we have two SHF_MERGE sections with the same name, flags and +## entsize, but different alignments, we create one single synthetic section, +## with the larger input alignment as the output alignment. + +# SEC: Name Type {{.*}} Size ES Flg Lk Inf Al +# SEC: .cst8 PROGBITS {{.*}} 000018 08 AM 0 0 8 + +# CHECK: 0x00000000 02000000 00000000 01000000 00000000 +# CHECK-NEXT: 0x00000010 03000000 00000000 + +.section .cst8,"aM",@progbits,8,unique,0 +.align 4 +.quad 1 +.quad 2 + +.section .cst8,"aM",@progbits,8,unique,1 +.align 8 +.quad 1 +.quad 3