summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2018-04-20 21:23:16 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2018-04-20 21:23:16 +0000
commit71c7de5b7752a93c971771387be535f9793f3931 (patch)
tree5578e15e4713be70e0e0affcdddb6633becb8fc4
parentd14d2e7b185ffd7fcc171ea07734ba5b7aa73d8a (diff)
downloadbcm5719-llvm-71c7de5b7752a93c971771387be535f9793f3931.tar.gz
bcm5719-llvm-71c7de5b7752a93c971771387be535f9793f3931.zip
COFF: Preserve section type when processing /section flag.
It turns out that we were dropping this before. Differential Revision: https://reviews.llvm.org/D45802 llvm-svn: 330481
-rw-r--r--lld/COFF/Chunks.cpp2
-rw-r--r--lld/COFF/Chunks.h8
-rw-r--r--lld/COFF/Writer.cpp3
-rw-r--r--lld/test/COFF/output-chars.test3
-rw-r--r--lld/test/COFF/section.test4
5 files changed, 15 insertions, 5 deletions
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp
index 2ab5aeac843..a462caa754b 100644
--- a/lld/COFF/Chunks.cpp
+++ b/lld/COFF/Chunks.cpp
@@ -388,7 +388,7 @@ bool SectionChunk::hasData() const {
}
uint32_t SectionChunk::getOutputCharacteristics() const {
- return Header->Characteristics & PermMask;
+ return Header->Characteristics & (PermMask | TypeMask);
}
bool SectionChunk::isCOMDAT() const {
diff --git a/lld/COFF/Chunks.h b/lld/COFF/Chunks.h
index bc01f405be9..9e896531bd9 100644
--- a/lld/COFF/Chunks.h
+++ b/lld/COFF/Chunks.h
@@ -38,9 +38,11 @@ class ObjFile;
class OutputSection;
class Symbol;
-// Mask for section types (code, data, bss, disacardable, etc.)
-// and permissions (writable, readable or executable).
-const uint32_t PermMask = 0xFF0000F0;
+// Mask for permissions (discardable, writable, readable, executable, etc).
+const uint32_t PermMask = 0xFE000000;
+
+// Mask for section types (code, data, bss).
+const uint32_t TypeMask = 0x000000E0;
// A Chunk represents a chunk of data that will occupy space in the
// output (if the resolver chose that). It may or may not be backed by
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 63e556bcaa1..952124a81aa 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -237,7 +237,8 @@ void OutputSection::addChunk(Chunk *C) {
}
void OutputSection::setPermissions(uint32_t C) {
- Header.Characteristics = C & PermMask;
+ Header.Characteristics &= ~PermMask;
+ Header.Characteristics |= C;
}
void OutputSection::merge(OutputSection *Other) {
diff --git a/lld/test/COFF/output-chars.test b/lld/test/COFF/output-chars.test
index 29f6cc1acf6..2ccb084364c 100644
--- a/lld/test/COFF/output-chars.test
+++ b/lld/test/COFF/output-chars.test
@@ -23,6 +23,7 @@
# SECTION: Name: .foo
# SECTION: Characteristics [
+# SECTION-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
# SECTION-NEXT: IMAGE_SCN_MEM_EXECUTE
# SECTION-NEXT: IMAGE_SCN_MEM_READ
# SECTION-NEXT: IMAGE_SCN_MEM_WRITE
@@ -30,6 +31,7 @@
# SECTION: Name: .foo
# SECTION: Characteristics [
+# SECTION-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
# SECTION-NEXT: IMAGE_SCN_MEM_EXECUTE
# SECTION-NEXT: IMAGE_SCN_MEM_READ
# SECTION-NEXT: IMAGE_SCN_MEM_WRITE
@@ -76,6 +78,7 @@
# MERGE-SECTION: Name: .foo
# MERGE-SECTION: Characteristics [
+# MERGE-SECTION-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
# MERGE-SECTION-NEXT: IMAGE_SCN_MEM_EXECUTE
# MERGE-SECTION-NEXT: IMAGE_SCN_MEM_READ
# MERGE-SECTION-NEXT: IMAGE_SCN_MEM_WRITE
diff --git a/lld/test/COFF/section.test b/lld/test/COFF/section.test
index 591c04dde73..5e1162e8f35 100644
--- a/lld/test/COFF/section.test
+++ b/lld/test/COFF/section.test
@@ -16,18 +16,22 @@
# RUN: llvm-readobj -sections %t.exe | FileCheck -check-prefix=S %s
# R: Characteristics [
+# R-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
# R-NEXT: IMAGE_SCN_MEM_READ
# R-NEXT: ]
# W: Characteristics [
+# W-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
# W-NEXT: IMAGE_SCN_MEM_WRITE
# W-NEXT: ]
# E: Characteristics [
+# E-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
# E-NEXT: IMAGE_SCN_MEM_EXECUTE
# E-NEXT: ]
# S: Characteristics [
+# S-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
# S-NEXT: IMAGE_SCN_MEM_SHARED
# S-NEXT: ]
OpenPOWER on IntegriCloud