Matthew Pickering pushed to branch wip/gdc-files at Glasgow Haskell Compiler / GHC

Commits:

12 changed files:

Changes:

  • compiler/GHC/Driver/Main.hs
    ... ... @@ -849,15 +849,14 @@ hscRecompStatus
    849 849
             return $ HscRecompNeeded $ fmap mi_iface_hash mb_checked_iface
    
    850 850
           UpToDateItem checked_iface -> do
    
    851 851
             let lcl_dflags = ms_hspp_opts mod_summary
    
    852
    -        mod_details <- initModDetails hsc_env checked_iface
    
    853 852
             if | not (backendGeneratesCode (backend lcl_dflags)) -> do
    
    854 853
                    -- No need for a linkable, we're good to go
    
    855 854
                    msg UpToDate
    
    856
    -               return $ HscUpToDate (HomeModInfo checked_iface mod_details emptyHomeModInfoLinkable)
    
    855
    +               return $ HscUpToDate checked_iface emptyHomeModInfoLinkable
    
    857 856
                | not (backendGeneratesCodeForHsBoot (backend lcl_dflags))
    
    858 857
                , IsBoot <- isBootSummary mod_summary -> do
    
    859 858
                    msg UpToDate
    
    860
    -               return $ HscUpToDate (HomeModInfo checked_iface mod_details emptyHomeModInfoLinkable)
    
    859
    +               return $ HscUpToDate checked_iface emptyHomeModInfoLinkable
    
    861 860
     
    
    862 861
                -- Always recompile with the JS backend when TH is enabled until
    
    863 862
                -- #23013 is fixed.
    
    ... ... @@ -874,7 +873,7 @@ hscRecompStatus
    874 873
                    -- 2. The bytecode object file
    
    875 874
                    bc_obj_linkable <- checkByteCodeFromObject hsc_env mod_summary
    
    876 875
                    -- 3. Bytecode from an interface whole core bindings.
    
    877
    -               bc_core_linkable <- checkByteCodeFromCoreBindings hsc_env checked_iface mod_details mod_summary
    
    876
    +               bc_core_linkable <- checkByteCodeFromCoreBindings hsc_env checked_iface mod_summary
    
    878 877
                    -- 4. The object file.
    
    879 878
                    obj_linkable <- liftIO $ checkObjects lcl_dflags (homeMod_object old_linkable) mod_summary
    
    880 879
                    trace_if (hsc_logger hsc_env)
    
    ... ... @@ -885,7 +884,7 @@ hscRecompStatus
    885 884
     
    
    886 885
                    let just_o  = justObjects  <$> obj_linkable
    
    887 886
     
    
    888
    -                   definitely_both_os = case (definitely_bc, obj_linkable) of
    
    887
    +                   definitely_both_os = case (bc_result, obj_linkable) of
    
    889 888
                                    (UpToDateItem bc, UpToDateItem o) -> UpToDateItem (bytecodeAndObjects bc o)
    
    890 889
                                    -- If missing object code, just say we need to recompile because of object code.
    
    891 890
                                    (_, OutOfDateItem reason _) -> OutOfDateItem reason Nothing
    
    ... ... @@ -898,17 +897,26 @@ hscRecompStatus
    898 897
                        definitely_bc =  bc_obj_linkable `prefer` bc_in_memory_linkable
    
    899 898
     
    
    900 899
                        -- If not -fwrite-byte-code, then we could use core bindings or object code if that's available.
    
    901
    -                   maybe_bc = ((bc_obj_linkable `choose` bc_core_linkable) `prefer` bc_in_memory_linkable)
    
    902
    -                              `choose` obj_linkable
    
    900
    +                   maybe_bc = bc_in_memory_linkable `choose`
    
    901
    +                              bc_obj_linkable `choose`
    
    902
    +                              bc_core_linkable `choose`
    
    903
    +                              obj_linkable
    
    903 904
     
    
    905
    +                   bc_result = if gopt Opt_WriteByteCode lcl_dflags
    
    906
    +                                -- If the byte-code artifact needs to be produced, then we certainly need bytecode.
    
    907
    +                                then definitely_bc
    
    908
    +                                else maybe_bc
    
    909
    +
    
    910
    +               trace_if (hsc_logger hsc_env)
    
    911
    +                (vcat [text "definitely_bc", ppr definitely_bc
    
    912
    +                      , text "maybe_bc", ppr maybe_bc
    
    913
    +                      , text "definitely_both_os", ppr definitely_both_os
    
    914
    +                      , text "just_o", ppr just_o])
    
    904 915
     --               pprTraceM "recomp" (ppr just_bc <+> ppr just_o)
    
    905 916
                    -- 2. Decide which of the products we will need
    
    906 917
                    let recomp_linkable_result = case () of
    
    907 918
                          _ | backendCanReuseLoadedCode (backend lcl_dflags) ->
    
    908
    -                           if gopt Opt_WriteByteCode lcl_dflags
    
    909
    -                              -- If the byte-code artifact needs to be produced, then we certainly need bytecode.
    
    910
    -                              then justBytecode <$> definitely_bc
    
    911
    -                              else justBytecode <$> maybe_bc
    
    919
    +                           justBytecode <$> bc_result
    
    912 920
                             -- Need object files for making object files
    
    913 921
                             | backendWritesFiles (backend lcl_dflags) ->
    
    914 922
                                if gopt Opt_ByteCodeAndObjectCode lcl_dflags
    
    ... ... @@ -921,7 +929,7 @@ hscRecompStatus
    921 929
                    case recomp_linkable_result of
    
    922 930
                      UpToDateItem linkable -> do
    
    923 931
                        msg $ UpToDate
    
    924
    -                   return $ HscUpToDate (HomeModInfo checked_iface mod_details linkable)
    
    932
    +                   return $ HscUpToDate checked_iface linkable
    
    925 933
                      OutOfDateItem reason _ -> do
    
    926 934
                        msg $ NeedsRecompile reason
    
    927 935
                        return $ HscRecompNeeded $ Just $ mi_iface_hash $ checked_iface
    
    ... ... @@ -1010,19 +1018,20 @@ checkByteCodeFromObject hsc_env mod_sum = do
    1010 1018
     
    
    1011 1019
     -- | Attempt to load bytecode from whole core bindings in the interface if they exist.
    
    1012 1020
     -- This is a legacy code-path, these days it should be preferred to use the bytecode object linkable.
    
    1013
    -checkByteCodeFromCoreBindings :: HscEnv -> ModIface -> ModDetails -> ModSummary -> IO (MaybeValidated Linkable)
    
    1014
    -checkByteCodeFromCoreBindings hsc_env iface mod_details mod_sum = do
    
    1021
    +checkByteCodeFromCoreBindings :: HscEnv -> ModIface -> ModSummary -> IO (MaybeValidated Linkable)
    
    1022
    +checkByteCodeFromCoreBindings _hsc_env iface mod_sum = do
    
    1015 1023
         let
    
    1016 1024
           this_mod   = ms_mod mod_sum
    
    1017 1025
           if_date    = fromJust $ ms_iface_date mod_sum
    
    1018 1026
         case iface_core_bindings iface (ms_location mod_sum) of
    
    1019 1027
           Just fi -> do
    
    1020
    -        ~(bco, fos) <- unsafeInterleaveIO $
    
    1021
    -                       compileWholeCoreBindings hsc_env (md_types mod_details) fi
    
    1022
    -        let bco' = LazyBCOs bco fos
    
    1023
    -        return $ UpToDateItem (Linkable if_date this_mod (NE.singleton bco'))
    
    1028
    +        return $ UpToDateItem (Linkable if_date this_mod (NE.singleton (CoreBindings fi)))
    
    1024 1029
           _ -> return $ outOfDateItemBecause MissingBytecode Nothing
    
    1025 1030
     
    
    1031
    +--  970           let fi = WholeCoreBindings extra_decls this_mod (ms_location mod_sum)
    
    1032
    +-- 971                    (mi_foreign iface)
    
    1033
    +-- 972           return (UpToDateItem (Linkable if_date this_mod (NE.singleton (CoreBindings fi))))
    
    1034
    +
    
    1026 1035
     --------------------------------------------------------------
    
    1027 1036
     -- Compilers
    
    1028 1037
     --------------------------------------------------------------
    

  • compiler/GHC/Driver/Pipeline.hs
    ... ... @@ -244,11 +244,11 @@ compileOne' mHscMessage
    244 244
        status <- hscRecompStatus mHscMessage plugin_hsc_env upd_summary
    
    245 245
                     mb_old_iface mb_old_linkable (mod_index, nmods)
    
    246 246
        let pipeline = hscPipeline pipe_env (setDumpPrefix pipe_env plugin_hsc_env, upd_summary, status)
    
    247
    -   runPipeline (hsc_hooks plugin_hsc_env) pipeline
    
    247
    +   (iface, linkable) <- runPipeline (hsc_hooks plugin_hsc_env) pipeline
    
    248 248
        -- See Note [ModDetails and --make mode]
    
    249
    -   -- details <- initModDetails plugin_hsc_env iface
    
    250
    -   -- linkable' <- traverse (initWholeCoreBindings plugin_hsc_env iface details) (homeMod_bytecode linkable)
    
    251
    -   -- return $! HomeModInfo iface details (linkable { homeMod_bytecode = linkable' })
    
    249
    +   details <- initModDetails plugin_hsc_env iface
    
    250
    +   linkable' <- traverse (initWholeCoreBindings plugin_hsc_env iface details) (homeMod_bytecode linkable)
    
    251
    +   return $! HomeModInfo iface details (linkable { homeMod_bytecode = linkable' })
    
    252 252
     
    
    253 253
      where lcl_dflags  = ms_hspp_opts summary
    
    254 254
            location    = ms_location summary
    
    ... ... @@ -757,7 +757,7 @@ preprocessPipeline pipe_env hsc_env input_fn = do
    757 757
                $ phaseIfFlag hsc_env flag def action
    
    758 758
     
    
    759 759
     -- | The complete compilation pipeline, from start to finish
    
    760
    -fullPipeline :: P m => PipeEnv -> HscEnv -> FilePath -> HscSource -> m HomeModInfo
    
    760
    +fullPipeline :: P m => PipeEnv -> HscEnv -> FilePath -> HscSource -> m (ModIface, HomeModLinkable)
    
    761 761
     fullPipeline pipe_env hsc_env pp_fn src_flavour = do
    
    762 762
       (dflags, input_fn) <- preprocessPipeline pipe_env hsc_env pp_fn
    
    763 763
       let hsc_env' = hscSetFlags dflags hsc_env
    
    ... ... @@ -766,16 +766,15 @@ fullPipeline pipe_env hsc_env pp_fn src_flavour = do
    766 766
       hscPipeline pipe_env (hsc_env_with_plugins, mod_sum, hsc_recomp_status)
    
    767 767
     
    
    768 768
     -- | Everything after preprocess
    
    769
    -hscPipeline :: P m => PipeEnv ->  ((HscEnv, ModSummary, HscRecompStatus)) -> m HomeModInfo
    
    769
    +hscPipeline :: P m => PipeEnv ->  ((HscEnv, ModSummary, HscRecompStatus)) -> m (ModIface, HomeModLinkable)
    
    770 770
     hscPipeline pipe_env (hsc_env_with_plugins, mod_sum, hsc_recomp_status) = do
    
    771 771
       case hsc_recomp_status of
    
    772
    -    HscUpToDate hmi -> return hmi
    
    772
    +    HscUpToDate iface linkable -> return (iface, linkable)
    
    773 773
         HscRecompNeeded mb_old_hash -> do
    
    774 774
           (tc_result, warnings) <- use (T_Hsc hsc_env_with_plugins mod_sum)
    
    775 775
           hscBackendAction <- use (T_HscPostTc hsc_env_with_plugins mod_sum tc_result warnings mb_old_hash )
    
    776 776
           (iface, linkable) <-hscBackendPipeline pipe_env hsc_env_with_plugins mod_sum hscBackendAction
    
    777
    -      details <- liftIO $ initModDetails hsc_env_with_plugins iface
    
    778
    -      return $! HomeModInfo iface details linkable
    
    777
    +      return $! (iface, linkable)
    
    779 778
     
    
    780 779
     hscBackendPipeline :: P m => PipeEnv -> HscEnv -> ModSummary -> HscBackendAction -> m (ModIface, HomeModLinkable)
    
    781 780
     hscBackendPipeline pipe_env hsc_env mod_sum result =
    
    ... ... @@ -924,7 +923,7 @@ pipelineStart pipe_env hsc_env input_fn mb_phase =
    924 923
                             liftIO (showPass logger msg)
    
    925 924
                             liftIO (copyWithHeader line_prag out_fn final_fn)
    
    926 925
                           return Nothing
    
    927
    -                    _ -> objFromLinkable . hm_linkable <$> fullPipeline pipe_env hsc_env input_fn sf
    
    926
    +                    _ -> objFromLinkable . snd <$> fullPipeline pipe_env hsc_env input_fn sf
    
    928 927
        c :: P m => Phase -> m (Maybe FilePath)
    
    929 928
        c phase = viaCPipeline phase pipe_env hsc_env Nothing input_fn
    
    930 929
        as :: P m => Bool -> m (Maybe FilePath)
    

  • compiler/GHC/Unit/Module/Status.hs
    ... ... @@ -16,7 +16,7 @@ import GHC.Unit.Home.ModInfo
    16 16
     -- | Status of a module in incremental compilation
    
    17 17
     data HscRecompStatus
    
    18 18
         -- | Nothing to do because code already exists.
    
    19
    -    = HscUpToDate HomeModInfo
    
    19
    +    = HscUpToDate ModIface HomeModLinkable
    
    20 20
         -- | Recompilation of module, or update of interface is required. Optionally
    
    21 21
         -- pass the old interface hash to avoid updating the existing interface when
    
    22 22
         -- it has not changed.
    

  • testsuite/driver/testlib.py
    ... ... @@ -549,10 +549,12 @@ only_ghci = only_ways([WayName('ghci'), WayName('ghci-opt')])
    549 549
     # -----
    
    550 550
     
    
    551 551
     def valid_way( way: WayName ) -> bool:
    
    552
    -    if way in {'ghci', 'ghci-opt', 'ghci-ext'}:
    
    552
    +    if way in {'ghci', 'ghci-opt'}:
    
    553 553
             return config.have_RTS_linker
    
    554
    -    if way == 'ghci-ext-prof':
    
    555
    -        return config.have_RTS_linker and config.have_profiling
    
    554
    +    if way in {'ghci-ext'}:
    
    555
    +        return config.have_ext_interp
    
    556
    +    if way in {'ghci-ext-prof'}:
    
    557
    +        return config.have_ext_interp and config.have_profiling
    
    556 558
         return True
    
    557 559
     
    
    558 560
     def extra_ways( ways: List[WayName] ):
    

  • testsuite/tests/driver/T5313.hs
    ... ... @@ -7,7 +7,7 @@ main = do
    7 7
           -- begin initialize
    
    8 8
           df0 <- GHC.getSessionDynFlags
    
    9 9
           let df1 = df0{GHC.ghcMode    = GHC.CompManager,
    
    10
    -                    GHC.backend    = GHC.interpreterBackend,
    
    10
    +                    GHC.backend    = GHC.bytecodeBackend,
    
    11 11
                         GHC.ghcLink    = GHC.LinkInMemory,
    
    12 12
                         GHC.verbosity  = 0}
    
    13 13
           _ <- GHC.setSessionDynFlags df1
    

  • testsuite/tests/ghc-api/T10052/T10052.hs
    ... ... @@ -24,7 +24,7 @@ runGhc' args act = do
    24 24
           logger <- getLogger
    
    25 25
           (dflags1, _leftover, _warns) <- parseDynamicFlags logger dflags0 flags
    
    26 26
           let dflags2 = dflags1 {
    
    27
    -              backend   = interpreterBackend
    
    27
    +              backend   = bytecodeBackend
    
    28 28
                 , ghcLink   = LinkInMemory
    
    29 29
                 , verbosity = 1
    
    30 30
                 }
    

  • testsuite/tests/ghc-api/T8639_api.hs
    ... ... @@ -11,7 +11,7 @@ main
    11 11
      = do { [libdir] <- getArgs
    
    12 12
           ; runGhc (Just libdir) $ do
    
    13 13
                flags <- getSessionDynFlags
    
    14
    -           setSessionDynFlags (flags{ backend = interpreterBackend, ghcLink = LinkInMemory})
    
    14
    +           setSessionDynFlags (flags{ backend = bytecodeBackend, ghcLink = LinkInMemory})
    
    15 15
                target <- guessTarget "T8639_api_a.hs" Nothing Nothing
    
    16 16
                setTargets [target]
    
    17 17
                load LoadAllTargets
    

  • testsuite/tests/ghc-api/apirecomp001/myghc.hs
    ... ... @@ -37,7 +37,7 @@ main = do
    37 37
         prn "target nothing: ok"
    
    38 38
     
    
    39 39
         dflags <- getSessionDynFlags
    
    40
    -    setSessionDynFlags $ dflags { backend = interpreterBackend }
    
    40
    +    setSessionDynFlags $ dflags { backend = bytecodeBackend }
    
    41 41
         ok <- load LoadAllTargets
    
    42 42
         when (failed ok) $ error "Couldn't load A.hs in interpreted mode"
    
    43 43
         prn "target interpreted: ok"
    

  • testsuite/tests/ghci/linking/dyn/T3372.hs
    ... ... @@ -44,7 +44,7 @@ newGhcServer = do (libdir:_) <- getArgs
    44 44
       where ghc action libdir = GHC.runGhc (Just libdir) (init >> action)
    
    45 45
             init = do df <- GHC.getSessionDynFlags
    
    46 46
                       GHC.setSessionDynFlags df{GHC.ghcMode    = GHC.CompManager,
    
    47
    -                                            GHC.backend    = GHC.interpreterBackend,
    
    47
    +                                            GHC.backend    = GHC.bytecodeBackend,
    
    48 48
                                                 GHC.ghcLink    = GHC.LinkInMemory,
    
    49 49
                                                 GHC.verbosity  = 0}
    
    50 50
     
    

  • testsuite/tests/ghci/should_run/PackedDataCon/packeddatacon.T
    ... ... @@ -2,9 +2,8 @@ test('PackedDataCon',
    2 2
          [ extra_files(['Obj.hs', 'ByteCode.hs', 'Types.hs', 'Common.hs-incl']),
    
    3 3
            req_interp,
    
    4 4
            req_bco,
    
    5
    -       extra_ways(['ghci']),
    
    6
    -       when(config.have_ext_interp, extra_ways(['ghci', 'ghci-ext'])),
    
    7
    -       when(config.have_ext_interp and config.have_profiling, extra_ways(['ghci', 'ghci-ext', 'ghci-ext-prof']))
    
    5
    +       extra_ways(ghci_ways),
    
    6
    +       only_ways(ghci_ways),
    
    8 7
          ],
    
    9 8
          compile_and_run,
    
    10 9
          ['']
    

  • testsuite/tests/ghci/should_run/UnboxedTuples/unboxedtuples.T
    1
    +print(ghci_ways)
    
    2
    +
    
    1 3
     test('UnboxedTuples',
    
    2 4
          [ extra_files(['Obj.hs', 'ByteCode.hs', 'Common.hs-incl']),
    
    3 5
            req_interp,
    
    4 6
            req_bco,
    
    5
    -       extra_ways(['ghci']),
    
    6
    -       when(config.have_ext_interp, extra_ways(['ghci', 'ghci-ext'])),
    
    7
    -       when(config.have_ext_interp and config.have_profiling, extra_ways(['ghci', 'ghci-ext', 'ghci-ext-prof']))
    
    7
    +       only_ways(ghci_ways),
    
    8
    +       extra_ways(ghci_ways),
    
    8 9
          ],
    
    9 10
          compile_and_run,
    
    10 11
          ['']
    

  • testsuite/tests/ghci/should_run/UnliftedDataTypeInterp/unlifteddatatypeinterp.T
    ... ... @@ -2,9 +2,8 @@ test('UnliftedDataTypeInterp',
    2 2
          [ extra_files(['Obj.hs', 'ByteCode.hs', 'Types.hs', 'Common.hs-incl']),
    
    3 3
            req_interp,
    
    4 4
            req_bco,
    
    5
    -       extra_ways(['ghci']),
    
    6
    -       when(config.have_ext_interp, extra_ways(['ghci', 'ghci-ext'])),
    
    7
    -       when(config.have_ext_interp and config.have_profiling, extra_ways(['ghci', 'ghci-ext', 'ghci-ext-prof']))
    
    5
    +       only_ways(ghci_ways),
    
    6
    +       extra_ways(ghci_ways),
    
    8 7
          ],
    
    9 8
          compile_and_run,
    
    10 9
          ['']