summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJake Ehrlich <jakehehrlich@google.com>2017-12-11 23:25:27 +0000
committerJake Ehrlich <jakehehrlich@google.com>2017-12-11 23:25:27 +0000
commit0ca350a92d6b67b80bec0d979ccbd9245dcf6718 (patch)
treeb0b63c99d0c328e3460f8274840032373a50af87
parent6074e6b0944ba7d60199895b025a56f1396c0f40 (diff)
downloadbcm5719-llvm-0ca350a92d6b67b80bec0d979ccbd9245dcf6718.tar.gz
bcm5719-llvm-0ca350a92d6b67b80bec0d979ccbd9245dcf6718.zip
[ELF] Change default output section type to SHT_NOBITS
When an output section has no byte commands and has no input sections then it would be ideal if the type of the section is SHT_NOBITS so that the file can take up less space. This change sets the default type of of output sections to SHT_NOBITS instead of SHT_PROGBITS to allow this. This required some minor test changes (which double as tests for this new behavior) but extend-pt-load.s had be changed in a non-trivial way. Since it seems to me that the point of the test is to point out the consequences of how flags are assigned to output sections that don't have input sections I changed the test to work and still show how the memsize of the executable segment was changed. Differential Revision: https://reviews.llvm.org/D41082 llvm-svn: 320437
-rw-r--r--lld/ELF/LinkerScript.cpp2
-rw-r--r--lld/ELF/OutputSections.cpp2
-rw-r--r--lld/test/ELF/linkerscript/arm-exidx-order.s2
-rw-r--r--lld/test/ELF/linkerscript/extend-pt-load.s7
-rw-r--r--lld/test/ELF/linkerscript/merge-sections.s2
-rw-r--r--lld/test/ELF/linkerscript/symbol-only-flags.s2
-rw-r--r--lld/test/ELF/linkerscript/symbol-only.s2
7 files changed, 10 insertions, 9 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index f301afc4031..77bdb4d3f48 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -87,7 +87,7 @@ OutputSection *LinkerScript::createOutputSection(StringRef Name,
// There was a forward reference.
Sec = SecRef;
} else {
- Sec = make<OutputSection>(Name, SHT_PROGBITS, 0);
+ Sec = make<OutputSection>(Name, SHT_NOBITS, 0);
if (!SecRef)
SecRef = Sec;
}
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index f87b52441bd..b6dee4303a6 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -312,6 +312,8 @@ template <class ELFT> void OutputSection::finalize() {
Sections.push_back(IS);
}
}
+ if (isa<ByteCommand>(Base) && Type == SHT_NOBITS)
+ Type = SHT_PROGBITS;
}
if (Flags & SHF_LINK_ORDER) {
diff --git a/lld/test/ELF/linkerscript/arm-exidx-order.s b/lld/test/ELF/linkerscript/arm-exidx-order.s
index 3c6791f7745..35cfada7f4a 100644
--- a/lld/test/ELF/linkerscript/arm-exidx-order.s
+++ b/lld/test/ELF/linkerscript/arm-exidx-order.s
@@ -9,7 +9,7 @@
# CHECK: Section {
# CHECK: Index:
# CHECK: Name: .foo
-# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Type: SHT_NOBITS
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: ]
diff --git a/lld/test/ELF/linkerscript/extend-pt-load.s b/lld/test/ELF/linkerscript/extend-pt-load.s
index fb9ea6fc09f..72740f1092e 100644
--- a/lld/test/ELF/linkerscript/extend-pt-load.s
+++ b/lld/test/ELF/linkerscript/extend-pt-load.s
@@ -33,18 +33,17 @@
# RUN: .hash : { } \
# RUN: .dynstr : { } \
# RUN: .text : { *(.text) } \
-# RUN: . = ALIGN(0x1000); \
-# RUN: bar : { HIDDEN(bar_sym = .); } \
+# RUN: bar : { . = ALIGN(0x1000); } \
# RUN: .data.rel.ro : { *(.data.rel.ro) } \
# RUN: }" > %t.script
# RUN: ld.lld --hash-style=sysv -o %t2 --script %t.script %t.o -shared
# RUN: llvm-readobj --elf-output-style=GNU -l -s %t2 | FileCheck --check-prefix=CHECK2 %s
# CHECK2: .text PROGBITS 00000000000001bc 0001bc 000001 00 AX
-# CHECK2-NEXT: bar PROGBITS 0000000000001000 001000 000000 00 AX
+# CHECK2-NEXT: bar NOBITS 00000000000001bd 0001bd 000e43 00 AX
# CHECK2-NEXT: .data.rel.ro PROGBITS 0000000000001000 001000 000001 00 WA
-# CHECK2: LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x001000 0x001000 R E
+# CHECK2: LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x0001bd 0x001000 R E
# CHECK2-NEXT: LOAD 0x001000 0x0000000000001000 0x0000000000001000 0x000068 0x000068 RW
# If the current behavior becomes a problem we should consider just moving the commands out
diff --git a/lld/test/ELF/linkerscript/merge-sections.s b/lld/test/ELF/linkerscript/merge-sections.s
index 950d822ec40..2709bdaee44 100644
--- a/lld/test/ELF/linkerscript/merge-sections.s
+++ b/lld/test/ELF/linkerscript/merge-sections.s
@@ -36,7 +36,7 @@
# RUN: llvm-readobj -s -t %t2 | FileCheck %s --check-prefix=GC
# GC: Name: .foo
-# GC-NEXT: Type: SHT_PROGBITS
+# GC-NEXT: Type: SHT_NOBITS
# GC-NEXT: Flags [
# GC-NEXT: SHF_ALLOC
# GC-NEXT: ]
diff --git a/lld/test/ELF/linkerscript/symbol-only-flags.s b/lld/test/ELF/linkerscript/symbol-only-flags.s
index 5ad7befee93..300d8d88da9 100644
--- a/lld/test/ELF/linkerscript/symbol-only-flags.s
+++ b/lld/test/ELF/linkerscript/symbol-only-flags.s
@@ -10,7 +10,7 @@
# CHECK: Section {
# CHECK: Index:
# CHECK: Name: .foo
-# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Type: SHT_NOBITS
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: SHF_WRITE
diff --git a/lld/test/ELF/linkerscript/symbol-only.s b/lld/test/ELF/linkerscript/symbol-only.s
index 2fb57260b33..76d54f01cdc 100644
--- a/lld/test/ELF/linkerscript/symbol-only.s
+++ b/lld/test/ELF/linkerscript/symbol-only.s
@@ -12,7 +12,7 @@
# CHECK: Sections:
# CHECK-NEXT: Idx Name Size Address
# CHECK-NEXT: 0 00000000 0000000000000000
-# CHECK: abc 00000000 [[ADDR:[0-9a-f]*]] DATA
+# CHECK: abc 00000000 [[ADDR:[0-9a-f]*]] BSS
# CHECK-NEXT: bar 00000000 0000000000001000 DATA
# CHECK: SYMBOL TABLE:
OpenPOWER on IntegriCloud