MC: Treat ReadOnlyWithRel and ReadOnlyWithRelLocal as ReadOnly for COFF
authorDavid Majnemer <david.majnemer@gmail.com>
Sat, 20 Sep 2014 07:31:46 +0000 (07:31 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sat, 20 Sep 2014 07:31:46 +0000 (07:31 +0000)
A problem with our old behavior becomes observable under x86-64 COFF
when we need a read-only GV which has an initializer which is referenced
using a relocation: we would mark the section as writable.  Marking the
section as writable interferes with section merging.

This fixes PR21009.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218179 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TargetLoweringObjectFileImpl.cpp
lib/MC/MCSectionCOFF.cpp
test/MC/COFF/const-gv-with-rel-init.ll [new file with mode: 0644]

index 7a14f2c6dcd14e55b6b4fcb7a2cfdef9b380d1c8..6d5e27c00e80ef29f62c435f663fb857c276b3b5 100644 (file)
@@ -761,7 +761,7 @@ getCOFFSectionFlags(SectionKind K) {
       COFF::IMAGE_SCN_MEM_EXECUTE |
       COFF::IMAGE_SCN_MEM_READ |
       COFF::IMAGE_SCN_CNT_CODE;
-  else if (K.isBSS ())
+  else if (K.isBSS())
     Flags |=
       COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
       COFF::IMAGE_SCN_MEM_READ |
@@ -771,7 +771,7 @@ getCOFFSectionFlags(SectionKind K) {
       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
       COFF::IMAGE_SCN_MEM_READ |
       COFF::IMAGE_SCN_MEM_WRITE;
-  else if (K.isReadOnly())
+  else if (K.isReadOnly() || K.isReadOnlyWithRel())
     Flags |=
       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
       COFF::IMAGE_SCN_MEM_READ;
index fc2bd365e16d56373e462a33fbd2c605860d841f..ee6b249522b81c07c4fcc9c6f1fb2047343f2f0c 100644 (file)
@@ -51,7 +51,7 @@ void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI,
     OS << 'x';
   else if (getKind().isBSS())
     OS << 'b';
-  if (getKind().isWriteable())
+  if (getKind().isWriteable() && !getKind().isReadOnlyWithRel())
     OS << 'w';
   else
     OS << 'r';
diff --git a/test/MC/COFF/const-gv-with-rel-init.ll b/test/MC/COFF/const-gv-with-rel-init.ll
new file mode 100644 (file)
index 0000000..7e1b61b
--- /dev/null
@@ -0,0 +1,8 @@
+; RUN: llc -mtriple x86_64-pc-windows-msvc < %s | FileCheck %s
+
+define void @f() {
+  ret void
+}
+
+@ptr = constant void ()* @f, section ".CRT$XLB", align 8
+; CHECK:  .section  .CRT$XLB,"rd"