2 -- The above warning supression flag is a temporary kludge.
3 -- While working on this module you are encouraged to remove it and fix
4 -- any warnings in the module. See
5 -- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
8 -----------------------------------------------------------------------------
10 -- Object-file symbols (called CLabel for histerical raisins).
12 -- (c) The University of Glasgow 2004-2006
14 -----------------------------------------------------------------------------
17 CLabel, -- abstract type
18 ForeignLabelSource(..),
27 mkStaticConEntryLabel,
30 mkStaticInfoTableLabel,
37 mkLocalInfoTableLabel,
40 mkLocalStaticConEntryLabel,
41 mkLocalConInfoTableLabel,
42 mkLocalStaticInfoTableLabel,
43 mkLocalClosureTableLabel,
55 mkPlainModuleInitLabel,
56 mkModuleInitTableLabel,
59 mkDirty_MUT_VAR_Label,
63 mkMainCapabilityLabel,
64 mkMAP_FROZEN_infoLabel,
65 mkMAP_DIRTY_infoLabel,
66 mkEMPTY_MVAR_infoLabel,
69 mkCAFBlackHoleInfoTableLabel,
71 mkRtsSlowTickyCtrLabel,
93 foreignLabelStdcallInfo,
95 mkCCLabel, mkCCSLabel,
97 DynamicLinkerLabelInfo(..),
99 dynamicLinkerLabelInfo,
102 mkDeadStripPreventer,
105 mkHpcModuleNameLabel,
108 infoLblToEntryLbl, entryLblToInfoLbl, cvtToClosureLbl, cvtToSRTLbl,
109 needsCDecl, isAsmTemp, maybeAsmTemp, externallyVisibleCLabel,
111 isCFunctionLabel, isGcPtrLabel, labelDynamic,
116 #include "HsVersions.h"
136 -- -----------------------------------------------------------------------------
140 | CLabel is an abstract type that supports the following operations:
144 - In a C file, does it need to be declared before use? (i.e. is it
145 guaranteed to be already in scope in the places we need to refer to it?)
147 - If it needs to be declared, what type (code or data) should it be
150 - Is it visible outside this object file or not?
152 - Is it "dynamic" (see details below)
154 - Eq and Ord, so that we can make sets of CLabels (currently only
155 used in outputting C as far as I can tell, to avoid generating
156 more than one declaration for any given label).
158 - Converting an info table label into an entry label.
162 = -- | A label related to the definition of a particular Id or Con in a .hs file.
166 IdLabelInfo -- encodes the suffix of the label
168 -- | A label from a .cmm file that is not associated with a .hs level Id.
170 PackageId -- what package the label belongs to.
171 FastString -- identifier giving the prefix of the label
172 CmmLabelInfo -- encodes the suffix of the label
174 -- | A label with a baked-in \/ algorithmically generated name that definitely
175 -- comes from the RTS. The code for it must compile into libHSrts.a \/ libHSrts.so
176 -- If it doesn't have an algorithmically generated name then use a CmmLabel
177 -- instead and give it an appropriate PackageId argument.
181 -- | A 'C' (or otherwise foreign) label.
184 FastString -- name of the imported label.
186 (Maybe Int) -- possible '@n' suffix for stdcall functions
187 -- When generating C, the '@n' suffix is omitted, but when
188 -- generating assembler we must add it to the label.
190 ForeignLabelSource -- what package the foreign label is in.
194 -- | A family of labels related to a particular case expression.
196 {-# UNPACK #-} !Unique -- Unique says which case expression
200 {-# UNPACK #-} !Unique
203 {-# UNPACK #-} !Unique
206 Module -- the module name
208 -- at some point we might want some kind of version number in
209 -- the module init label, to guard against compiling modules in
210 -- the wrong order. We can't use the interface file version however,
211 -- because we don't always recompile modules which depend on a module
212 -- whose version has changed.
214 | PlainModuleInitLabel -- without the version & way info
217 | ModuleInitTableLabel -- table of imported modules to init
222 | CC_Label CostCentre
223 | CCS_Label CostCentreStack
226 -- | These labels are generated and used inside the NCG only.
227 -- They are special variants of a label used for dynamic linking
228 -- see module PositionIndependentCode for details.
229 | DynamicLinkerLabel DynamicLinkerLabelInfo CLabel
231 -- | This label is generated and used inside the NCG only.
232 -- It is used as a base for PIC calculations on some platforms.
233 -- It takes the form of a local numeric assembler label '1'; and
234 -- is pretty-printed as 1b, referring to the previous definition
235 -- of 1: in the assembler source file.
238 -- | A label before an info table to prevent excessive dead-stripping on darwin
239 | DeadStripPreventer CLabel
242 -- | Per-module table of tick locations
243 | HpcTicksLabel Module
245 -- | Per-module name of the module for Hpc
248 -- | Label of an StgLargeSRT
250 {-# UNPACK #-} !Unique
252 -- | A bitmap (function or case return)
254 {-# UNPACK #-} !Unique
259 -- | Record where a foreign label is stored.
260 data ForeignLabelSource
262 -- | Label is in a named package
263 = ForeignLabelInPackage PackageId
265 -- | Label is in some external, system package that doesn't also
266 -- contain compiled Haskell code, and is not associated with any .hi files.
267 -- We don't have to worry about Haskell code being inlined from
268 -- external packages. It is safe to treat the RTS package as "external".
269 | ForeignLabelInExternalPackage
271 -- | Label is in the package currenly being compiled.
272 -- This is only used for creating hacky tmp labels during code generation.
273 -- Don't use it in any code that might be inlined across a package boundary
274 -- (ie, core code) else the information will be wrong relative to the
275 -- destination module.
276 | ForeignLabelInThisPackage
281 -- | For debugging problems with the CLabel representation.
282 -- We can't make a Show instance for CLabel because lots of its components don't have instances.
283 -- The regular Outputable instance only shows the label name, and not its other info.
285 pprDebugCLabel :: CLabel -> SDoc
288 IdLabel{} -> ppr lbl <> (parens $ text "IdLabel")
289 CmmLabel pkg name _info
290 -> ppr lbl <> (parens $ text "CmmLabel" <+> ppr pkg)
292 RtsLabel{} -> ppr lbl <> (parens $ text "RtsLabel")
294 ForeignLabel name mSuffix src funOrData
295 -> ppr lbl <> (parens
296 $ text "ForeignLabel"
301 _ -> ppr lbl <> (parens $ text "other CLabel)")
305 = Closure -- ^ Label for closure
306 | SRT -- ^ Static reference table
307 | InfoTable -- ^ Info tables for closures; always read-only
308 | Entry -- ^ Entry point
309 | Slow -- ^ Slow entry point
311 | RednCounts -- ^ Label of place to keep Ticky-ticky info for this Id
313 | ConEntry -- ^ Constructor entry point
314 | ConInfoTable -- ^ Corresponding info table
315 | StaticConEntry -- ^ Static constructor entry point
316 | StaticInfoTable -- ^ Corresponding info table
318 | ClosureTable -- ^ Table of closures for Enum tycons
332 = RtsSelectorInfoTable Bool{-updatable-} Int{-offset-} -- ^ Selector thunks
333 | RtsSelectorEntry Bool{-updatable-} Int{-offset-}
335 | RtsApInfoTable Bool{-updatable-} Int{-arity-} -- ^ AP thunks
336 | RtsApEntry Bool{-updatable-} Int{-arity-}
339 | RtsApFast FastString -- ^ _fast versions of generic apply
340 | RtsSlowTickyCtr String
343 -- NOTE: Eq on LitString compares the pointer only, so this isn't
347 -- | What type of Cmm label we're dealing with.
348 -- Determines the suffix appended to the name when a CLabel.CmmLabel
349 -- is pretty printed.
351 = CmmInfo -- ^ misc rts info tabless, suffix _info
352 | CmmEntry -- ^ misc rts entry points, suffix _entry
353 | CmmRetInfo -- ^ misc rts ret info tables, suffix _info
354 | CmmRet -- ^ misc rts return points, suffix _ret
355 | CmmData -- ^ misc rts data bits, eg CHARLIKE_closure
356 | CmmCode -- ^ misc rts code
357 | CmmGcPtr -- ^ GcPtrs eg CHARLIKE_closure
358 | CmmPrimCall -- ^ a prim call to some hand written Cmm code
361 data DynamicLinkerLabelInfo
362 = CodeStub -- MachO: Lfoo$stub, ELF: foo@plt
363 | SymbolPtr -- MachO: Lfoo$non_lazy_ptr, Windows: __imp_foo
364 | GotSymbolPtr -- ELF: foo@got
365 | GotSymbolOffset -- ELF: foo@gotoff
370 -- -----------------------------------------------------------------------------
371 -- Constructing CLabels
372 -- -----------------------------------------------------------------------------
374 -- Constructing IdLabels
375 -- These are always local:
376 mkSRTLabel name c = IdLabel name c SRT
377 mkSlowEntryLabel name c = IdLabel name c Slow
378 mkRednCountsLabel name c = IdLabel name c RednCounts
380 -- These have local & (possibly) external variants:
381 mkLocalClosureLabel name c = IdLabel name c Closure
382 mkLocalInfoTableLabel name c = IdLabel name c InfoTable
383 mkLocalEntryLabel name c = IdLabel name c Entry
384 mkLocalClosureTableLabel name c = IdLabel name c ClosureTable
386 mkClosureLabel name c = IdLabel name c Closure
387 mkInfoTableLabel name c = IdLabel name c InfoTable
388 mkEntryLabel name c = IdLabel name c Entry
389 mkClosureTableLabel name c = IdLabel name c ClosureTable
390 mkLocalConInfoTableLabel c con = IdLabel con c ConInfoTable
391 mkLocalConEntryLabel c con = IdLabel con c ConEntry
392 mkLocalStaticInfoTableLabel c con = IdLabel con c StaticInfoTable
393 mkLocalStaticConEntryLabel c con = IdLabel con c StaticConEntry
394 mkConInfoTableLabel name c = IdLabel name c ConInfoTable
395 mkStaticInfoTableLabel name c = IdLabel name c StaticInfoTable
397 mkConEntryLabel name c = IdLabel name c ConEntry
398 mkStaticConEntryLabel name c = IdLabel name c StaticConEntry
400 -- Constructing Cmm Labels
401 mkSplitMarkerLabel = CmmLabel rtsPackageId (fsLit "__stg_split_marker") CmmCode
402 mkDirty_MUT_VAR_Label = CmmLabel rtsPackageId (fsLit "dirty_MUT_VAR") CmmCode
403 mkUpdInfoLabel = CmmLabel rtsPackageId (fsLit "stg_upd_frame") CmmInfo
404 mkBHUpdInfoLabel = CmmLabel rtsPackageId (fsLit "stg_bh_upd_frame" ) CmmInfo
405 mkIndStaticInfoLabel = CmmLabel rtsPackageId (fsLit "stg_IND_STATIC") CmmInfo
406 mkMainCapabilityLabel = CmmLabel rtsPackageId (fsLit "MainCapability") CmmData
407 mkMAP_FROZEN_infoLabel = CmmLabel rtsPackageId (fsLit "stg_MUT_ARR_PTRS_FROZEN0") CmmInfo
408 mkMAP_DIRTY_infoLabel = CmmLabel rtsPackageId (fsLit "stg_MUT_ARR_PTRS_DIRTY") CmmInfo
409 mkEMPTY_MVAR_infoLabel = CmmLabel rtsPackageId (fsLit "stg_EMPTY_MVAR") CmmInfo
410 mkTopTickyCtrLabel = CmmLabel rtsPackageId (fsLit "top_ct") CmmData
411 mkCAFBlackHoleInfoTableLabel = CmmLabel rtsPackageId (fsLit "stg_CAF_BLACKHOLE") CmmInfo
414 mkCmmInfoLabel, mkCmmEntryLabel, mkCmmRetInfoLabel, mkCmmRetLabel,
415 mkCmmCodeLabel, mkCmmDataLabel, mkCmmGcPtrLabel
416 :: PackageId -> FastString -> CLabel
418 mkCmmInfoLabel pkg str = CmmLabel pkg str CmmInfo
419 mkCmmEntryLabel pkg str = CmmLabel pkg str CmmEntry
420 mkCmmRetInfoLabel pkg str = CmmLabel pkg str CmmRetInfo
421 mkCmmRetLabel pkg str = CmmLabel pkg str CmmRet
422 mkCmmCodeLabel pkg str = CmmLabel pkg str CmmCode
423 mkCmmDataLabel pkg str = CmmLabel pkg str CmmData
424 mkCmmGcPtrLabel pkg str = CmmLabel pkg str CmmGcPtr
427 -- Constructing RtsLabels
428 mkRtsPrimOpLabel primop = RtsLabel (RtsPrimOp primop)
430 mkSelectorInfoLabel upd off = RtsLabel (RtsSelectorInfoTable upd off)
431 mkSelectorEntryLabel upd off = RtsLabel (RtsSelectorEntry upd off)
433 mkApInfoTableLabel upd off = RtsLabel (RtsApInfoTable upd off)
434 mkApEntryLabel upd off = RtsLabel (RtsApEntry upd off)
437 -- A call to some primitive hand written Cmm code
438 mkPrimCallLabel :: PrimCall -> CLabel
439 mkPrimCallLabel (PrimCall str pkg)
440 = CmmLabel pkg str CmmPrimCall
443 -- Constructing ForeignLabels
445 -- | Make a foreign label
447 :: FastString -- name
448 -> Maybe Int -- size prefix
449 -> ForeignLabelSource -- what package it's in
453 mkForeignLabel str mb_sz src fod
454 = ForeignLabel str mb_sz src fod
457 -- | Update the label size field in a ForeignLabel
458 addLabelSize :: CLabel -> Int -> CLabel
459 addLabelSize (ForeignLabel str _ src fod) sz
460 = ForeignLabel str (Just sz) src fod
464 -- | Get the label size field from a ForeignLabel
465 foreignLabelStdcallInfo :: CLabel -> Maybe Int
466 foreignLabelStdcallInfo (ForeignLabel _ info _ _) = info
467 foreignLabelStdcallInfo _lbl = Nothing
470 -- Constructing Large*Labels
471 mkLargeSRTLabel uniq = LargeSRTLabel uniq
472 mkBitmapLabel uniq = LargeBitmapLabel uniq
475 -- Constructin CaseLabels
476 mkReturnPtLabel uniq = CaseLabel uniq CaseReturnPt
477 mkReturnInfoLabel uniq = CaseLabel uniq CaseReturnInfo
478 mkAltLabel uniq tag = CaseLabel uniq (CaseAlt tag)
479 mkDefaultLabel uniq = CaseLabel uniq CaseDefault
481 -- Constructing Cost Center Labels
482 mkCCLabel cc = CC_Label cc
483 mkCCSLabel ccs = CCS_Label ccs
485 mkRtsApFastLabel str = RtsLabel (RtsApFast str)
487 mkRtsSlowTickyCtrLabel :: String -> CLabel
488 mkRtsSlowTickyCtrLabel pat = RtsLabel (RtsSlowTickyCtr pat)
491 -- Constructing Code Coverage Labels
492 mkHpcTicksLabel = HpcTicksLabel
493 mkHpcModuleNameLabel = HpcModuleNameLabel
496 -- Constructing labels used for dynamic linking
497 mkDynamicLinkerLabel :: DynamicLinkerLabelInfo -> CLabel -> CLabel
498 mkDynamicLinkerLabel = DynamicLinkerLabel
500 dynamicLinkerLabelInfo :: CLabel -> Maybe (DynamicLinkerLabelInfo, CLabel)
501 dynamicLinkerLabelInfo (DynamicLinkerLabel info lbl) = Just (info, lbl)
502 dynamicLinkerLabelInfo _ = Nothing
504 mkPicBaseLabel :: CLabel
505 mkPicBaseLabel = PicBaseLabel
508 -- Constructing miscellaneous other labels
509 mkDeadStripPreventer :: CLabel -> CLabel
510 mkDeadStripPreventer lbl = DeadStripPreventer lbl
512 mkStringLitLabel :: Unique -> CLabel
513 mkStringLitLabel = StringLitLabel
515 mkAsmTempLabel :: Uniquable a => a -> CLabel
516 mkAsmTempLabel a = AsmTempLabel (getUnique a)
518 mkModuleInitLabel :: Module -> String -> CLabel
519 mkModuleInitLabel mod way = ModuleInitLabel mod way
521 mkPlainModuleInitLabel :: Module -> CLabel
522 mkPlainModuleInitLabel mod = PlainModuleInitLabel mod
524 mkModuleInitTableLabel :: Module -> CLabel
525 mkModuleInitTableLabel mod = ModuleInitTableLabel mod
527 moduleRegdLabel = ModuleRegdLabel
528 moduleRegTableLabel = ModuleInitTableLabel
531 -- -----------------------------------------------------------------------------
532 -- Converting between info labels and entry/ret labels.
534 infoLblToEntryLbl :: CLabel -> CLabel
535 infoLblToEntryLbl (IdLabel n c InfoTable) = IdLabel n c Entry
536 infoLblToEntryLbl (IdLabel n c ConInfoTable) = IdLabel n c ConEntry
537 infoLblToEntryLbl (IdLabel n c StaticInfoTable) = IdLabel n c StaticConEntry
538 infoLblToEntryLbl (CaseLabel n CaseReturnInfo) = CaseLabel n CaseReturnPt
539 infoLblToEntryLbl (CmmLabel m str CmmInfo) = CmmLabel m str CmmEntry
540 infoLblToEntryLbl (CmmLabel m str CmmRetInfo) = CmmLabel m str CmmRet
542 = panic "CLabel.infoLblToEntryLbl"
545 entryLblToInfoLbl :: CLabel -> CLabel
546 entryLblToInfoLbl (IdLabel n c Entry) = IdLabel n c InfoTable
547 entryLblToInfoLbl (IdLabel n c ConEntry) = IdLabel n c ConInfoTable
548 entryLblToInfoLbl (IdLabel n c StaticConEntry) = IdLabel n c StaticInfoTable
549 entryLblToInfoLbl (CaseLabel n CaseReturnPt) = CaseLabel n CaseReturnInfo
550 entryLblToInfoLbl (CmmLabel m str CmmEntry) = CmmLabel m str CmmInfo
551 entryLblToInfoLbl (CmmLabel m str CmmRet) = CmmLabel m str CmmRetInfo
553 = pprPanic "CLabel.entryLblToInfoLbl" (pprCLabel l)
556 cvtToClosureLbl (IdLabel n c InfoTable) = IdLabel n c Closure
557 cvtToClosureLbl (IdLabel n c Entry) = IdLabel n c Closure
558 cvtToClosureLbl (IdLabel n c ConEntry) = IdLabel n c Closure
559 cvtToClosureLbl l@(IdLabel n c Closure) = l
561 = pprPanic "cvtToClosureLbl" (pprCLabel l)
564 cvtToSRTLbl (IdLabel n c InfoTable) = mkSRTLabel n c
565 cvtToSRTLbl (IdLabel n c Entry) = mkSRTLabel n c
566 cvtToSRTLbl (IdLabel n c ConEntry) = mkSRTLabel n c
567 cvtToSRTLbl l@(IdLabel n c Closure) = mkSRTLabel n c
569 = pprPanic "cvtToSRTLbl" (pprCLabel l)
572 -- -----------------------------------------------------------------------------
573 -- Does a CLabel refer to a CAF?
574 hasCAF :: CLabel -> Bool
575 hasCAF (IdLabel _ MayHaveCafRefs _) = True
579 -- -----------------------------------------------------------------------------
580 -- Does a CLabel need declaring before use or not?
582 -- See wiki:Commentary/Compiler/Backends/PprC#Prototypes
584 needsCDecl :: CLabel -> Bool
585 -- False <=> it's pre-declared; don't bother
586 -- don't bother declaring SRT & Bitmap labels, we always make sure
587 -- they are defined before use.
588 needsCDecl (IdLabel _ _ SRT) = False
589 needsCDecl (LargeSRTLabel _) = False
590 needsCDecl (LargeBitmapLabel _) = False
591 needsCDecl (IdLabel _ _ _) = True
592 needsCDecl (CaseLabel _ _) = True
593 needsCDecl (ModuleInitLabel _ _) = True
594 needsCDecl (PlainModuleInitLabel _) = True
595 needsCDecl (ModuleInitTableLabel _) = True
596 needsCDecl ModuleRegdLabel = False
598 needsCDecl (StringLitLabel _) = False
599 needsCDecl (AsmTempLabel _) = False
600 needsCDecl (RtsLabel _) = False
602 needsCDecl (CmmLabel pkgId _ _)
603 -- Prototypes for labels defined in the runtime system are imported
604 -- into HC files via includes/Stg.h.
605 | pkgId == rtsPackageId = False
607 -- For other labels we inline one into the HC file directly.
610 needsCDecl l@(ForeignLabel{}) = not (isMathFun l)
611 needsCDecl (CC_Label _) = True
612 needsCDecl (CCS_Label _) = True
613 needsCDecl (HpcTicksLabel _) = True
614 needsCDecl HpcModuleNameLabel = False
617 -- | Check whether a label is a local temporary for native code generation
618 isAsmTemp :: CLabel -> Bool
619 isAsmTemp (AsmTempLabel _) = True
623 -- | If a label is a local temporary used for native code generation
624 -- then return just its unique, otherwise nothing.
625 maybeAsmTemp :: CLabel -> Maybe Unique
626 maybeAsmTemp (AsmTempLabel uq) = Just uq
627 maybeAsmTemp _ = Nothing
630 -- | Check whether a label corresponds to a C function that has
631 -- a prototype in a system header somehere, or is built-in
632 -- to the C compiler. For these labels we abovoid generating our
634 isMathFun :: CLabel -> Bool
635 isMathFun (ForeignLabel fs _ _ _) = fs `elementOfUniqSet` math_funs
638 math_funs = mkUniqSet [
640 (fsLit "acos"), (fsLit "acosf"), (fsLit "acosh"),
641 (fsLit "acoshf"), (fsLit "acoshl"), (fsLit "acosl"),
642 (fsLit "asin"), (fsLit "asinf"), (fsLit "asinl"),
643 (fsLit "asinh"), (fsLit "asinhf"), (fsLit "asinhl"),
644 (fsLit "atan"), (fsLit "atanf"), (fsLit "atanl"),
645 (fsLit "atan2"), (fsLit "atan2f"), (fsLit "atan2l"),
646 (fsLit "atanh"), (fsLit "atanhf"), (fsLit "atanhl"),
647 (fsLit "cbrt"), (fsLit "cbrtf"), (fsLit "cbrtl"),
648 (fsLit "ceil"), (fsLit "ceilf"), (fsLit "ceill"),
649 (fsLit "copysign"), (fsLit "copysignf"), (fsLit "copysignl"),
650 (fsLit "cos"), (fsLit "cosf"), (fsLit "cosl"),
651 (fsLit "cosh"), (fsLit "coshf"), (fsLit "coshl"),
652 (fsLit "erf"), (fsLit "erff"), (fsLit "erfl"),
653 (fsLit "erfc"), (fsLit "erfcf"), (fsLit "erfcl"),
654 (fsLit "exp"), (fsLit "expf"), (fsLit "expl"),
655 (fsLit "exp2"), (fsLit "exp2f"), (fsLit "exp2l"),
656 (fsLit "expm1"), (fsLit "expm1f"), (fsLit "expm1l"),
657 (fsLit "fabs"), (fsLit "fabsf"), (fsLit "fabsl"),
658 (fsLit "fdim"), (fsLit "fdimf"), (fsLit "fdiml"),
659 (fsLit "floor"), (fsLit "floorf"), (fsLit "floorl"),
660 (fsLit "fma"), (fsLit "fmaf"), (fsLit "fmal"),
661 (fsLit "fmax"), (fsLit "fmaxf"), (fsLit "fmaxl"),
662 (fsLit "fmin"), (fsLit "fminf"), (fsLit "fminl"),
663 (fsLit "fmod"), (fsLit "fmodf"), (fsLit "fmodl"),
664 (fsLit "frexp"), (fsLit "frexpf"), (fsLit "frexpl"),
665 (fsLit "hypot"), (fsLit "hypotf"), (fsLit "hypotl"),
666 (fsLit "ilogb"), (fsLit "ilogbf"), (fsLit "ilogbl"),
667 (fsLit "ldexp"), (fsLit "ldexpf"), (fsLit "ldexpl"),
668 (fsLit "lgamma"), (fsLit "lgammaf"), (fsLit "lgammal"),
669 (fsLit "llrint"), (fsLit "llrintf"), (fsLit "llrintl"),
670 (fsLit "llround"), (fsLit "llroundf"), (fsLit "llroundl"),
671 (fsLit "log"), (fsLit "logf"), (fsLit "logl"),
672 (fsLit "log10l"), (fsLit "log10"), (fsLit "log10f"),
673 (fsLit "log1pl"), (fsLit "log1p"), (fsLit "log1pf"),
674 (fsLit "log2"), (fsLit "log2f"), (fsLit "log2l"),
675 (fsLit "logb"), (fsLit "logbf"), (fsLit "logbl"),
676 (fsLit "lrint"), (fsLit "lrintf"), (fsLit "lrintl"),
677 (fsLit "lround"), (fsLit "lroundf"), (fsLit "lroundl"),
678 (fsLit "modf"), (fsLit "modff"), (fsLit "modfl"),
679 (fsLit "nan"), (fsLit "nanf"), (fsLit "nanl"),
680 (fsLit "nearbyint"), (fsLit "nearbyintf"), (fsLit "nearbyintl"),
681 (fsLit "nextafter"), (fsLit "nextafterf"), (fsLit "nextafterl"),
682 (fsLit "nexttoward"), (fsLit "nexttowardf"), (fsLit "nexttowardl"),
683 (fsLit "pow"), (fsLit "powf"), (fsLit "powl"),
684 (fsLit "remainder"), (fsLit "remainderf"), (fsLit "remainderl"),
685 (fsLit "remquo"), (fsLit "remquof"), (fsLit "remquol"),
686 (fsLit "rint"), (fsLit "rintf"), (fsLit "rintl"),
687 (fsLit "round"), (fsLit "roundf"), (fsLit "roundl"),
688 (fsLit "scalbln"), (fsLit "scalblnf"), (fsLit "scalblnl"),
689 (fsLit "scalbn"), (fsLit "scalbnf"), (fsLit "scalbnl"),
690 (fsLit "sin"), (fsLit "sinf"), (fsLit "sinl"),
691 (fsLit "sinh"), (fsLit "sinhf"), (fsLit "sinhl"),
692 (fsLit "sqrt"), (fsLit "sqrtf"), (fsLit "sqrtl"),
693 (fsLit "tan"), (fsLit "tanf"), (fsLit "tanl"),
694 (fsLit "tanh"), (fsLit "tanhf"), (fsLit "tanhl"),
695 (fsLit "tgamma"), (fsLit "tgammaf"), (fsLit "tgammal"),
696 (fsLit "trunc"), (fsLit "truncf"), (fsLit "truncl"),
697 -- ISO C 99 also defines these function-like macros in math.h:
698 -- fpclassify, isfinite, isinf, isnormal, signbit, isgreater,
699 -- isgreaterequal, isless, islessequal, islessgreater, isunordered
701 -- additional symbols from _BSD_SOURCE
702 (fsLit "drem"), (fsLit "dremf"), (fsLit "dreml"),
703 (fsLit "finite"), (fsLit "finitef"), (fsLit "finitel"),
704 (fsLit "gamma"), (fsLit "gammaf"), (fsLit "gammal"),
705 (fsLit "isinf"), (fsLit "isinff"), (fsLit "isinfl"),
706 (fsLit "isnan"), (fsLit "isnanf"), (fsLit "isnanl"),
707 (fsLit "j0"), (fsLit "j0f"), (fsLit "j0l"),
708 (fsLit "j1"), (fsLit "j1f"), (fsLit "j1l"),
709 (fsLit "jn"), (fsLit "jnf"), (fsLit "jnl"),
710 (fsLit "lgamma_r"), (fsLit "lgammaf_r"), (fsLit "lgammal_r"),
711 (fsLit "scalb"), (fsLit "scalbf"), (fsLit "scalbl"),
712 (fsLit "significand"), (fsLit "significandf"), (fsLit "significandl"),
713 (fsLit "y0"), (fsLit "y0f"), (fsLit "y0l"),
714 (fsLit "y1"), (fsLit "y1f"), (fsLit "y1l"),
715 (fsLit "yn"), (fsLit "ynf"), (fsLit "ynl")
718 -- -----------------------------------------------------------------------------
719 -- | Is a CLabel visible outside this object file or not?
720 -- From the point of view of the code generator, a name is
721 -- externally visible if it has to be declared as exported
722 -- in the .o file's symbol table; that is, made non-static.
723 externallyVisibleCLabel :: CLabel -> Bool -- not C "static"
724 externallyVisibleCLabel (CaseLabel _ _) = False
725 externallyVisibleCLabel (StringLitLabel _) = False
726 externallyVisibleCLabel (AsmTempLabel _) = False
727 externallyVisibleCLabel (ModuleInitLabel _ _) = True
728 externallyVisibleCLabel (PlainModuleInitLabel _)= True
729 externallyVisibleCLabel (ModuleInitTableLabel _)= False
730 externallyVisibleCLabel ModuleRegdLabel = False
731 externallyVisibleCLabel (RtsLabel _) = True
732 externallyVisibleCLabel (CmmLabel _ _ _) = True
733 externallyVisibleCLabel (ForeignLabel{}) = True
734 externallyVisibleCLabel (IdLabel name _ _) = isExternalName name
735 externallyVisibleCLabel (CC_Label _) = True
736 externallyVisibleCLabel (CCS_Label _) = True
737 externallyVisibleCLabel (DynamicLinkerLabel _ _) = False
738 externallyVisibleCLabel (HpcTicksLabel _) = True
739 externallyVisibleCLabel HpcModuleNameLabel = False
740 externallyVisibleCLabel (LargeBitmapLabel _) = False
741 externallyVisibleCLabel (LargeSRTLabel _) = False
743 -- -----------------------------------------------------------------------------
744 -- Finding the "type" of a CLabel
746 -- For generating correct types in label declarations:
749 = CodeLabel -- Address of some executable instructions
750 | DataLabel -- Address of data, not a GC ptr
751 | GcPtrLabel -- Address of a (presumably static) GC object
753 isCFunctionLabel :: CLabel -> Bool
754 isCFunctionLabel lbl = case labelType lbl of
758 isGcPtrLabel :: CLabel -> Bool
759 isGcPtrLabel lbl = case labelType lbl of
764 -- | Work out the general type of data at the address of this label
765 -- whether it be code, data, or static GC object.
766 labelType :: CLabel -> CLabelType
767 labelType (CmmLabel _ _ CmmData) = DataLabel
768 labelType (CmmLabel _ _ CmmGcPtr) = GcPtrLabel
769 labelType (CmmLabel _ _ CmmCode) = CodeLabel
770 labelType (CmmLabel _ _ CmmInfo) = DataLabel
771 labelType (CmmLabel _ _ CmmEntry) = CodeLabel
772 labelType (CmmLabel _ _ CmmRetInfo) = DataLabel
773 labelType (CmmLabel _ _ CmmRet) = CodeLabel
774 labelType (RtsLabel (RtsSelectorInfoTable _ _)) = DataLabel
775 labelType (RtsLabel (RtsApInfoTable _ _)) = DataLabel
776 labelType (RtsLabel (RtsApFast _)) = CodeLabel
777 labelType (CaseLabel _ CaseReturnInfo) = DataLabel
778 labelType (CaseLabel _ _) = CodeLabel
779 labelType (ModuleInitLabel _ _) = CodeLabel
780 labelType (PlainModuleInitLabel _) = CodeLabel
781 labelType (ModuleInitTableLabel _) = DataLabel
782 labelType (LargeSRTLabel _) = DataLabel
783 labelType (LargeBitmapLabel _) = DataLabel
784 labelType (ForeignLabel _ _ _ IsFunction) = CodeLabel
785 labelType (IdLabel _ _ info) = idInfoLabelType info
786 labelType _ = DataLabel
788 idInfoLabelType info =
790 InfoTable -> DataLabel
791 Closure -> GcPtrLabel
792 ConInfoTable -> DataLabel
793 StaticInfoTable -> DataLabel
794 ClosureTable -> DataLabel
795 RednCounts -> DataLabel
799 -- -----------------------------------------------------------------------------
800 -- Does a CLabel need dynamic linkage?
802 -- When referring to data in code, we need to know whether
803 -- that data resides in a DLL or not. [Win32 only.]
804 -- @labelDynamic@ returns @True@ if the label is located
805 -- in a DLL, be it a data reference or not.
807 labelDynamic :: PackageId -> CLabel -> Bool
808 labelDynamic this_pkg lbl =
810 -- is the RTS in a DLL or not?
811 RtsLabel _ -> not opt_Static && (this_pkg /= rtsPackageId)
813 IdLabel n _ k -> isDllName this_pkg n
815 #if mingw32_TARGET_OS
816 -- When compiling in the "dyn" way, eack package is to be linked into its own shared library.
818 -> not opt_Static && (this_pkg /= pkg)
820 -- Foreign label is in some un-named foreign package (or DLL)
821 ForeignLabel _ _ ForeignLabelInExternalPackage _ -> True
823 -- Foreign label is linked into the same package as the source file currently being compiled.
824 ForeignLabel _ _ ForeignLabelInThisPackage _ -> False
826 -- Foreign label is in some named package.
827 -- When compiling in the "dyn" way, each package is to be linked into its own DLL.
828 ForeignLabel _ _ (ForeignLabelInPackage pkgId) _
829 -> (not opt_Static) && (this_pkg /= pkgId)
832 -- On Mac OS X and on ELF platforms, false positives are OK,
833 -- so we claim that all foreign imports come from dynamic libraries
834 ForeignLabel _ _ _ _ -> True
836 CmmLabel pkg _ _ -> True
839 ModuleInitLabel m _ -> not opt_Static && this_pkg /= (modulePackageId m)
840 PlainModuleInitLabel m -> not opt_Static && this_pkg /= (modulePackageId m)
841 ModuleInitTableLabel m -> not opt_Static && this_pkg /= (modulePackageId m)
843 -- Note that DynamicLinkerLabels do NOT require dynamic linking themselves.
847 OLD?: These GRAN functions are needed for spitting out GRAN_FETCH() at the
848 right places. It is used to detect when the abstractC statement of an
849 CCodeBlock actually contains the code for a slow entry point. -- HWL
851 We need at least @Eq@ for @CLabels@, because we want to avoid
852 duplicate declarations in generating C (see @labelSeenTE@ in
856 -----------------------------------------------------------------------------
857 -- Printing out CLabels.
864 where <name> is <Module>_<name> for external names and <unique> for
865 internal names. <type> is one of the following:
868 srt Static reference table
869 srtd Static reference table descriptor
870 entry Entry code (function, closure)
871 slow Slow entry code (if any)
872 ret Direct return address
874 <n>_alt Case alternative (tag n)
875 dflt Default case alternative
876 btm Large bitmap vector
877 closure Static closure
878 con_entry Dynamic Constructor entry code
879 con_info Dynamic Constructor info table
880 static_entry Static Constructor entry code
881 static_info Static Constructor info table
882 sel_info Selector info table
883 sel_entry Selector entry code
885 ccs Cost centre stack
887 Many of these distinctions are only for documentation reasons. For
888 example, _ret is only distinguished from _entry to make it easy to
889 tell whether a code fragment is a return point or a closure/function
893 instance Outputable CLabel where
896 pprCLabel :: CLabel -> SDoc
898 #if ! OMIT_NATIVE_CODEGEN
899 pprCLabel (AsmTempLabel u)
900 = getPprStyle $ \ sty ->
902 ptext asmTempLabelPrefix <> pprUnique u
904 char '_' <> pprUnique u
906 pprCLabel (DynamicLinkerLabel info lbl)
907 = pprDynamicLinkerAsmLabel info lbl
909 pprCLabel PicBaseLabel
912 pprCLabel (DeadStripPreventer lbl)
913 = pprCLabel lbl <> ptext (sLit "_dsp")
917 #if ! OMIT_NATIVE_CODEGEN
918 getPprStyle $ \ sty ->
920 maybe_underscore (pprAsmCLbl lbl)
926 | underscorePrefix = pp_cSEP <> doc
929 #ifdef mingw32_TARGET_OS
930 -- In asm mode, we need to put the suffix on a stdcall ForeignLabel.
931 -- (The C compiler does this itself).
932 pprAsmCLbl (ForeignLabel fs (Just sz) _ _)
933 = ftext fs <> char '@' <> int sz
938 pprCLbl (StringLitLabel u)
939 = pprUnique u <> ptext (sLit "_str")
941 pprCLbl (CaseLabel u CaseReturnPt)
942 = hcat [pprUnique u, ptext (sLit "_ret")]
943 pprCLbl (CaseLabel u CaseReturnInfo)
944 = hcat [pprUnique u, ptext (sLit "_info")]
945 pprCLbl (CaseLabel u (CaseAlt tag))
946 = hcat [pprUnique u, pp_cSEP, int tag, ptext (sLit "_alt")]
947 pprCLbl (CaseLabel u CaseDefault)
948 = hcat [pprUnique u, ptext (sLit "_dflt")]
950 pprCLbl (LargeSRTLabel u) = pprUnique u <> pp_cSEP <> ptext (sLit "srtd")
951 pprCLbl (LargeBitmapLabel u) = text "b" <> pprUnique u <> pp_cSEP <> ptext (sLit "btm")
952 -- Some bitsmaps for tuple constructors have a numeric tag (e.g. '7')
953 -- until that gets resolved we'll just force them to start
954 -- with a letter so the label will be legal assmbly code.
957 pprCLbl (CmmLabel _ str CmmCode) = ftext str
958 pprCLbl (CmmLabel _ str CmmData) = ftext str
959 pprCLbl (CmmLabel _ str CmmGcPtr) = ftext str
960 pprCLbl (CmmLabel _ str CmmPrimCall) = ftext str
962 pprCLbl (RtsLabel (RtsApFast str)) = ftext str <> ptext (sLit "_fast")
964 pprCLbl (RtsLabel (RtsSelectorInfoTable upd_reqd offset))
965 = hcat [ptext (sLit "stg_sel_"), text (show offset),
967 then (sLit "_upd_info")
968 else (sLit "_noupd_info"))
971 pprCLbl (RtsLabel (RtsSelectorEntry upd_reqd offset))
972 = hcat [ptext (sLit "stg_sel_"), text (show offset),
974 then (sLit "_upd_entry")
975 else (sLit "_noupd_entry"))
978 pprCLbl (RtsLabel (RtsApInfoTable upd_reqd arity))
979 = hcat [ptext (sLit "stg_ap_"), text (show arity),
981 then (sLit "_upd_info")
982 else (sLit "_noupd_info"))
985 pprCLbl (RtsLabel (RtsApEntry upd_reqd arity))
986 = hcat [ptext (sLit "stg_ap_"), text (show arity),
988 then (sLit "_upd_entry")
989 else (sLit "_noupd_entry"))
992 pprCLbl (CmmLabel _ fs CmmInfo)
993 = ftext fs <> ptext (sLit "_info")
995 pprCLbl (CmmLabel _ fs CmmEntry)
996 = ftext fs <> ptext (sLit "_entry")
998 pprCLbl (CmmLabel _ fs CmmRetInfo)
999 = ftext fs <> ptext (sLit "_info")
1001 pprCLbl (CmmLabel _ fs CmmRet)
1002 = ftext fs <> ptext (sLit "_ret")
1004 pprCLbl (RtsLabel (RtsPrimOp primop))
1005 = ptext (sLit "stg_") <> ppr primop
1007 pprCLbl (RtsLabel (RtsSlowTickyCtr pat))
1008 = ptext (sLit "SLOW_CALL_") <> text pat <> ptext (sLit "_ctr")
1010 pprCLbl ModuleRegdLabel
1011 = ptext (sLit "_module_registered")
1013 pprCLbl (ForeignLabel str _ _ _)
1016 pprCLbl (IdLabel name cafs flavor) = ppr name <> ppIdFlavor flavor
1018 pprCLbl (CC_Label cc) = ppr cc
1019 pprCLbl (CCS_Label ccs) = ppr ccs
1021 pprCLbl (ModuleInitLabel mod way)
1022 = ptext (sLit "__stginit_") <> ppr mod
1023 <> char '_' <> text way
1025 pprCLbl (PlainModuleInitLabel mod)
1026 = ptext (sLit "__stginit_") <> ppr mod
1028 pprCLbl (ModuleInitTableLabel mod)
1029 = ptext (sLit "__stginittable_") <> ppr mod
1031 pprCLbl (HpcTicksLabel mod)
1032 = ptext (sLit "_hpc_tickboxes_") <> ppr mod <> ptext (sLit "_hpc")
1034 pprCLbl HpcModuleNameLabel
1035 = ptext (sLit "_hpc_module_name_str")
1037 ppIdFlavor :: IdLabelInfo -> SDoc
1038 ppIdFlavor x = pp_cSEP <>
1040 Closure -> ptext (sLit "closure")
1041 SRT -> ptext (sLit "srt")
1042 InfoTable -> ptext (sLit "info")
1043 Entry -> ptext (sLit "entry")
1044 Slow -> ptext (sLit "slow")
1045 RednCounts -> ptext (sLit "ct")
1046 ConEntry -> ptext (sLit "con_entry")
1047 ConInfoTable -> ptext (sLit "con_info")
1048 StaticConEntry -> ptext (sLit "static_entry")
1049 StaticInfoTable -> ptext (sLit "static_info")
1050 ClosureTable -> ptext (sLit "closure_tbl")
1057 instance Outputable ForeignLabelSource where
1060 ForeignLabelInPackage pkgId -> parens $ text "package: " <> ppr pkgId
1061 ForeignLabelInThisPackage -> parens $ text "this package"
1062 ForeignLabelInExternalPackage -> parens $ text "external package"
1064 -- -----------------------------------------------------------------------------
1065 -- Machine-dependent knowledge about labels.
1067 underscorePrefix :: Bool -- leading underscore on assembler labels?
1068 underscorePrefix = (cLeadingUnderscore == "YES")
1070 asmTempLabelPrefix :: LitString -- for formatting labels
1071 asmTempLabelPrefix =
1073 {- The alpha assembler likes temporary labels to look like $L123
1074 instead of L123. (Don't toss the L, because then Lf28
1078 #elif darwin_TARGET_OS
1084 pprDynamicLinkerAsmLabel :: DynamicLinkerLabelInfo -> CLabel -> SDoc
1086 #if x86_64_TARGET_ARCH && darwin_TARGET_OS
1087 pprDynamicLinkerAsmLabel CodeStub lbl
1088 = char 'L' <> pprCLabel lbl <> text "$stub"
1089 pprDynamicLinkerAsmLabel SymbolPtr lbl
1090 = char 'L' <> pprCLabel lbl <> text "$non_lazy_ptr"
1091 pprDynamicLinkerAsmLabel GotSymbolPtr lbl
1092 = pprCLabel lbl <> text "@GOTPCREL"
1093 pprDynamicLinkerAsmLabel GotSymbolOffset lbl
1095 pprDynamicLinkerAsmLabel _ _
1096 = panic "pprDynamicLinkerAsmLabel"
1098 #elif darwin_TARGET_OS
1099 pprDynamicLinkerAsmLabel CodeStub lbl
1100 = char 'L' <> pprCLabel lbl <> text "$stub"
1101 pprDynamicLinkerAsmLabel SymbolPtr lbl
1102 = char 'L' <> pprCLabel lbl <> text "$non_lazy_ptr"
1103 pprDynamicLinkerAsmLabel _ _
1104 = panic "pprDynamicLinkerAsmLabel"
1106 #elif powerpc_TARGET_ARCH && elf_OBJ_FORMAT
1107 pprDynamicLinkerAsmLabel CodeStub lbl
1108 = pprCLabel lbl <> text "@plt"
1109 pprDynamicLinkerAsmLabel SymbolPtr lbl
1110 = text ".LC_" <> pprCLabel lbl
1111 pprDynamicLinkerAsmLabel _ _
1112 = panic "pprDynamicLinkerAsmLabel"
1114 #elif x86_64_TARGET_ARCH && elf_OBJ_FORMAT
1115 pprDynamicLinkerAsmLabel CodeStub lbl
1116 = pprCLabel lbl <> text "@plt"
1117 pprDynamicLinkerAsmLabel GotSymbolPtr lbl
1118 = pprCLabel lbl <> text "@gotpcrel"
1119 pprDynamicLinkerAsmLabel GotSymbolOffset lbl
1121 pprDynamicLinkerAsmLabel SymbolPtr lbl
1122 = text ".LC_" <> pprCLabel lbl
1124 #elif elf_OBJ_FORMAT
1125 pprDynamicLinkerAsmLabel CodeStub lbl
1126 = pprCLabel lbl <> text "@plt"
1127 pprDynamicLinkerAsmLabel SymbolPtr lbl
1128 = text ".LC_" <> pprCLabel lbl
1129 pprDynamicLinkerAsmLabel GotSymbolPtr lbl
1130 = pprCLabel lbl <> text "@got"
1131 pprDynamicLinkerAsmLabel GotSymbolOffset lbl
1132 = pprCLabel lbl <> text "@gotoff"
1134 #elif mingw32_TARGET_OS
1135 pprDynamicLinkerAsmLabel SymbolPtr lbl
1136 = text "__imp_" <> pprCLabel lbl
1137 pprDynamicLinkerAsmLabel _ _
1138 = panic "pprDynamicLinkerAsmLabel"
1141 pprDynamicLinkerAsmLabel _ _
1142 = panic "pprDynamicLinkerAsmLabel"