Skip to content

Commit bc6167e

Browse files
authored
Compile profiling library for use with GHCi (#5592)
Compile profiling library for use with GHCi when both `--enable-profiling` and `--enable-library-for-ghci` are passed. The merged `HS${package}.p_o` file can be loaded instead of `libHS${package}_p.a` when we run GHCi with `-prof -fexternal-interpreter` to speed up the linking time. This follows the same idea in ghc side: https://phabricator.haskell.org/D5169 and is required to support same feature when building ghc with hadrian as it uses `cabal copy`: https://phabricator.haskell.org/D5270
1 parent 38be496 commit bc6167e

File tree

3 files changed

+40
-28
lines changed

3 files changed

+40
-28
lines changed

Cabal/Distribution/Simple/GHC.hs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
503503
when (forceShared || withSharedLib lbi)
504504
whenStaticLib forceStatic =
505505
when (forceStatic || withStaticLib lbi)
506-
whenGHCiLib = when (withGHCiLib lbi && withVanillaLib lbi)
506+
whenGHCiLib = when (withGHCiLib lbi)
507507
forRepl = maybe False (const True) mReplFlags
508508
ifReplLib = when forRepl
509509
replFlags = fromMaybe mempty mReplFlags
@@ -708,6 +708,7 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
708708
sharedLibFilePath = libTargetDir </> mkSharedLibName (hostPlatform lbi) compiler_id uid
709709
staticLibFilePath = libTargetDir </> mkStaticLibName (hostPlatform lbi) compiler_id uid
710710
ghciLibFilePath = libTargetDir </> Internal.mkGHCiLibName uid
711+
ghciProfLibFilePath = libTargetDir </> Internal.mkGHCiProfLibName uid
711712
libInstallPath = libdir $ absoluteComponentInstallDirs pkg_descr lbi uid NoCopyDest
712713
sharedLibInstallPath = libInstallPath </> mkSharedLibName (hostPlatform lbi) compiler_id uid
713714

@@ -751,10 +752,6 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
751752
hProfObjs
752753
++ map (libTargetDir </>) cProfObjs
753754
++ stubProfObjs
754-
ghciObjFiles =
755-
hObjs
756-
++ map (libTargetDir </>) cObjs
757-
++ stubObjs
758755
dynamicObjectFiles =
759756
hSharedObjs
760757
++ map (libTargetDir </>) cSharedObjs
@@ -833,16 +830,19 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
833830

834831
info verbosity (show (ghcOptPackages ghcSharedLinkArgs))
835832

836-
whenVanillaLib False $
833+
whenVanillaLib False $ do
837834
Ar.createArLibArchive verbosity lbi vanillaLibFilePath staticObjectFiles
835+
whenGHCiLib $ do
836+
(ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi)
837+
Ld.combineObjectFiles verbosity lbi ldProg
838+
ghciLibFilePath staticObjectFiles
838839

839-
whenProfLib $
840+
whenProfLib $ do
840841
Ar.createArLibArchive verbosity lbi profileLibFilePath profObjectFiles
841-
842-
whenGHCiLib $ do
843-
(ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi)
844-
Ld.combineObjectFiles verbosity lbi ldProg
845-
ghciLibFilePath ghciObjFiles
842+
whenGHCiLib $ do
843+
(ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi)
844+
Ld.combineObjectFiles verbosity lbi ldProg
845+
ghciProfLibFilePath profObjectFiles
846846

847847
whenSharedLib False $
848848
runGhcProg ghcSharedLinkArgs
@@ -1836,9 +1836,11 @@ installLib verbosity lbi targetDir dynlibTargetDir _builtDir _pkg lib clbi = do
18361836
| l <- getHSLibraryName (componentUnitId clbi):(extraBundledLibs (libBuildInfo lib))
18371837
, f <- "":extraLibFlavours (libBuildInfo lib)
18381838
]
1839-
whenProf $ installOrdinary builtDir targetDir profileLibName
1840-
whenGHCi $ installOrdinary builtDir targetDir ghciLibName
1841-
whenShared $ installShared builtDir dynlibTargetDir sharedLibName
1839+
whenGHCi $ installOrdinary builtDir targetDir ghciLibName
1840+
whenProf $ do
1841+
installOrdinary builtDir targetDir profileLibName
1842+
whenGHCi $ installOrdinary builtDir targetDir ghciProfLibName
1843+
whenShared $ installShared builtDir dynlibTargetDir sharedLibName
18421844

18431845
where
18441846
builtDir = componentBuildDir lbi clbi
@@ -1867,6 +1869,7 @@ installLib verbosity lbi targetDir dynlibTargetDir _builtDir _pkg lib clbi = do
18671869
uid = componentUnitId clbi
18681870
profileLibName = mkProfLibName uid
18691871
ghciLibName = Internal.mkGHCiLibName uid
1872+
ghciProfLibName = Internal.mkGHCiProfLibName uid
18701873
sharedLibName = (mkSharedLibName (hostPlatform lbi) compiler_id) uid
18711874

18721875
hasLib = not $ null (allLibModules lib clbi)

Cabal/Distribution/Simple/GHC/Internal.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ module Distribution.Simple.GHC.Internal (
2222
componentCxxGhcOptions,
2323
componentGhcOptions,
2424
mkGHCiLibName,
25+
mkGHCiProfLibName,
2526
filterGhciFlags,
2627
ghcLookupProperty,
2728
getHaskellObjects,
@@ -420,6 +421,9 @@ filterGhciFlags = filter supported
420421
mkGHCiLibName :: UnitId -> String
421422
mkGHCiLibName lib = getHSLibraryName lib <.> "o"
422423

424+
mkGHCiProfLibName :: UnitId -> String
425+
mkGHCiProfLibName lib = getHSLibraryName lib <.> "p_o"
426+
423427
ghcLookupProperty :: String -> Compiler -> Bool
424428
ghcLookupProperty prop comp =
425429
case Map.lookup prop (compilerProperties comp) of

Cabal/Distribution/Simple/GHCJS.hs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
282282
whenProfLib = when (not forRepl && withProfLib lbi)
283283
whenSharedLib forceShared =
284284
when (not forRepl && (forceShared || withSharedLib lbi))
285-
whenGHCiLib = when (not forRepl && withGHCiLib lbi && withVanillaLib lbi)
285+
whenGHCiLib = when (not forRepl && withGHCiLib lbi)
286286
forRepl = maybe False (const True) mReplFlags
287287
ifReplLib = when forRepl
288288
replFlags = fromMaybe mempty mReplFlags
@@ -435,6 +435,7 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
435435
profileLibFilePath = libTargetDir </> mkProfLibName uid
436436
sharedLibFilePath = libTargetDir </> mkSharedLibName (hostPlatform lbi) compiler_id uid
437437
ghciLibFilePath = libTargetDir </> Internal.mkGHCiLibName uid
438+
ghciProfLibFilePath = libTargetDir </> Internal.mkGHCiProfLibName uid
438439

439440
hObjs <- Internal.getHaskellObjects implInfo lib lbi clbi
440441
libTargetDir objExtension True
@@ -457,9 +458,6 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
457458
profObjectFiles =
458459
hProfObjs
459460
++ map (libTargetDir </>) cProfObjs
460-
ghciObjFiles =
461-
hObjs
462-
++ map (libTargetDir </>) cObjs
463461
dynamicObjectFiles =
464462
hSharedObjs
465463
++ map (libTargetDir </>) cSharedObjs
@@ -483,14 +481,17 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
483481

484482
whenVanillaLib False $ do
485483
Ar.createArLibArchive verbosity lbi vanillaLibFilePath staticObjectFiles
484+
whenGHCiLib $ do
485+
(ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi)
486+
Ld.combineObjectFiles verbosity lbi ldProg
487+
ghciLibFilePath staticObjectFiles
486488

487489
whenProfLib $ do
488490
Ar.createArLibArchive verbosity lbi profileLibFilePath profObjectFiles
489-
490-
whenGHCiLib $ do
491-
(ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi)
492-
Ld.combineObjectFiles verbosity lbi ldProg
493-
ghciLibFilePath ghciObjFiles
491+
whenGHCiLib $ do
492+
(ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi)
493+
Ld.combineObjectFiles verbosity lbi ldProg
494+
ghciProfLibFilePath profObjectFiles
494495

495496
whenSharedLib False $
496497
runGhcjsProg ghcSharedLinkArgs
@@ -713,10 +714,13 @@ installLib verbosity lbi targetDir dynlibTargetDir builtDir _pkg lib clbi = do
713714
whenShared $ copyModuleFiles "dyn_hi"
714715

715716
-- copy the built library files over:
716-
whenVanilla $ installOrdinaryNative builtDir targetDir vanillaLibName
717-
whenProf $ installOrdinaryNative builtDir targetDir profileLibName
718-
whenGHCi $ installOrdinaryNative builtDir targetDir ghciLibName
719-
whenShared $ installSharedNative builtDir dynlibTargetDir sharedLibName
717+
whenVanilla $ do
718+
installOrdinaryNative builtDir targetDir vanillaLibName
719+
whenGHCi $ installOrdinaryNative builtDir targetDir ghciLibName
720+
whenProf $ do
721+
installOrdinaryNative builtDir targetDir profileLibName
722+
whenGHCi $ installOrdinaryNative builtDir targetDir ghciProfLibName
723+
whenShared $ installSharedNative builtDir dynlibTargetDir sharedLibName
720724

721725
where
722726
install isShared isJS srcDir dstDir name = do
@@ -747,6 +751,7 @@ installLib verbosity lbi targetDir dynlibTargetDir builtDir _pkg lib clbi = do
747751
vanillaLibName = mkLibName uid
748752
profileLibName = mkProfLibName uid
749753
ghciLibName = Internal.mkGHCiLibName uid
754+
ghciProfLibName = Internal.mkGHCiProfLibName uid
750755
sharedLibName = (mkSharedLibName (hostPlatform lbi) compiler_id) uid
751756

752757
hasLib = not $ null (allLibModules lib clbi)

0 commit comments

Comments
 (0)