From 9b3ae73fc8bf5de598f9a56e9aeb8b0acd3fdaf0 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 29 Nov 2016 16:11:09 +0000 Subject: [PATCH] [ELF] - Disable emiting multiple output sections when merging is disabled. When -O0 is specified, we do not do section merging. Though before this patch several sections were generated instead of single, what is useless. Differential revision: https://reviews.llvm.org/D27041 llvm-svn: 288151 --- lld/ELF/InputSection.cpp | 6 ++++++ lld/test/ELF/merge-string.s | 2 -- lld/test/ELF/no-merge.s | 25 +++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 lld/test/ELF/no-merge.s diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 2fcb39b..a019056 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -80,6 +80,12 @@ InputSectionBase::InputSectionBase(elf::ObjectFile *File, if (V > UINT32_MAX) fatal(toString(File) + ": section sh_addralign is too large"); Alignment = V; + + // If it is not a mergeable section, overwrite the flag so that the flag + // is consistent with the class. This inconsistency could occur when + // string merging is disabled using -O0 flag. + if (!Config->Relocatable && !isa>(this)) + this->Flags &= ~(SHF_MERGE | SHF_STRINGS); } template diff --git a/lld/test/ELF/merge-string.s b/lld/test/ELF/merge-string.s index 2ad8afa..ffcafde 100644 --- a/lld/test/ELF/merge-string.s +++ b/lld/test/ELF/merge-string.s @@ -61,8 +61,6 @@ zed: // NOMERGE-NEXT: Type: SHT_PROGBITS // NOMERGE-NEXT: Flags [ // NOMERGE-NEXT: SHF_ALLOC -// NOMERGE-NEXT: SHF_MERGE -// NOMERGE-NEXT: SHF_STRINGS // NOMERGE-NEXT: ] // NOMERGE-NEXT: Address: 0x1C8 // NOMERGE-NEXT: Offset: 0x1C8 diff --git a/lld/test/ELF/no-merge.s b/lld/test/ELF/no-merge.s new file mode 100644 index 0000000..5d8b857 --- /dev/null +++ b/lld/test/ELF/no-merge.s @@ -0,0 +1,25 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: echo "SECTIONS { .data : {*(.data.*)} }" > %t0.script +# RUN: ld.lld %t.o -o %t0.out --script %t0.script +# RUN: llvm-objdump -s %t0.out | FileCheck %s --check-prefix=OPT +# OPT: Contents of section .data: +# OPT-NEXT: 0000 01 +# OPT-NEXT: Contents of section .data: +# OPT-NEXT: 0001 6100 +# OPT-NEXT: Contents of section .data: +# OPT-NEXT: 0003 03 + +# RUN: ld.lld -O0 %t.o -o %t1.out --script %t0.script +# RUN: llvm-objdump -s %t1.out | FileCheck %s --check-prefix=NOOPT +# NOOPT: Contents of section .data: +# NOOPT-NEXT: 0000 01610003 + +.section .data.aw,"aw",@progbits +.byte 1 + +.section .data.ams,"aMS",@progbits,1 +.asciz "a" + +.section .data.am,"aM",@progbits,1 +.byte 3 -- 2.7.4