[llvm-commits] [llvm] r115523 - in /llvm/trunk: include/llvm/MC/MCSection.h include/llvm/MC/MCSectionCOFF.h include/llvm/MC/MCSectionELF.h include/llvm/MC/MCSectionMachO.h lib/MC/MCParser/AsmParser.cpp lib/MC/MCSectionCOFF.cpp lib/MC/MCSectionELF.cpp lib/MC/MCSectionMachO.cpp lib/Target/PIC16/PIC16Section.cpp lib/Target/PIC16/PIC16Section.h test/MC/COFF/align-nops.s test/MC/COFF/dg.exp test/MC/ELF/align-nops.s

Jan Wen Voung jvoung at google.com
Mon Oct 4 10:32:41 PDT 2010


Author: jvoung
Date: Mon Oct  4 12:32:41 2010
New Revision: 115523

URL: http://llvm.org/viewvc/llvm-project?rev=115523&view=rev
Log:
Add hook in MCSection to decide when to use "optimized nops", for each
section kind. Previously, optimized nops were only used for MachO.
Also added tests for ELF and COFF.


Added:
    llvm/trunk/test/MC/COFF/align-nops.s
    llvm/trunk/test/MC/ELF/align-nops.s
Modified:
    llvm/trunk/include/llvm/MC/MCSection.h
    llvm/trunk/include/llvm/MC/MCSectionCOFF.h
    llvm/trunk/include/llvm/MC/MCSectionELF.h
    llvm/trunk/include/llvm/MC/MCSectionMachO.h
    llvm/trunk/lib/MC/MCParser/AsmParser.cpp
    llvm/trunk/lib/MC/MCSectionCOFF.cpp
    llvm/trunk/lib/MC/MCSectionELF.cpp
    llvm/trunk/lib/MC/MCSectionMachO.cpp
    llvm/trunk/lib/Target/PIC16/PIC16Section.cpp
    llvm/trunk/lib/Target/PIC16/PIC16Section.h
    llvm/trunk/test/MC/COFF/dg.exp

Modified: llvm/trunk/include/llvm/MC/MCSection.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSection.h?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCSection.h (original)
+++ llvm/trunk/include/llvm/MC/MCSection.h Mon Oct  4 12:32:41 2010
@@ -61,6 +61,10 @@
       return false;
     }
 
+    // UseCodeAlign - Return true if a .align directive should use
+    // "optimized nops" to fill instead of 0s.
+    virtual bool UseCodeAlign() const = 0;
+
     static bool classof(const MCSection *) { return true; }
   };
 

Modified: llvm/trunk/include/llvm/MC/MCSectionCOFF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSectionCOFF.h?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCSectionCOFF.h (original)
+++ llvm/trunk/include/llvm/MC/MCSectionCOFF.h Mon Oct  4 12:32:41 2010
@@ -55,6 +55,7 @@
     
     virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
                                       raw_ostream &OS) const;
+    virtual bool UseCodeAlign() const;
 
     static bool classof(const MCSection *S) {
       return S->getVariant() == SV_COFF;

Modified: llvm/trunk/include/llvm/MC/MCSectionELF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSectionELF.h?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCSectionELF.h (original)
+++ llvm/trunk/include/llvm/MC/MCSectionELF.h Mon Oct  4 12:32:41 2010
@@ -178,7 +178,8 @@
   
   void PrintSwitchToSection(const MCAsmInfo &MAI,
                             raw_ostream &OS) const;
-  
+  virtual bool UseCodeAlign() const;
+
   /// isBaseAddressKnownZero - We know that non-allocatable sections (like
   /// debug info) have a base of zero.
   virtual bool isBaseAddressKnownZero() const {

Modified: llvm/trunk/include/llvm/MC/MCSectionMachO.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSectionMachO.h?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCSectionMachO.h (original)
+++ llvm/trunk/include/llvm/MC/MCSectionMachO.h Mon Oct  4 12:32:41 2010
@@ -165,6 +165,7 @@
 
   virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
                                     raw_ostream &OS) const;
+  virtual bool UseCodeAlign() const;
 
   static bool classof(const MCSection *S) {
     return S->getVariant() == SV_MachO;

Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Mon Oct  4 12:32:41 2010
@@ -1654,12 +1654,7 @@
 
   // Check whether we should use optimal code alignment for this .align
   // directive.
-  //
-  // FIXME: This should be using a target hook.
-  bool UseCodeAlign = false;
-  if (const MCSectionMachO *S = dyn_cast<MCSectionMachO>(
-        getStreamer().getCurrentSection()))
-    UseCodeAlign = S->hasAttribute(MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS);
+  bool UseCodeAlign = getStreamer().getCurrentSection()->UseCodeAlign();
   if ((!HasFillExpr || Lexer.getMAI().getTextAlignFillValue() == FillExpr) &&
       ValueSize == 1 && UseCodeAlign) {
     getStreamer().EmitCodeAlignment(Alignment, MaxBytesToFill);

Modified: llvm/trunk/lib/MC/MCSectionCOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCSectionCOFF.cpp?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCSectionCOFF.cpp (original)
+++ llvm/trunk/lib/MC/MCSectionCOFF.cpp Mon Oct  4 12:32:41 2010
@@ -74,3 +74,7 @@
     }
   }
 }
+
+bool MCSectionCOFF::UseCodeAlign() const {
+  return getKind().isText();
+}

Modified: llvm/trunk/lib/MC/MCSectionELF.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCSectionELF.cpp?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCSectionELF.cpp (original)
+++ llvm/trunk/lib/MC/MCSectionELF.cpp Mon Oct  4 12:32:41 2010
@@ -112,6 +112,10 @@
   OS << '\n';
 }
 
+bool MCSectionELF::UseCodeAlign() const {
+  return getFlags() & MCSectionELF::SHF_EXECINSTR;
+}
+
 // HasCommonSymbols - True if this section holds common symbols, this is
 // indicated on the ELF object file by a symbol with SHN_COMMON section 
 // header index.

Modified: llvm/trunk/lib/MC/MCSectionMachO.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCSectionMachO.cpp?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCSectionMachO.cpp (original)
+++ llvm/trunk/lib/MC/MCSectionMachO.cpp Mon Oct  4 12:32:41 2010
@@ -148,6 +148,10 @@
   OS << '\n';
 }
 
+bool MCSectionMachO::UseCodeAlign() const {
+  return hasAttribute(MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS);
+}
+
 /// StripSpaces - This removes leading and trailing spaces from the StringRef.
 static void StripSpaces(StringRef &Str) {
   while (!Str.empty() && isspace(Str[0]))
@@ -283,4 +287,3 @@
   
   return "";
 }
-

Modified: llvm/trunk/lib/Target/PIC16/PIC16Section.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16Section.cpp?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PIC16/PIC16Section.cpp (original)
+++ llvm/trunk/lib/Target/PIC16/PIC16Section.cpp Mon Oct  4 12:32:41 2010
@@ -102,3 +102,7 @@
 
   OS << '\n';
 }
+
+bool PIC16Section::UseCodeAlign() const {
+  return isCODE_Type();
+}

Modified: llvm/trunk/lib/Target/PIC16/PIC16Section.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16Section.h?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PIC16/PIC16Section.h (original)
+++ llvm/trunk/lib/Target/PIC16/PIC16Section.h Mon Oct  4 12:32:41 2010
@@ -88,6 +88,8 @@
     virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
                                       raw_ostream &OS) const;
 
+    virtual bool UseCodeAlign() const;
+
     static bool classof(const MCSection *S) {
       return S->getVariant() == SV_PIC16;
     }

Added: llvm/trunk/test/MC/COFF/align-nops.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/align-nops.s?rev=115523&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/align-nops.s (added)
+++ llvm/trunk/test/MC/COFF/align-nops.s Mon Oct  4 12:32:41 2010
@@ -0,0 +1,45 @@
+// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s -o %t
+// RUN: coff-dump.py %abs_tmp | FileCheck %s
+        
+// Test that we get optimal nops in text
+    .text
+f0:
+    .long 0
+    .align  8, 0x90
+    .long 0
+    .align  8
+
+// But not in another section
+    .data
+    .long 0
+    .align  8, 0x90
+    .long 0
+    .align  8
+
+//CHECK:         Name                     = .text
+//CHECK-NEXT:    VirtualSize
+//CHECK-NEXT:    VirtualAddress
+//CHECK-NEXT:    SizeOfRawData            = 16
+//CHECK-NEXT:    PointerToRawData
+//CHECK-NEXT:    PointerToRelocations
+//CHECK-NEXT:    PointerToLineNumbers
+//CHECK-NEXT:    NumberOfRelocations
+//CHECK-NEXT:    NumberOfLineNumbers
+//CHECK-NEXT:    Charateristics           = 0x400001
+//CHECK-NEXT:        IMAGE_SCN_ALIGN_8BYTES
+//CHECK-NEXT:      SectionData              = 
+//CHECK-NEXT:        00 00 00 00 0F 1F 40 00 - 00 00 00 00 0F 1F 40 00
+
+//CHECK:         Name                     = .data
+//CHECK-NEXT:      VirtualSize
+//CHECK-NEXT:      VirtualAddress
+//CHECK-NEXT:      SizeOfRawData            = 16
+//CHECK-NEXT:      PointerToRawData
+//CHECK-NEXT:      PointerToRelocations
+//CHECK-NEXT:      PointerToLineNumbers
+//CHECK-NEXT:      NumberOfRelocations
+//CHECK-NEXT:      NumberOfLineNumbers
+//CHECK-NEXT:      Charateristics           = 0x400001
+//CHECK-NEXT:        IMAGE_SCN_ALIGN_8BYTES
+//CHECK-NEXT:      SectionData              = 
+//CHECK-NEXT:        00 00 00 00 90 90 90 90 - 00 00 00 00 00 00 00 00

Modified: llvm/trunk/test/MC/COFF/dg.exp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/dg.exp?rev=115523&r1=115522&r2=115523&view=diff
==============================================================================
--- llvm/trunk/test/MC/COFF/dg.exp (original)
+++ llvm/trunk/test/MC/COFF/dg.exp Mon Oct  4 12:32:41 2010
@@ -1,5 +1,5 @@
 load_lib llvm.exp
 
 if { [llvm_supports_target X86] } {
-  RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll}]]
+  RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,s}]]
 }

Added: llvm/trunk/test/MC/ELF/align-nops.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/align-nops.s?rev=115523&view=auto
==============================================================================
--- llvm/trunk/test/MC/ELF/align-nops.s (added)
+++ llvm/trunk/test/MC/ELF/align-nops.s Mon Oct  4 12:32:41 2010
@@ -0,0 +1,40 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump --dump-section-data | FileCheck %s
+
+// Test that we get optimal nops in text
+    .text
+f0:
+    .long 0
+    .align  8, 0x90
+    .long 0
+    .align  8
+
+// But not in another section
+    .data
+    .long 0
+    .align  8, 0x90
+    .long 0
+    .align  8
+
+// CHECK: (('sh_name', 1) # '.text'
+// CHECK-NEXT:  ('sh_type', 1)
+// CHECK-NEXT:  ('sh_flags', 6)
+// CHECK-NEXT:  ('sh_addr',
+// CHECK-NEXT:  ('sh_offset',
+// CHECK-NEXT:  ('sh_size', 16)
+// CHECK-NEXT:  ('sh_link', 0)
+// CHECK-NEXT:  ('sh_info', 0)
+// CHECK-NEXT:  ('sh_addralign', 8)
+// CHECK-NEXT:  ('sh_entsize', 0)
+// CHECK-NEXT:  ('_section_data', '00000000 0f1f4000 00000000 0f1f4000')
+
+// CHECK: (('sh_name', 7) # '.data'
+// CHECK-NEXT:  ('sh_type', 1)
+// CHECK-NEXT:  ('sh_flags', 3)
+// CHECK-NEXT:  ('sh_addr',
+// CHECK-NEXT:  ('sh_offset',
+// CHECK-NEXT:  ('sh_size', 16)
+// CHECK-NEXT:  ('sh_link', 0)
+// CHECK-NEXT:  ('sh_info', 0)
+// CHECK-NEXT:  ('sh_addralign', 8)
+// CHECK-NEXT:  ('sh_entsize', 0)
+// CHECK-NEXT:  ('_section_data', '00000000 90909090 00000000 00000000')





More information about the llvm-commits mailing list