[llvm] r235365 - [MC] When using bundle aligment, align sections to bundle size

Derek Schuff dschuff at google.com
Mon Apr 20 17:14:26 PDT 2015


Author: dschuff
Date: Mon Apr 20 19:14:25 2015
New Revision: 235365

URL: http://llvm.org/viewvc/llvm-project?rev=235365&view=rev
Log:
[MC] When using bundle aligment, align sections to bundle size

Summary:
Bundle aligment requires that the functions always start at an aligned address.
Usually this is ensured by the compiler, but assembly code does not always
begin with a .align directive.

This change ensures that sections get the correct alignment if they contain
any instructions and bundling is enabled. (It also makes LLVM match the
behavior of GNU as).

Differential Revision: http://reviews.llvm.org/D9131

Added:
    llvm/trunk/test/MC/X86/AlignedBundling/section-alignment.s
Modified:
    llvm/trunk/lib/MC/MCELFStreamer.cpp

Modified: llvm/trunk/lib/MC/MCELFStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCELFStreamer.cpp?rev=235365&r1=235364&r2=235365&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCELFStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCELFStreamer.cpp Mon Apr 20 19:14:25 2015
@@ -131,6 +131,16 @@ void MCELFStreamer::EmitAssemblerFlag(MC
   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 @@ void MCELFStreamer::ChangeSection(const
     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)
@@ -639,6 +651,9 @@ void MCELFStreamer::Flush() {
 }
 
 void MCELFStreamer::FinishImpl() {
+  // Ensure the last section gets aligned if necessary.
+  setSectionAlignmentForBundling(getAssembler(), getCurrentSectionData());
+
   EmitFrames(nullptr);
 
   Flush();

Added: llvm/trunk/test/MC/X86/AlignedBundling/section-alignment.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/AlignedBundling/section-alignment.s?rev=235365&view=auto
==============================================================================
--- llvm/trunk/test/MC/X86/AlignedBundling/section-alignment.s (added)
+++ llvm/trunk/test/MC/X86/AlignedBundling/section-alignment.s Mon Apr 20 19:14:25 2015
@@ -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





More information about the llvm-commits mailing list