Index: llvm/trunk/lib/MC/MCELFStreamer.cpp =================================================================== --- llvm/trunk/lib/MC/MCELFStreamer.cpp +++ llvm/trunk/lib/MC/MCELFStreamer.cpp @@ -131,6 +131,16 @@ llvm_unreachable("invalid assembler flag!"); } +// If bundle aligment is used and there are any instructions in the section, it +// needs to be aligned to at least the bundle size. +static void setSectionAlignmentForBundling( + const MCAssembler &Assembler, MCSectionData *Section) { + if (Assembler.isBundlingEnabled() && Section && + Section->hasInstructions() && + Section->getAlignment() < Assembler.getBundleAlignSize()) + Section->setAlignment(Assembler.getBundleAlignSize()); +} + void MCELFStreamer::ChangeSection(const MCSection *Section, const MCExpr *Subsection) { MCSectionData *CurSection = getCurrentSectionData(); @@ -138,6 +148,8 @@ report_fatal_error("Unterminated .bundle_lock when changing a section"); MCAssembler &Asm = getAssembler(); + // Ensure the previous section gets aligned if necessary. + setSectionAlignmentForBundling(Asm, CurSection); auto *SectionELF = static_cast(Section); const MCSymbol *Grp = SectionELF->getGroup(); if (Grp) @@ -639,6 +651,9 @@ } void MCELFStreamer::FinishImpl() { + // Ensure the last section gets aligned if necessary. + setSectionAlignmentForBundling(getAssembler(), getCurrentSectionData()); + EmitFrames(nullptr); Flush(); Index: llvm/trunk/test/MC/X86/AlignedBundling/section-alignment.s =================================================================== --- llvm/trunk/test/MC/X86/AlignedBundling/section-alignment.s +++ llvm/trunk/test/MC/X86/AlignedBundling/section-alignment.s @@ -0,0 +1,21 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +# RUN: | llvm-readobj -sections | FileCheck %s + +# Test that bundle-aligned sections with instructions are aligned + + .bundle_align_mode 5 +# CHECK: Sections +# Check that the empty .text section has the default alignment +# CHECK-LABEL: Name: .text +# CHECK-NOT: Name +# CHECK: AddressAlignment: 4 + + .section text1, "x" + imull $17, %ebx, %ebp +# CHECK-LABEL: Name: text1 +# CHECK: AddressAlignment: 32 + + .section text2, "x" + imull $17, %ebx, %ebp +# CHECK-LABEL: Name: text2 +# CHECK: AddressAlignment: 32