Serge S. Gulin pushed to branch wip/T25974 at Glasgow Haskell Compiler / GHC

Commits:

8 changed files:

Changes:

  • .gitlab/ci.sh
    ... ... @@ -75,6 +75,15 @@ Environment variables affecting both build systems:
    75 75
       NIX_SYSTEM        On Darwin, the target platform of the desired toolchain
    
    76 76
                         (either "x86-64-darwin" or "aarch-darwin")
    
    77 77
       NO_BOOT           Whether to run ./boot or not, used when testing the source dist
    
    78
    +  TOOLCHAIN_SOURCE  Select a source of toolchain. Possible values:
    
    79
    +                    - "env": Toolchains are included in the Docker image via environment
    
    80
    +                             variables. Default for Linux.
    
    81
    +                    - "nix": Toolchains are provided via .gitlab/darwin/toolchain.nix.
    
    82
    +                             Default for Darwin.
    
    83
    +                    - "extracted":
    
    84
    +                             Toolchains will be downloaded and extracted through the
    
    85
    +                             CI process. Default for other systems. Windows and FreeBSD
    
    86
    +                             are included.
    
    78 87
     
    
    79 88
     Environment variables determining build configuration of Hadrian system:
    
    80 89
     
    
    ... ... @@ -83,14 +92,14 @@ Environment variables determining build configuration of Hadrian system:
    83 92
                         This tests the "reinstall" configuration
    
    84 93
       CROSS_EMULATOR    The emulator to use for testing of cross-compilers.
    
    85 94
     
    
    86
    -Environment variables determining bootstrap toolchain (Linux):
    
    95
    +Environment variables determining bootstrap toolchain (TOOLCHAIN_SOURCE=env):
    
    87 96
     
    
    88 97
       GHC           Path of GHC executable to use for bootstrapping.
    
    89 98
       CABAL         Path of cabal-install executable to use for bootstrapping.
    
    90 99
       ALEX          Path of alex executable to use for bootstrapping.
    
    91 100
       HAPPY         Path of alex executable to use for bootstrapping.
    
    92 101
     
    
    93
    -Environment variables determining bootstrap toolchain (non-Linux):
    
    102
    +Environment variables determining bootstrap toolchain (TOOLCHAIN_SOURCE=extracted):
    
    94 103
     
    
    95 104
       GHC_VERSION   Which GHC version to fetch for bootstrapping.
    
    96 105
       CABAL_INSTALL_VERSION
    
    ... ... @@ -132,10 +141,33 @@ function setup_locale() {
    132 141
     }
    
    133 142
     
    
    134 143
     function mingw_init() {
    
    144
    +  if [[ "${TOOLCHAIN_SOURCE:-}" =~ "env" ]]; then
    
    145
    +    # We assume that passed GHC will be used as a bootstrap ghc compiler
    
    146
    +    if [ -n "${GHC:-}" ]; then
    
    147
    +      boot_triple=$($GHC --info | awk -F'"' '/Target platform/ {print $4}')
    
    148
    +    else
    
    149
    +      boot_triple=$(ghc --info | awk -F'"' '/Target platform/ {print $4}')
    
    150
    +    fi
    
    151
    +  else
    
    152
    +    case "$MSYSTEM" in
    
    153
    +      CLANG64)
    
    154
    +        boot_triple="x86_64-unknown-mingw32" # triple of bootstrap GHC
    
    155
    +        ;;
    
    156
    +      CLANGARM64)
    
    157
    +        boot_triple="aarch64-unknown-mingw32" # triple of bootstrap GHC
    
    158
    +        ;;
    
    159
    +      *)
    
    160
    +        fail "win32-init: Unknown MSYSTEM $MSYSTEM"
    
    161
    +        ;;
    
    162
    +    esac
    
    163
    +  fi
    
    164
    +
    
    135 165
       case "$MSYSTEM" in
    
    136 166
         CLANG64)
    
    137 167
           target_triple="x86_64-unknown-mingw32"
    
    138
    -      boot_triple="x86_64-unknown-mingw32" # triple of bootstrap GHC
    
    168
    +      ;;
    
    169
    +    CLANGARM64)
    
    170
    +      target_triple="aarch64-unknown-mingw32"
    
    139 171
           ;;
    
    140 172
         *)
    
    141 173
           fail "win32-init: Unknown MSYSTEM $MSYSTEM"
    
    ... ... @@ -150,10 +182,19 @@ function mingw_init() {
    150 182
       MINGW_MOUNT_POINT="${MINGW_PREFIX}"
    
    151 183
       PATH="$MINGW_MOUNT_POINT/bin:$PATH"
    
    152 184
     
    
    153
    -  # We always use mingw64 Python to avoid path length issues like #17483.
    
    154
    -  export PYTHON="/mingw64/bin/python3"
    
    155
    -  # And need to use sphinx-build from the environment
    
    156
    -  export SPHINXBUILD="/mingw64/bin/sphinx-build.exe"
    
    185
    +  case "$MSYSTEM" in
    
    186
    +    CLANGARM64)
    
    187
    +      # At MSYS for ARM64 we force to use their special versions to speedup the compiler step
    
    188
    +      export PYTHON="/clangarm64/bin/python3"
    
    189
    +      export SPHINXBUILD="/clangarm64/bin/sphinx-build.exe"
    
    190
    +      ;;
    
    191
    +    *)
    
    192
    +      # We always use mingw64 Python to avoid path length issues like #17483.
    
    193
    +      export PYTHON="/mingw64/bin/python3"
    
    194
    +      # And need to use sphinx-build from the environment
    
    195
    +      export SPHINXBUILD="/mingw64/bin/sphinx-build.exe"
    
    196
    +      ;;
    
    197
    +  esac
    
    157 198
     }
    
    158 199
     
    
    159 200
     # This will contain GHC's local native toolchain
    
    ... ... @@ -178,15 +219,21 @@ function show_tool() {
    178 219
     }
    
    179 220
     
    
    180 221
     function set_toolchain_paths() {
    
    181
    -  case "$(uname -m)-$(uname)" in
    
    182
    -    # Linux toolchains are included in the Docker image
    
    183
    -    *-Linux) toolchain_source="env" ;;
    
    184
    -    # Darwin toolchains are provided via .gitlab/darwin/toolchain.nix
    
    185
    -    *-Darwin) toolchain_source="nix" ;;
    
    186
    -    *) toolchain_source="extracted" ;;
    
    187
    -  esac
    
    222
    +  if [ -z "${TOOLCHAIN_SOURCE:-}" ]
    
    223
    +  then
    
    224
    +    # Fallback to automatic detection which could not work for cases
    
    225
    +    # when cross compiler will be build at Windows environment
    
    226
    +    # and requires a special mingw compiler (not bundled)
    
    227
    +    case "$(uname -m)-$(uname)" in
    
    228
    +      # Linux toolchains are included in the Docker image
    
    229
    +      *-Linux) TOOLCHAIN_SOURCE="env" ;;
    
    230
    +      # Darwin toolchains are provided via .gitlab/darwin/toolchain.nix
    
    231
    +      *-Darwin) TOOLCHAIN_SOURCE="nix" ;;
    
    232
    +      *) TOOLCHAIN_SOURCE="extracted" ;;
    
    233
    +    esac
    
    234
    +  fi
    
    188 235
     
    
    189
    -  case "$toolchain_source" in
    
    236
    +  case "$TOOLCHAIN_SOURCE" in
    
    190 237
         extracted)
    
    191 238
           # These are populated by setup_toolchain
    
    192 239
           GHC="$toolchain/bin/ghc$exe"
    
    ... ... @@ -217,7 +264,7 @@ function set_toolchain_paths() {
    217 264
           : ${HAPPY:=$(which happy)}
    
    218 265
           : ${ALEX:=$(which alex)}
    
    219 266
           ;;
    
    220
    -    *) fail "bad toolchain_source"
    
    267
    +    *) fail "bad TOOLCHAIN_SOURCE"
    
    221 268
       esac
    
    222 269
     
    
    223 270
       export GHC
    
    ... ... @@ -247,7 +294,7 @@ function setup() {
    247 294
           cp -Rf "$CABAL_CACHE"/* "$CABAL_DIR"
    
    248 295
       fi
    
    249 296
     
    
    250
    -  case $toolchain_source in
    
    297
    +  case $TOOLCHAIN_SOURCE in
    
    251 298
         extracted) time_it "setup" setup_toolchain ;;
    
    252 299
         *) ;;
    
    253 300
       esac
    
    ... ... @@ -405,6 +452,17 @@ function configure() {
    405 452
       if [[ -n "${target_triple:-}" ]]; then
    
    406 453
         args+=("--target=$target_triple")
    
    407 454
       fi
    
    455
    +  if [[ "${TOOLCHAIN_SOURCE:-}" =~ "extracted" ]]; then
    
    456
    +    # To extract something need download something first.
    
    457
    +    args+=("--enable-tarballs-autodownload")
    
    458
    +  else
    
    459
    +    # For Windows we should explicitly --enable-distro-toolchain
    
    460
    +    # if i.e. we decided to use TOOLCHAIN_SOURCE = env
    
    461
    +    case "$(uname)" in
    
    462
    +      MSYS_*|MINGW*) args+=("--enable-distro-toolchain") ;;
    
    463
    +      *) ;;
    
    464
    +    esac
    
    465
    +  fi
    
    408 466
       if [[ -n "${ENABLE_NUMA:-}" ]]; then
    
    409 467
         args+=("--enable-numa")
    
    410 468
         else
    
    ... ... @@ -421,7 +479,6 @@ function configure() {
    421 479
       # See https://stackoverflow.com/questions/7577052 for a rationale for the
    
    422 480
       # args[@] symbol-soup below.
    
    423 481
       run ${CONFIGURE_WRAPPER:-} ./configure \
    
    424
    -    --enable-tarballs-autodownload \
    
    425 482
         "${args[@]+"${args[@]}"}" \
    
    426 483
         GHC="$GHC" \
    
    427 484
         || ( cat config.log; fail "configure failed" )
    
    ... ... @@ -562,12 +619,14 @@ function install_bindist() {
    562 619
           read -r -a args <<< "${INSTALL_CONFIGURE_ARGS:-}"
    
    563 620
     
    
    564 621
           if [[ "${CROSS_TARGET:-no_cross_target}" =~ "mingw" ]]; then
    
    565
    -          # We suppose that host target = build target.
    
    622
    +          # We assume that BUILD=HOST.
    
    566 623
               # By the fact above it is clearly turning out which host value is
    
    567 624
               # for currently built compiler.
    
    568 625
               # The fix for #21970 will probably remove this if-branch.
    
    569
    -          local -r CROSS_HOST_GUESS=$($SHELL ./config.guess)
    
    570
    -          args+=( "--target=$CROSS_TARGET" "--host=$CROSS_HOST_GUESS" )
    
    626
    +          # Cut is needed due of See Note [Wide Triple Windows].
    
    627
    +          # By default it guesses "(x86_64|aarch64)-w64-mingw32"
    
    628
    +          local -r CROSS_HOST_ARCH_GUESS=$($SHELL ./config.guess | cut -d'-' -f1)
    
    629
    +          args+=( "--target=$CROSS_TARGET" "--host=$CROSS_HOST_ARCH_GUESS-unknown-mingw32" )
    
    571 630
     
    
    572 631
           # FIXME: The bindist configure script shouldn't need to be reminded of
    
    573 632
           # the target platform. See #21970.
    

  • .gitlab/generate-ci/gen_ci.hs
    ... ... @@ -1302,11 +1302,14 @@ cross_jobs = [
    1302 1302
             . setVariable "WindresCmd" (llvm_prefix ++ "windres")
    
    1303 1303
             . setVariable "LLVMAS" (llvm_prefix ++ "clang")
    
    1304 1304
             . setVariable "LD" (llvm_prefix ++ "ld")
    
    1305
    +          -- See Note [Empty MergeObjsCmd]
    
    1305 1306
               -- Windows target require to make linker merge feature check disabled.
    
    1306 1307
             . setVariable "MergeObjsCmd" ""
    
    1308
    +          -- Note [Wide Triple Windows]
    
    1309
    +          -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    1307 1310
               -- LLVM MinGW Linux Toolchain expects to recieve "aarch64-w64-mingw32"
    
    1308 1311
               -- as a triple but we use more common "aarch64-unknown-mingw32".
    
    1309
    -          -- Due of this we need configure ld manually for clang beacause
    
    1312
    +          -- Due of this we need configure ld manually for clang because
    
    1310 1313
               -- it will use system's ld otherwise when --target will be specified to
    
    1311 1314
               -- unexpected triple.
    
    1312 1315
             . setVariable "CFLAGS" cflags
    

  • boot
    ... ... @@ -52,6 +52,8 @@ def autoreconf():
    52 52
         # Run autoreconf on everything that needs it.
    
    53 53
         processes = {}
    
    54 54
         if os.name == 'nt':
    
    55
    +        # Note [ACLOCAL_PATH for Windows]
    
    56
    +        # ~~~~~~~~~~~~~~~~~~~~~~~~~
    
    55 57
             # Get the normalized ACLOCAL_PATH for Windows
    
    56 58
             # This is necessary since on Windows this will be a Windows
    
    57 59
             # path, which autoreconf doesn't know doesn't know how to handle.
    

  • configure.ac
    ... ... @@ -658,12 +658,13 @@ GHC_LLVM_TARGET_SET_VAR
    658 658
     AC_SUBST(LlvmTarget)
    
    659 659
     
    
    660 660
     dnl ** See whether cc supports --target=<triple> and set
    
    661
    -dnl CONF_CC_OPTS_STAGE[012] accordingly.
    
    662
    -FP_CC_SUPPORTS_TARGET([$CC_STAGE0], [CONF_CC_OPTS_STAGE0], [CONF_CXX_OPTS_STAGE0])
    
    661
    +dnl CONF_CC_OPTS_STAGE[12] accordingly.
    
    663 662
     FP_CC_SUPPORTS_TARGET([$CC], [CONF_CC_OPTS_STAGE1], [CONF_CXX_OPTS_STAGE1])
    
    664 663
     FP_CC_SUPPORTS_TARGET([$CC], [CONF_CC_OPTS_STAGE2], [CONF_CXX_OPTS_STAGE2])
    
    665 664
     
    
    666
    -FP_PROG_CC_LINKER_TARGET([$CC_STAGE0], [CONF_CC_OPTS_STAGE0], [CONF_GCC_LINKER_OPTS_STAGE0])
    
    665
    +# CONF_CC_OPTS_STAGE0 should be left as is because it is already configured
    
    666
    +# by bootstrap compiler settings
    
    667
    +
    
    667 668
     FP_PROG_CC_LINKER_TARGET([$CC], [CONF_CC_OPTS_STAGE1], [CONF_GCC_LINKER_OPTS_STAGE1])
    
    668 669
     FP_PROG_CC_LINKER_TARGET([$CC], [CONF_CC_OPTS_STAGE2], [CONF_GCC_LINKER_OPTS_STAGE2])
    
    669 670
     
    

  • hadrian/src/Builder.hs
    ... ... @@ -26,7 +26,7 @@ import Hadrian.Builder.Tar
    26 26
     import Hadrian.Oracles.Path
    
    27 27
     import Hadrian.Oracles.TextFile
    
    28 28
     import Hadrian.Utilities
    
    29
    -import Oracles.Setting (bashPath, targetStage)
    
    29
    +import Oracles.Setting (bashPath, targetStage, isWinHost)
    
    30 30
     import System.Exit
    
    31 31
     import System.IO (stderr)
    
    32 32
     
    
    ... ... @@ -327,8 +327,14 @@ instance H.Builder Builder where
    327 327
                     Ar Unpack _ -> cmd' [Cwd output] [path] buildArgs buildOptions
    
    328 328
     
    
    329 329
                     Autoreconf dir -> do
    
    330
    +                  isWin <- isWinHost
    
    331
    +                  let aclocal_env =
    
    332
    +                        -- It is generally assumed that you would use MinGW's compilers from within an MSYS shell.
    
    333
    +                        -- See Note [ACLOCAL_PATH for Windows]
    
    334
    +                        if isWin then [AddEnv "ACLOCAL_PATH" "/c/msys64/usr/share/aclocal/"]
    
    335
    +                        else []
    
    330 336
                       bash <- bashPath
    
    331
    -                  cmd' [Cwd dir] [bash, path] buildArgs buildOptions
    
    337
    +                  cmd' (Cwd dir `cons` aclocal_env) [bash, path] buildArgs buildOptions
    
    332 338
     
    
    333 339
                     Configure  dir -> do
    
    334 340
                         -- Inject /bin/bash into `libtool`, instead of /bin/sh,
    

  • hadrian/src/Rules/BinaryDist.hs
    ... ... @@ -115,7 +115,12 @@ installTo relocatable prefix = do
    115 115
         targetPlatform <- setting TargetPlatformFull
    
    116 116
         let ghcVersionPretty = "ghc-" ++ version ++ "-" ++ targetPlatform
    
    117 117
             bindistFilesDir  = root -/- "bindist" -/- ghcVersionPretty
    
    118
    -    runBuilder (Configure bindistFilesDir) ["--prefix="++prefix] [] []
    
    118
    +    win <- isWinTarget
    
    119
    +    -- See Note [Empty MergeObjsCmd]
    
    120
    +    let disabledMerge =
    
    121
    +          if win then ["MergeObjsCmd="]
    
    122
    +          else []
    
    123
    +    runBuilder (Configure bindistFilesDir) (["--prefix="++prefix] ++ disabledMerge) [] []
    
    119 124
         let env = case relocatable of
    
    120 125
                     Relocatable -> [AddEnv "RelocatableBuild" "YES"]
    
    121 126
                     NotRelocatable -> []
    
    ... ... @@ -232,7 +237,7 @@ bindistRules = do
    232 237
             -- N.B. the ghc-pkg executable may be prefixed with a target triple
    
    233 238
             -- (c.f. #20267).
    
    234 239
             ghcPkgName <- programName (vanillaContext Stage1 ghcPkg)
    
    235
    -        cmd_ (bindistFilesDir -/- "bin" -/- ghcPkgName) ["recache"]
    
    240
    +        cmd_ (bindistFilesDir -/- "bin" -/- ghcPkgName <.> exe) ["recache"]
    
    236 241
     
    
    237 242
     
    
    238 243
     
    

  • libraries/ghc-internal/src/GHC/Internal/Event/Windows.hsc
    ... ... @@ -861,7 +861,9 @@ expirationTime mgr us = do
    861 861
     -- The 'TimeoutCallback' will not be called more than once.
    
    862 862
     --
    
    863 863
     -- Be careful not to exceed @maxBound :: Int@, which on 32-bit machines is only
    
    864
    --- 2147483647 μs, less than 36 minutes.
    
    864
    +-- 2147483647 microseconds, less than 36 minutes.
    
    865
    +-- We can not use here utf/greek symbol due of:
    
    866
    +-- _build/stage1/libraries/ghc-internal/build/GHC/Internal/Event/Windows.hs: commitBuffer: invalid argument (cannot encode character '\206')
    
    865 867
     --
    
    866 868
     {-# NOINLINE registerTimeout #-}
    
    867 869
     registerTimeout :: Manager -> Int -> TimeoutCallback -> IO TimeoutKey
    
    ... ... @@ -878,7 +880,9 @@ registerTimeout mgr@Manager{..} uSrelTime cb = do
    878 880
     -- This has no effect if the timeout has already fired.
    
    879 881
     --
    
    880 882
     -- Be careful not to exceed @maxBound :: Int@, which on 32-bit machines is only
    
    881
    --- 2147483647 μs, less than 36 minutes.
    
    883
    +-- 2147483647 microseconds, less than 36 minutes.
    
    884
    +-- We can not use here utf/greek symbol due of:
    
    885
    +-- _build/stage1/libraries/ghc-internal/build/GHC/Internal/Event/Windows.hs: commitBuffer: invalid argument (cannot encode character '\206')
    
    882 886
     --
    
    883 887
     updateTimeout :: Manager -> TimeoutKey -> Seconds -> IO ()
    
    884 888
     updateTimeout mgr (TK key) relTime = do
    
    ... ... @@ -980,7 +984,7 @@ step maxDelay mgr@Manager{..} = do
    980 984
         -- There are some unusual edge cases you need to deal with. The
    
    981 985
         -- GetQueuedCompletionStatus function blocks a thread until there's
    
    982 986
         -- work for it to do. Based on the return value, the number of bytes
    
    983
    -    -- and the overlapped structure, theres a lot of possible "reasons"
    
    987
    +    -- and the overlapped structure, there's a lot of possible "reasons"
    
    984 988
         -- for the function to have returned. Deciphering all the possible
    
    985 989
         -- cases:
    
    986 990
         --
    

  • m4/find_merge_objects.m4
    ... ... @@ -33,6 +33,8 @@ AC_DEFUN([FIND_MERGE_OBJECTS],[
    33 33
         fi
    
    34 34
     
    
    35 35
     
    
    36
    +    # Note [Empty MergeObjsCmd]
    
    37
    +    # ~~~~~~~~~~~~~~~~~~~~~~~~~
    
    36 38
         # If MergeObjsCmd="" then we assume that the user is explicitly telling us that
    
    37 39
         # they do not want to configure the MergeObjsCmd, this is particularly important for
    
    38 40
         # the bundled windows toolchain.