MC: Fix MCSectionCOFF::PrintSwitchToSection

We had a few bugs:
- We were considering the GVKind instead of just looking at the section
  characteristics
- We would never print out 'y' when a section was meant to be unreadable
- We would never print out 's' when a section was meant to be shared
- We translated IMAGE_SCN_MEM_DISCARDABLE to 'n' when it should've meant
  IMAGE_SCN_LNK_REMOVE

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218189 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Majnemer
2014-09-20 20:40:50 +00:00
parent cc727ec92a
commit 1c1bde666c
2 changed files with 18 additions and 7 deletions

View File

@@ -47,18 +47,22 @@ void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI,
} }
OS << "\t.section\t" << getSectionName() << ",\""; OS << "\t.section\t" << getSectionName() << ",\"";
if (getKind().isText()) if (getCharacteristics() & COFF::IMAGE_SCN_MEM_EXECUTE)
OS << 'x'; OS << 'x';
else if (getKind().isBSS()) if (getCharacteristics() & COFF::IMAGE_SCN_MEM_WRITE)
OS << 'b';
if (getKind().isWriteable() && !getKind().isReadOnlyWithRel())
OS << 'w'; OS << 'w';
else else if (getCharacteristics() & COFF::IMAGE_SCN_MEM_READ)
OS << 'r'; OS << 'r';
if (getCharacteristics() & COFF::IMAGE_SCN_MEM_DISCARDABLE) else
OS << 'n'; OS << 'y';
if (getCharacteristics() & COFF::IMAGE_SCN_CNT_INITIALIZED_DATA) if (getCharacteristics() & COFF::IMAGE_SCN_CNT_INITIALIZED_DATA)
OS << 'd'; OS << 'd';
if (getCharacteristics() & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)
OS << 'b';
if (getCharacteristics() & COFF::IMAGE_SCN_LNK_REMOVE)
OS << 'n';
if (getCharacteristics() & COFF::IMAGE_SCN_MEM_SHARED)
OS << 's';
OS << '"'; OS << '"';
if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) { if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {

View File

@@ -0,0 +1,7 @@
// RUN: llvm-mc -triple i386-pc-win32 < %s | FileCheck %s
.section .klaatu,"wn"
// CHECK: .section .klaatu,"wn"
.section .barada,"y"
// CHECK: .section .barada,"y"
.section .nikto,"wds"
// CHECK: .section .nikto,"wds"