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();
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<const MCSectionELF *>(Section);
const MCSymbol *Grp = SectionELF->getGroup();
if (Grp)
}
void MCELFStreamer::FinishImpl() {
+ // Ensure the last section gets aligned if necessary.
+ setSectionAlignmentForBundling(getAssembler(), getCurrentSectionData());
+
EmitFrames(nullptr);
Flush();
--- /dev/null
+# 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