summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-11-29 16:11:09 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-11-29 16:11:09 +0000
commit9b3ae73fc8bf5de598f9a56e9aeb8b0acd3fdaf0 (patch)
tree0759c91c737fa425402914c1c8e1c8ff4814f5d5
parent3fb5a6dc9e0c30af868c85ac77c94ebec836b08a (diff)
downloadbcm5719-llvm-9b3ae73fc8bf5de598f9a56e9aeb8b0acd3fdaf0.tar.gz
bcm5719-llvm-9b3ae73fc8bf5de598f9a56e9aeb8b0acd3fdaf0.zip
[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
-rw-r--r--lld/ELF/InputSection.cpp6
-rw-r--r--lld/test/ELF/merge-string.s2
-rw-r--r--lld/test/ELF/no-merge.s25
3 files changed, 31 insertions, 2 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index 2fcb39bfda2..a0190564633 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -80,6 +80,12 @@ InputSectionBase<ELFT>::InputSectionBase(elf::ObjectFile<ELFT> *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<MergeInputSection<ELFT>>(this))
+ this->Flags &= ~(SHF_MERGE | SHF_STRINGS);
}
template <class ELFT>
diff --git a/lld/test/ELF/merge-string.s b/lld/test/ELF/merge-string.s
index 2ad8afa53d6..ffcafdea28a 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 00000000000..5d8b8570ab4
--- /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
OpenPOWER on IntegriCloud