[llvm] r358960 - [llvm-mc] - Properly set the the address align field of the compressed sections.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 23 02:16:53 PDT 2019


Author: grimar
Date: Tue Apr 23 02:16:53 2019
New Revision: 358960

URL: http://llvm.org/viewvc/llvm-project?rev=358960&view=rev
Log:
[llvm-mc] - Properly set the the address align field of the compressed sections.

About the compressed sections spec says:
(https://docs.oracle.com/cd/E37838_01/html/E36783/section_compression.html)
sh_addralign fields of the section header for a compressed section
reflect the requirements of the compressed section.

Currently, llvm-mc always puts uncompressed section alignment to sh_addralign.
It is not correct. zlib styled section contains an Elfxx_Chdr header,
so we should either use 4 or 8 values depending on the target
(Uncompressed section alignment is stored in ch_addralign field of the compression header).

GNU assembler version 2.31.1 also has this issue,
but in 2.32.51 it was already fixed. This is how it was found
during debugging of the https://bugs.llvm.org/show_bug.cgi?id=40482
actually.

Differential revision: https://reviews.llvm.org/D60965

Modified:
    llvm/trunk/lib/MC/ELFObjectWriter.cpp
    llvm/trunk/test/MC/ELF/compression.s

Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=358960&r1=358959&r2=358960&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Tue Apr 23 02:16:53 2019
@@ -886,12 +886,16 @@ void ELFWriter::writeSectionData(const M
     return;
   }
 
-  if (ZlibStyle)
+  if (ZlibStyle) {
     // Set the compressed flag. That is zlib style.
     Section.setFlags(Section.getFlags() | ELF::SHF_COMPRESSED);
-  else
+    // Alignment field should reflect the requirements of
+    // the compressed section header.
+    Section.setAlignment(is64Bit() ? 8 : 4);
+  } else {
     // Add "z" prefix to section name. This is zlib-gnu style.
     MC.renameELFSection(&Section, (".z" + SectionName.drop_front(1)).str());
+  }
   W.OS << CompressedContents;
 }
 

Modified: llvm/trunk/test/MC/ELF/compression.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/compression.s?rev=358960&r1=358959&r2=358960&view=diff
==============================================================================
--- llvm/trunk/test/MC/ELF/compression.s (original)
+++ llvm/trunk/test/MC/ELF/compression.s Tue Apr 23 02:16:53 2019
@@ -10,9 +10,11 @@
 // RUN: llvm-mc -filetype=obj -compress-debug-sections=zlib -triple x86_64-pc-linux-gnu < %s -o %t
 // RUN: llvm-objdump -s %t | FileCheck --check-prefix=CHECK-ZLIB-STYLE %s
 // RUN: llvm-dwarfdump -debug-str %t | FileCheck --check-prefix=STR %s
-// RUN: llvm-mc -filetype=obj -compress-debug-sections=zlib -triple i386-pc-linux-gnu < %s \
-// RUN:     | llvm-readobj -symbols - | FileCheck --check-prefix=386-SYMBOLS-ZLIB %s
-// RUN: llvm-readobj -sections %t | FileCheck --check-prefix=ZLIB-STYLE-FLAGS %s
+// RUN: llvm-readobj -sections %t | FileCheck --check-prefixes=ZLIB-STYLE-FLAGS,ZLIB-STYLE-FLAGS64 %s
+
+// RUN: llvm-mc -filetype=obj -compress-debug-sections=zlib -triple i386-pc-linux-gnu < %s -o %t
+// RUN: llvm-readobj -symbols -sections %t \
+// RUN:   | FileCheck --check-prefixes=386-SYMBOLS-ZLIB,ZLIB-STYLE-FLAGS,ZLIB-STYLE-FLAGS32 %s
 
 // Don't compress small sections, such as this simple debug_abbrev example
 // CHECK-GNU-STYLE: Contents of section .debug_abbrev:
@@ -60,6 +62,16 @@
 // ZLIB-STYLE-FLAGS-NEXT:   Type: SHT_PROGBITS
 // ZLIB-STYLE-FLAGS-NEXT:   Flags [
 // ZLIB-STYLE-FLAGS-NEXT:     SHF_COMPRESSED
+// ZLIB-STYLE-FLAGS-NEXT:     SHF_MERGE
+// ZLIB-STYLE-FLAGS-NEXT:     SHF_STRINGS
+// ZLIB-STYLE-FLAGS-NEXT:   ]
+// ZLIB-STYLE-FLAGS-NEXT:   Address:
+// ZLIB-STYLE-FLAGS-NEXT:   Offset:
+// ZLIB-STYLE-FLAGS-NEXT:   Size:
+// ZLIB-STYLE-FLAGS-NEXT:   Link:
+// ZLIB-STYLE-FLAGS-NEXT:   Info:
+// ZLIB-STYLE-FLAGS32-NEXT: AddressAlignment: 4
+// ZLIB-STYLE-FLAGS64-NEXT: AddressAlignment: 8
 
 // 386-SYMBOLS-ZLIB: Name: .Linfo_string0
 // 386-SYMBOLS-ZLIB-NOT: }




More information about the llvm-commits mailing list