diff options
| author | Peter Collingbourne <peter@pcc.me.uk> | 2018-04-20 21:23:16 +0000 |
|---|---|---|
| committer | Peter Collingbourne <peter@pcc.me.uk> | 2018-04-20 21:23:16 +0000 |
| commit | 71c7de5b7752a93c971771387be535f9793f3931 (patch) | |
| tree | 5578e15e4713be70e0e0affcdddb6633becb8fc4 | |
| parent | d14d2e7b185ffd7fcc171ea07734ba5b7aa73d8a (diff) | |
| download | bcm5719-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.cpp | 2 | ||||
| -rw-r--r-- | lld/COFF/Chunks.h | 8 | ||||
| -rw-r--r-- | lld/COFF/Writer.cpp | 3 | ||||
| -rw-r--r-- | lld/test/COFF/output-chars.test | 3 | ||||
| -rw-r--r-- | lld/test/COFF/section.test | 4 |
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: ] |

