dynamicLinkerLabelInfo,
mkPicBaseLabel,
+ mkDeadStripPreventer,
infoLblToEntryLbl, entryLblToInfoLbl,
needsCDecl, isAsmTemp, externallyVisibleCLabel,
#include "../includes/ghcconfig.h"
import CmdLineOpts ( DynFlags, opt_Static, opt_DoTickyProfiling )
-import Packages ( isHomeModule )
+import Packages ( isHomeModule, isDllName )
import DataCon ( ConTag )
import Module ( moduleFS, Module )
-import Name ( Name, isExternalName, nameModule )
+import Name ( Name, isExternalName )
import Unique ( pprUnique, Unique )
import PrimOp ( PrimOp )
import Config ( cLeadingUnderscore )
-- assembler label '1'; it is pretty-printed
-- as 1b, referring to the previous definition
-- of 1: in the assembler source file.
+
+ | DeadStripPreventer CLabel
+ -- label before an info table to prevent excessive dead-stripping on darwin
+
deriving (Eq, Ord)
data IdLabelInfo
mkLocalClosureTableLabel name = IdLabel name ClosureTable
mkClosureLabel dflags name
- | opt_Static || isHomeModule dflags mod = IdLabel name Closure
- | otherwise = DynIdLabel name Closure
- where mod = nameModule name
+ | isDllName dflags name = DynIdLabel name Closure
+ | otherwise = IdLabel name Closure
mkInfoTableLabel dflags name
- | opt_Static || isHomeModule dflags mod = IdLabel name InfoTable
- | otherwise = DynIdLabel name InfoTable
- where mod = nameModule name
+ | isDllName dflags name = DynIdLabel name InfoTable
+ | otherwise = IdLabel name InfoTable
mkEntryLabel dflags name
- | opt_Static || isHomeModule dflags mod = IdLabel name Entry
- | otherwise = DynIdLabel name Entry
- where mod = nameModule name
+ | isDllName dflags name = DynIdLabel name Entry
+ | otherwise = IdLabel name Entry
mkClosureTableLabel dflags name
- | opt_Static || isHomeModule dflags mod = IdLabel name ClosureTable
- | otherwise = DynIdLabel name ClosureTable
- where mod = nameModule name
+ | isDllName dflags name = DynIdLabel name ClosureTable
+ | otherwise = IdLabel name ClosureTable
mkLocalConInfoTableLabel con = IdLabel con ConInfoTable
mkLocalConEntryLabel con = IdLabel con ConEntry
mkStaticInfoTableLabel name True = DynIdLabel name StaticInfoTable
mkConEntryLabel dflags name
- | opt_Static || isHomeModule dflags mod = IdLabel name ConEntry
- | otherwise = DynIdLabel name ConEntry
- where mod = nameModule name
+ | isDllName dflags name = DynIdLabel name ConEntry
+ | otherwise = IdLabel name ConEntry
mkStaticConEntryLabel dflags name
- | opt_Static || isHomeModule dflags mod = IdLabel name StaticConEntry
- | otherwise = DynIdLabel name StaticConEntry
- where mod = nameModule name
+ | isDllName dflags name = DynIdLabel name StaticConEntry
+ | otherwise = IdLabel name StaticConEntry
mkReturnPtLabel uniq = CaseLabel uniq CaseReturnPt
mkPicBaseLabel :: CLabel
mkPicBaseLabel = PicBaseLabel
+mkDeadStripPreventer :: CLabel -> CLabel
+mkDeadStripPreventer lbl = DeadStripPreventer lbl
+
-- -----------------------------------------------------------------------------
-- Converting info labels to entry labels.
pprCLabel PicBaseLabel
= ptext SLIT("1b")
+
+pprCLabel (DeadStripPreventer lbl)
+ = pprCLabel lbl <> ptext SLIT("_dsp")
#endif
pprCLabel lbl =