From 3ece9856d157c85511d59f9f862ab351bbd9b38b Mon Sep 17 00:00:00 2001 From: Ben Gamari <ben@smart-cactus.org> Date: Thu, 20 Jul 2023 12:22:35 -0400 Subject: [PATCH] nativeGen: Explicitly set flags of text sections on Windows The binutils documentation (for COFF) claims, > If no flags are specified, the default flags depend upon the section > name. If the section name is not recognized, the default will be for the > section to be loaded and writable. We previously assumed that this would do the right thing for split sections (e.g. a section named `.text$foo` would be correctly inferred to be a text section). However, we have observed that this is not the case (at least under the clang toolchain used on Windows): when split-sections is enabled, text sections are treated by the assembler as data (matching the "default" behavior specified by the documentation). Avoid this by setting section flags explicitly. This should fix split sections on Windows. Fixes #22834. --- .gitlab-ci.yml | 4 ++-- .gitlab/generate-ci/gen_ci.hs | 4 ++-- .gitlab/jobs.yaml | 20 ++++++++++---------- compiler/GHC/CmmToAsm/Ppr.hs | 3 +++ 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9bbca14c317c..bb9a4081ef3c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -511,7 +511,7 @@ doc-tarball: optional: true - job: nightly-x86_64-windows-validate optional: true - - job: release-x86_64-windows-release+no_split_sections + - job: release-x86_64-windows-release optional: true tags: @@ -535,7 +535,7 @@ doc-tarball: || mv "ghc-x86_64-linux-deb10-release.tar.xz" "$LINUX_BINDIST" \ || true mv "ghc-x86_64-windows-validate.tar.xz" "$WINDOWS_BINDIST" \ - || mv "ghc-x86_64-windows-release+no_split_sections.tar.xz" "$WINDOWS_BINDIST" \ + || mv "ghc-x86_64-windows-release.tar.xz" "$WINDOWS_BINDIST" \ || true if [ ! -f "$LINUX_BINDIST" ]; then echo "Error: $LINUX_BINDIST does not exist. Did the Debian 9 job fail?" diff --git a/.gitlab/generate-ci/gen_ci.hs b/.gitlab/generate-ci/gen_ci.hs index e011d9550457..d8c2b8c503d1 100644 --- a/.gitlab/generate-ci/gen_ci.hs +++ b/.gitlab/generate-ci/gen_ci.hs @@ -921,8 +921,8 @@ job_groups = -- This job is only for generating head.hackage docs , hackage_doc_job (disableValidate (standardBuildsWithConfig Amd64 (Linux Fedora33) releaseConfig)) , disableValidate (standardBuildsWithConfig Amd64 (Linux Fedora33) dwarf) - , fastCI (standardBuildsWithConfig Amd64 Windows (splitSectionsBroken vanilla)) - , disableValidate (standardBuildsWithConfig Amd64 Windows (splitSectionsBroken nativeInt)) + , fastCI (standardBuildsWithConfig Amd64 Windows vanilla) + , disableValidate (standardBuildsWithConfig Amd64 Windows nativeInt) , standardBuilds Amd64 Darwin , allowFailureGroup (addValidateRule FreeBSDLabel (validateBuilds Amd64 FreeBSD13 vanilla)) , fastCI (standardBuilds AArch64 Darwin) diff --git a/.gitlab/jobs.yaml b/.gitlab/jobs.yaml index 78029fd9d1ea..d3b215b596cf 100644 --- a/.gitlab/jobs.yaml +++ b/.gitlab/jobs.yaml @@ -3577,7 +3577,7 @@ "XZ_OPT": "-9" } }, - "release-x86_64-windows-int_native-release+no_split_sections": { + "release-x86_64-windows-int_native-release": { "after_script": [ "bash .gitlab/ci.sh save_cache", "bash .gitlab/ci.sh save_test_output", @@ -3587,7 +3587,7 @@ "artifacts": { "expire_in": "1 year", "paths": [ - "ghc-x86_64-windows-int_native-release+no_split_sections.tar.xz", + "ghc-x86_64-windows-int_native-release.tar.xz", "junit.xml", "unexpected-test-output.tar.gz" ], @@ -3626,8 +3626,8 @@ ], "variables": { "BIGNUM_BACKEND": "native", - "BIN_DIST_NAME": "ghc-x86_64-windows-int_native-release+no_split_sections", - "BUILD_FLAVOUR": "release+no_split_sections", + "BIN_DIST_NAME": "ghc-x86_64-windows-int_native-release", + "BUILD_FLAVOUR": "release", "CABAL_INSTALL_VERSION": "3.8.1.0", "CONFIGURE_ARGS": "", "GHC_VERSION": "9.4.3", @@ -3636,11 +3636,11 @@ "LANG": "en_US.UTF-8", "MSYSTEM": "CLANG64", "RUNTEST_ARGS": "", - "TEST_ENV": "x86_64-windows-int_native-release+no_split_sections", + "TEST_ENV": "x86_64-windows-int_native-release", "XZ_OPT": "-9" } }, - "release-x86_64-windows-release+no_split_sections": { + "release-x86_64-windows-release": { "after_script": [ "bash .gitlab/ci.sh save_cache", "bash .gitlab/ci.sh save_test_output", @@ -3650,7 +3650,7 @@ "artifacts": { "expire_in": "1 year", "paths": [ - "ghc-x86_64-windows-release+no_split_sections.tar.xz", + "ghc-x86_64-windows-release.tar.xz", "junit.xml", "unexpected-test-output.tar.gz" ], @@ -3689,8 +3689,8 @@ ], "variables": { "BIGNUM_BACKEND": "gmp", - "BIN_DIST_NAME": "ghc-x86_64-windows-release+no_split_sections", - "BUILD_FLAVOUR": "release+no_split_sections", + "BIN_DIST_NAME": "ghc-x86_64-windows-release", + "BUILD_FLAVOUR": "release", "CABAL_INSTALL_VERSION": "3.8.1.0", "CONFIGURE_ARGS": "", "GHC_VERSION": "9.4.3", @@ -3699,7 +3699,7 @@ "LANG": "en_US.UTF-8", "MSYSTEM": "CLANG64", "RUNTEST_ARGS": "", - "TEST_ENV": "x86_64-windows-release+no_split_sections", + "TEST_ENV": "x86_64-windows-release", "XZ_OPT": "-9" } }, diff --git a/compiler/GHC/CmmToAsm/Ppr.hs b/compiler/GHC/CmmToAsm/Ppr.hs index 7959db8d693a..52c2f8307fb2 100644 --- a/compiler/GHC/CmmToAsm/Ppr.hs +++ b/compiler/GHC/CmmToAsm/Ppr.hs @@ -245,6 +245,9 @@ pprGNUSectionHeader config t suffix = OtherSection _ -> panic "PprBase.pprGNUSectionHeader: unknown section type" flags = case t of + Text + | OSMinGW32 <- platformOS platform + -> text ",\"xr\"" CString | OSMinGW32 <- platformOS platform -> empty -- GitLab