summaryrefslogtreecommitdiff
path: root/compiler/GHC/Cmm
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2022-08-18 20:03:15 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2022-10-11 23:45:10 -0400
commit6b0d2022699d3d8b446d024ee837c0d07e2c1aa0 (patch)
tree3981c27bcbfd7ac99eb5c0b46cea5090d8a27ec9 /compiler/GHC/Cmm
parent866c736ef29a07c6f3aa68063ef98ee0ecea12f3 (diff)
downloadhaskell-6b0d2022699d3d8b446d024ee837c0d07e2c1aa0.tar.gz
Refactor IPE initialization
Here we refactor the representation of info table provenance information in object code to significantly reduce its size and link-time impact. Specifically, we deduplicate strings and represent them as 32-bit offsets into a common string table. In addition, we rework the registration logic to eliminate allocation from the registration path, which is run from a static initializer where things like allocation are technically undefined behavior (although it did previously seem to work). For similar reasons we eliminate lock usage from registration path, instead relying on atomic CAS. Closes #22077.
Diffstat (limited to 'compiler/GHC/Cmm')
-rw-r--r--compiler/GHC/Cmm/CLabel.hs8
-rw-r--r--compiler/GHC/Cmm/Parser.y10
2 files changed, 13 insertions, 5 deletions
diff --git a/compiler/GHC/Cmm/CLabel.hs b/compiler/GHC/Cmm/CLabel.hs
index 5f2b0eca59..9edccdccf5 100644
--- a/compiler/GHC/Cmm/CLabel.hs
+++ b/compiler/GHC/Cmm/CLabel.hs
@@ -302,6 +302,7 @@ data ModuleLabelKind
| MLK_InitializerArray
| MLK_Finalizer String
| MLK_FinalizerArray
+ | MLK_IPEBuffer
deriving (Eq, Ord)
instance Outputable ModuleLabelKind where
@@ -309,6 +310,7 @@ instance Outputable ModuleLabelKind where
ppr (MLK_Initializer s) = text ("init__" ++ s)
ppr MLK_FinalizerArray = text "fini_arr"
ppr (MLK_Finalizer s) = text ("fini__" ++ s)
+ ppr MLK_IPEBuffer = text "ipe_buf"
isIdLabel :: CLabel -> Bool
isIdLabel IdLabel{} = True
@@ -839,10 +841,10 @@ instance OutputableP Platform InfoProvEnt where
-- Constructing Cost Center Labels
mkCCLabel :: CostCentre -> CLabel
mkCCSLabel :: CostCentreStack -> CLabel
-mkIPELabel :: InfoProvEnt -> CLabel
+mkIPELabel :: Module -> CLabel
mkCCLabel cc = CC_Label cc
mkCCSLabel ccs = CCS_Label ccs
-mkIPELabel ipe = IPE_Label ipe
+mkIPELabel mod = ModuleLabel mod MLK_IPEBuffer
mkRtsApFastLabel :: FastString -> CLabel
mkRtsApFastLabel str = RtsLabel (RtsApFast (NonDetFastString str))
@@ -1020,6 +1022,7 @@ modLabelNeedsCDecl :: ModuleLabelKind -> Bool
-- Code for finalizers and initializers are emitted in stub objects
modLabelNeedsCDecl (MLK_Initializer _) = True
modLabelNeedsCDecl (MLK_Finalizer _) = True
+modLabelNeedsCDecl MLK_IPEBuffer = True
-- The finalizer and initializer arrays are emitted in the code of the module
modLabelNeedsCDecl MLK_InitializerArray = False
modLabelNeedsCDecl MLK_FinalizerArray = False
@@ -1217,6 +1220,7 @@ moduleLabelKindType kind =
MLK_InitializerArray -> DataLabel
MLK_Finalizer _ -> CodeLabel
MLK_FinalizerArray -> DataLabel
+ MLK_IPEBuffer -> DataLabel
idInfoLabelType :: IdLabelInfo -> CLabelType
idInfoLabelType info =
diff --git a/compiler/GHC/Cmm/Parser.y b/compiler/GHC/Cmm/Parser.y
index ed47fa7a7f..ae6e126b68 100644
--- a/compiler/GHC/Cmm/Parser.y
+++ b/compiler/GHC/Cmm/Parser.y
@@ -224,6 +224,7 @@ import GHC.StgToCmm.Layout hiding (ArgRep(..))
import GHC.StgToCmm.Ticky
import GHC.StgToCmm.Prof
import GHC.StgToCmm.Bind ( emitBlackHoleCode, emitUpdateFrame )
+import GHC.StgToCmm.InfoTableProv
import GHC.Cmm.Opt
import GHC.Cmm.Graph
@@ -1517,9 +1518,12 @@ parseCmmFile cmmpConfig this_mod home_unit filename = do
let fcode = do
((), cmm) <- getCmm $ unEC code "global" (initEnv (pdProfile pdConfig)) [] >> return ()
-- See Note [Mapping Info Tables to Source Positions] (IPE Maps)
- let used_info = map (cmmInfoTableToInfoProvEnt this_mod)
- (mapMaybe topInfoTable cmm)
- ((), cmm2) <- getCmm $ mapM_ emitInfoTableProv used_info
+ let used_info
+ | do_ipe = map (cmmInfoTableToInfoProvEnt this_mod) (mapMaybe topInfoTable cmm)
+ | otherwise = []
+ where
+ do_ipe = stgToCmmInfoTableMap $ cmmpStgToCmmConfig cmmpConfig
+ ((), cmm2) <- getCmm $ emitIpeBufferListNode this_mod used_info
return (cmm ++ cmm2, used_info)
(cmm, _) = runC (cmmpStgToCmmConfig cmmpConfig) fstate st fcode
(warnings,errors) = getPsMessages pst