8b8a7f98e6b676db7662c22165f9053ef921f3e6
[ghc-hetmet.git] / compiler / cmm / CLabel.hs
1 {-# OPTIONS -w #-}
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
6 -- for details
7
8 -----------------------------------------------------------------------------
9 --
10 -- Object-file symbols (called CLabel for histerical raisins).
11 --
12 -- (c) The University of Glasgow 2004-2006
13 --
14 -----------------------------------------------------------------------------
15
16 module CLabel (
17         CLabel, -- abstract type
18
19         mkClosureLabel,
20         mkSRTLabel,
21         mkInfoTableLabel,
22         mkEntryLabel,
23         mkSlowEntryLabel,
24         mkConEntryLabel,
25         mkStaticConEntryLabel,
26         mkRednCountsLabel,
27         mkConInfoTableLabel,
28         mkStaticInfoTableLabel,
29         mkLargeSRTLabel,
30         mkApEntryLabel,
31         mkApInfoTableLabel,
32         mkClosureTableLabel,
33
34         mkLocalClosureLabel,
35         mkLocalInfoTableLabel,
36         mkLocalEntryLabel,
37         mkLocalConEntryLabel,
38         mkLocalStaticConEntryLabel,
39         mkLocalConInfoTableLabel,
40         mkLocalStaticInfoTableLabel,
41         mkLocalClosureTableLabel,
42
43         mkReturnPtLabel,
44         mkReturnInfoLabel,
45         mkAltLabel,
46         mkDefaultLabel,
47         mkBitmapLabel,
48         mkStringLitLabel,
49
50         mkAsmTempLabel,
51
52         mkModuleInitLabel,
53         mkPlainModuleInitLabel,
54         mkModuleInitTableLabel,
55
56         mkSplitMarkerLabel,
57         mkDirty_MUT_VAR_Label,
58         mkUpdInfoLabel,
59         mkIndStaticInfoLabel,
60         mkMainCapabilityLabel,
61         mkMAP_FROZEN_infoLabel,
62         mkMAP_DIRTY_infoLabel,
63         mkEMPTY_MVAR_infoLabel,
64
65         mkTopTickyCtrLabel,
66         mkCAFBlackHoleInfoTableLabel,
67         mkRtsPrimOpLabel,
68         mkRtsSlowTickyCtrLabel,
69
70         moduleRegdLabel,
71         moduleRegTableLabel,
72
73         mkSelectorInfoLabel,
74         mkSelectorEntryLabel,
75
76         mkRtsInfoLabel,
77         mkRtsEntryLabel,
78         mkRtsRetInfoLabel,
79         mkRtsRetLabel,
80         mkRtsCodeLabel,
81         mkRtsDataLabel,
82         mkRtsGcPtrLabel,
83
84         mkRtsApFastLabel,
85
86         mkPrimCallLabel,
87
88         mkForeignLabel,
89         addLabelSize,
90         foreignLabelStdcallInfo,
91
92         mkCCLabel, mkCCSLabel,
93
94         DynamicLinkerLabelInfo(..),
95         mkDynamicLinkerLabel,
96         dynamicLinkerLabelInfo,
97         
98         mkPicBaseLabel,
99         mkDeadStripPreventer,
100
101         mkHpcTicksLabel,
102         mkHpcModuleNameLabel,
103
104         hasCAF,
105         infoLblToEntryLbl, entryLblToInfoLbl, cvtToClosureLbl, cvtToSRTLbl,
106         needsCDecl, isAsmTemp, maybeAsmTemp, externallyVisibleCLabel,
107         isMathFun,
108         isCFunctionLabel, isGcPtrLabel, labelDynamic,
109
110         pprCLabel
111     ) where
112
113 #include "HsVersions.h"
114
115 import IdInfo
116 import StaticFlags
117 import BasicTypes
118 import Literal
119 import Packages
120 import DataCon
121 import PackageConfig
122 import Module
123 import Name
124 import Unique
125 import PrimOp
126 import Config
127 import CostCentre
128 import Outputable
129 import FastString
130 import DynFlags
131 import UniqSet
132
133 -- -----------------------------------------------------------------------------
134 -- The CLabel type
135
136 {-
137   | CLabel is an abstract type that supports the following operations:
138
139   - Pretty printing
140
141   - In a C file, does it need to be declared before use?  (i.e. is it
142     guaranteed to be already in scope in the places we need to refer to it?)
143
144   - If it needs to be declared, what type (code or data) should it be
145     declared to have?
146
147   - Is it visible outside this object file or not?
148
149   - Is it "dynamic" (see details below)
150
151   - Eq and Ord, so that we can make sets of CLabels (currently only
152     used in outputting C as far as I can tell, to avoid generating
153     more than one declaration for any given label).
154
155   - Converting an info table label into an entry label.
156 -}
157
158 data CLabel
159   = -- | A label related to the definition of a particular Id or Con in a .hs file.
160     IdLabel                     
161         Name                    
162         CafInfo
163         IdLabelInfo             -- encodes the suffix of the label
164   
165   -- | A label from a .cmm file that is not associated with a .hs level Id.
166   | CmmLabel                    
167         Module                  -- what Cmm source module the label belongs to
168         FastString              -- identifier giving the prefix of the label
169         CmmLabelInfo            -- encodes the suffix of the label
170
171   -- | A label with a baked-in \/ algorithmically generated name that definitely
172   --    comes from the RTS. The code for it must compile into libHSrts.a \/ libHSrts.so
173   --    If it doesn't have an algorithmically generated name then use a CmmLabel 
174   --    instead and give it an appropriate Module argument.
175   | RtsLabel                    
176         RtsLabelInfo
177
178   -- | A 'C' (or otherwise foreign) label
179   | ForeignLabel FastString     
180         (Maybe Int)             -- possible '@n' suffix for stdcall functions
181                                 -- When generating C, the '@n' suffix is omitted, but when
182                                 -- generating assembler we must add it to the label.
183         Bool                    -- True <=> is dynamic
184         FunctionOrData
185
186   -- | A family of labels related to a particular case expression.
187   | CaseLabel                   
188         {-# UNPACK #-} !Unique  -- Unique says which case expression
189         CaseLabelInfo
190
191   | AsmTempLabel 
192         {-# UNPACK #-} !Unique
193
194   | StringLitLabel
195         {-# UNPACK #-} !Unique
196
197   | ModuleInitLabel 
198         Module                  -- the module name
199         String                  -- its "way"
200         -- at some point we might want some kind of version number in
201         -- the module init label, to guard against compiling modules in
202         -- the wrong order.  We can't use the interface file version however,
203         -- because we don't always recompile modules which depend on a module
204         -- whose version has changed.
205
206   | PlainModuleInitLabel        -- without the version & way info
207         Module
208
209   | ModuleInitTableLabel        -- table of imported modules to init
210         Module
211
212   | ModuleRegdLabel
213
214   | CC_Label  CostCentre
215   | CCS_Label CostCentreStack
216
217     
218   -- | These labels are generated and used inside the NCG only. 
219   --    They are special variants of a label used for dynamic linking
220   --    see module PositionIndependentCode for details.
221   | DynamicLinkerLabel DynamicLinkerLabelInfo CLabel
222  
223   -- | This label is generated and used inside the NCG only. 
224   --    It is used as a base for PIC calculations on some platforms.
225   --    It takes the form of a local numeric assembler label '1'; and 
226   --    is pretty-printed as 1b, referring to the previous definition
227   --    of 1: in the assembler source file.
228   | PicBaseLabel                
229  
230   -- | A label before an info table to prevent excessive dead-stripping on darwin
231   | DeadStripPreventer CLabel
232
233
234   -- | Per-module table of tick locations
235   | HpcTicksLabel Module
236
237   -- | Per-module name of the module for Hpc
238   | HpcModuleNameLabel
239
240   -- | Label of an StgLargeSRT
241   | LargeSRTLabel
242         {-# UNPACK #-} !Unique
243
244   -- | A bitmap (function or case return)
245   | LargeBitmapLabel
246         {-# UNPACK #-} !Unique
247
248   deriving (Eq, Ord)
249
250 data IdLabelInfo
251   = Closure             -- ^ Label for closure
252   | SRT                 -- ^ Static reference table
253   | InfoTable           -- ^ Info tables for closures; always read-only
254   | Entry               -- ^ Entry point
255   | Slow                -- ^ Slow entry point
256
257   | RednCounts          -- ^ Label of place to keep Ticky-ticky  info for this Id
258
259   | ConEntry            -- ^ Constructor entry point
260   | ConInfoTable        -- ^ Corresponding info table
261   | StaticConEntry      -- ^ Static constructor entry point
262   | StaticInfoTable     -- ^ Corresponding info table
263
264   | ClosureTable        -- ^ Table of closures for Enum tycons
265
266   deriving (Eq, Ord)
267
268
269 data CaseLabelInfo
270   = CaseReturnPt
271   | CaseReturnInfo
272   | CaseAlt ConTag
273   | CaseDefault
274   deriving (Eq, Ord)
275
276
277 data RtsLabelInfo
278   = RtsSelectorInfoTable Bool{-updatable-} Int{-offset-}  -- ^ Selector thunks
279   | RtsSelectorEntry     Bool{-updatable-} Int{-offset-}
280
281   | RtsApInfoTable       Bool{-updatable-} Int{-arity-}    -- ^ AP thunks
282   | RtsApEntry           Bool{-updatable-} Int{-arity-}
283
284   | RtsPrimOp PrimOp
285   | RtsApFast     FastString    -- ^ _fast versions of generic apply
286   | RtsSlowTickyCtr String
287
288   deriving (Eq, Ord)
289   -- NOTE: Eq on LitString compares the pointer only, so this isn't
290   -- a real equality.
291
292
293 -- | What type of Cmm label we're dealing with.
294 --      Determines the suffix appended to the name when a CLabel.CmmLabel
295 --      is pretty printed.
296 data CmmLabelInfo
297   = CmmInfo                     -- ^ misc rts info tabless,     suffix _info
298   | CmmEntry                    -- ^ misc rts entry points,     suffix _entry
299   | CmmRetInfo                  -- ^ misc rts ret info tables,  suffix _info
300   | CmmRet                      -- ^ misc rts return points,    suffix _ret
301   | CmmData                     -- ^ misc rts data bits, eg CHARLIKE_closure
302   | CmmCode                     -- ^ misc rts code
303   | CmmGcPtr                    -- ^ GcPtrs eg CHARLIKE_closure  
304   deriving (Eq, Ord)
305
306 data DynamicLinkerLabelInfo
307   = CodeStub                    -- MachO: Lfoo$stub, ELF: foo@plt
308   | SymbolPtr                   -- MachO: Lfoo$non_lazy_ptr, Windows: __imp_foo
309   | GotSymbolPtr                -- ELF: foo@got
310   | GotSymbolOffset             -- ELF: foo@gotoff
311   
312   deriving (Eq, Ord)
313  
314
315 -- -----------------------------------------------------------------------------
316 -- Constructing CLabels
317 -- -----------------------------------------------------------------------------
318
319 -- Constructing IdLabels 
320 -- These are always local:
321 mkSRTLabel              name c  = IdLabel name  c SRT
322 mkSlowEntryLabel        name c  = IdLabel name  c Slow
323 mkRednCountsLabel       name c  = IdLabel name  c RednCounts
324
325 -- These have local & (possibly) external variants:
326 mkLocalClosureLabel     name c  = IdLabel name  c Closure
327 mkLocalInfoTableLabel   name c  = IdLabel name  c InfoTable
328 mkLocalEntryLabel       name c  = IdLabel name  c Entry
329 mkLocalClosureTableLabel name c = IdLabel name  c ClosureTable
330
331 mkClosureLabel name         c     = IdLabel name c Closure
332 mkInfoTableLabel name       c     = IdLabel name c InfoTable
333 mkEntryLabel name           c     = IdLabel name c Entry
334 mkClosureTableLabel name    c     = IdLabel name c ClosureTable
335 mkLocalConInfoTableLabel    c con = IdLabel con c ConInfoTable
336 mkLocalConEntryLabel        c con = IdLabel con c ConEntry
337 mkLocalStaticInfoTableLabel c con = IdLabel con c StaticInfoTable
338 mkLocalStaticConEntryLabel  c con = IdLabel con c StaticConEntry
339 mkConInfoTableLabel name    c     = IdLabel    name c ConInfoTable
340 mkStaticInfoTableLabel name c     = IdLabel    name c StaticInfoTable
341
342 mkConEntryLabel name        c     = IdLabel name c ConEntry
343 mkStaticConEntryLabel name  c     = IdLabel name c StaticConEntry
344
345
346 -- Constructing Cmm Labels
347
348 -- | Pretend that wired-in names from the RTS are in a top-level module called RTS, 
349 --      located in the RTS package. It doesn't matter what module they're actually in
350 --      as long as that module is in the correct package.
351 topRtsModule :: Module
352 topRtsModule = mkModule rtsPackageId (mkModuleNameFS (fsLit "RTS"))
353
354 mkSplitMarkerLabel              = CmmLabel topRtsModule (fsLit "__stg_split_marker")    CmmCode
355 mkDirty_MUT_VAR_Label           = CmmLabel topRtsModule (fsLit "dirty_MUT_VAR")         CmmCode
356 mkUpdInfoLabel                  = CmmLabel topRtsModule (fsLit "stg_upd_frame")         CmmInfo
357 mkIndStaticInfoLabel            = CmmLabel topRtsModule (fsLit "stg_IND_STATIC")        CmmInfo
358 mkMainCapabilityLabel           = CmmLabel topRtsModule (fsLit "MainCapability")        CmmData
359 mkMAP_FROZEN_infoLabel          = CmmLabel topRtsModule (fsLit "stg_MUT_ARR_PTRS_FROZEN0") CmmInfo
360 mkMAP_DIRTY_infoLabel           = CmmLabel topRtsModule (fsLit "stg_MUT_ARR_PTRS_DIRTY") CmmInfo
361 mkEMPTY_MVAR_infoLabel          = CmmLabel topRtsModule (fsLit "stg_EMPTY_MVAR")        CmmInfo
362 mkTopTickyCtrLabel              = CmmLabel topRtsModule (fsLit "top_ct")                CmmData
363 mkCAFBlackHoleInfoTableLabel    = CmmLabel topRtsModule (fsLit "stg_CAF_BLACKHOLE")     CmmInfo
364
365 -----
366 mkRtsInfoLabel,   mkRtsEntryLabel, mkRtsRetInfoLabel, mkRtsRetLabel,
367   mkRtsCodeLabel, mkRtsDataLabel,  mkRtsGcPtrLabel
368         :: FastString -> CLabel
369
370 mkRtsInfoLabel      str         = CmmLabel topRtsModule str CmmInfo
371 mkRtsEntryLabel     str         = CmmLabel topRtsModule str CmmEntry
372 mkRtsRetInfoLabel   str         = CmmLabel topRtsModule str CmmRetInfo
373 mkRtsRetLabel       str         = CmmLabel topRtsModule str CmmRet
374 mkRtsCodeLabel      str         = CmmLabel topRtsModule str CmmCode
375 mkRtsDataLabel      str         = CmmLabel topRtsModule str CmmData
376 mkRtsGcPtrLabel     str         = CmmLabel topRtsModule str CmmGcPtr
377
378
379 -- Constructing RtsLabels
380 mkRtsPrimOpLabel primop         = RtsLabel (RtsPrimOp primop)
381
382 mkSelectorInfoLabel  upd off    = RtsLabel (RtsSelectorInfoTable upd off)
383 mkSelectorEntryLabel upd off    = RtsLabel (RtsSelectorEntry     upd off)
384
385 mkApInfoTableLabel   upd off    = RtsLabel (RtsApInfoTable       upd off)
386 mkApEntryLabel       upd off    = RtsLabel (RtsApEntry           upd off)
387
388
389 -- Constructing ForeignLabels
390 -- Primitive / cmm call labels
391 mkPrimCallLabel :: PrimCall -> CLabel
392 mkPrimCallLabel (PrimCall str)  = ForeignLabel str Nothing False IsFunction
393
394 -- Foreign labels
395 mkForeignLabel :: FastString -> Maybe Int -> Bool -> FunctionOrData -> CLabel
396 mkForeignLabel str mb_sz is_dynamic fod
397     = ForeignLabel str mb_sz is_dynamic fod
398
399 addLabelSize :: CLabel -> Int -> CLabel
400 addLabelSize (ForeignLabel str _ is_dynamic fod) sz
401     = ForeignLabel str (Just sz) is_dynamic fod
402 addLabelSize label _
403     = label
404
405 foreignLabelStdcallInfo :: CLabel -> Maybe Int
406 foreignLabelStdcallInfo (ForeignLabel _ info _ _) = info
407 foreignLabelStdcallInfo _lbl = Nothing
408
409
410 -- Constructing Large*Labels
411 mkLargeSRTLabel uniq            = LargeSRTLabel uniq
412 mkBitmapLabel   uniq            = LargeBitmapLabel uniq
413
414
415 -- Constructin CaseLabels
416 mkReturnPtLabel uniq            = CaseLabel uniq CaseReturnPt
417 mkReturnInfoLabel uniq          = CaseLabel uniq CaseReturnInfo
418 mkAltLabel      uniq tag        = CaseLabel uniq (CaseAlt tag)
419 mkDefaultLabel  uniq            = CaseLabel uniq CaseDefault
420
421 -- Constructing Cost Center Labels
422 mkCCLabel           cc          = CC_Label cc
423 mkCCSLabel          ccs         = CCS_Label ccs
424
425 mkRtsApFastLabel str = RtsLabel (RtsApFast str)
426
427 mkRtsSlowTickyCtrLabel :: String -> CLabel
428 mkRtsSlowTickyCtrLabel pat = RtsLabel (RtsSlowTickyCtr pat)
429
430
431 -- Constructing Code Coverage Labels
432 mkHpcTicksLabel                = HpcTicksLabel
433 mkHpcModuleNameLabel           = HpcModuleNameLabel
434
435
436 -- Constructing labels used for dynamic linking
437 mkDynamicLinkerLabel :: DynamicLinkerLabelInfo -> CLabel -> CLabel
438 mkDynamicLinkerLabel            = DynamicLinkerLabel
439
440 dynamicLinkerLabelInfo :: CLabel -> Maybe (DynamicLinkerLabelInfo, CLabel)
441 dynamicLinkerLabelInfo (DynamicLinkerLabel info lbl) = Just (info, lbl)
442 dynamicLinkerLabelInfo _        = Nothing
443     
444 mkPicBaseLabel :: CLabel
445 mkPicBaseLabel                  = PicBaseLabel
446
447
448 -- Constructing miscellaneous other labels
449 mkDeadStripPreventer :: CLabel -> CLabel
450 mkDeadStripPreventer lbl        = DeadStripPreventer lbl
451
452 mkStringLitLabel :: Unique -> CLabel
453 mkStringLitLabel                = StringLitLabel
454
455 mkAsmTempLabel :: Uniquable a => a -> CLabel
456 mkAsmTempLabel a                = AsmTempLabel (getUnique a)
457
458 mkModuleInitLabel :: Module -> String -> CLabel
459 mkModuleInitLabel mod way       = ModuleInitLabel mod way
460
461 mkPlainModuleInitLabel :: Module -> CLabel
462 mkPlainModuleInitLabel mod      = PlainModuleInitLabel mod
463
464 mkModuleInitTableLabel :: Module -> CLabel
465 mkModuleInitTableLabel mod      = ModuleInitTableLabel mod
466
467 moduleRegdLabel                 = ModuleRegdLabel
468 moduleRegTableLabel             = ModuleInitTableLabel  
469
470
471 -- -----------------------------------------------------------------------------
472 -- Converting between info labels and entry/ret labels.
473
474 infoLblToEntryLbl :: CLabel -> CLabel 
475 infoLblToEntryLbl (IdLabel n c InfoTable)       = IdLabel n c Entry
476 infoLblToEntryLbl (IdLabel n c ConInfoTable)    = IdLabel n c ConEntry
477 infoLblToEntryLbl (IdLabel n c StaticInfoTable) = IdLabel n c StaticConEntry
478 infoLblToEntryLbl (CaseLabel n CaseReturnInfo)  = CaseLabel n CaseReturnPt
479 infoLblToEntryLbl (CmmLabel m str CmmInfo)      = CmmLabel m str CmmEntry
480 infoLblToEntryLbl (CmmLabel m str CmmRetInfo)   = CmmLabel m str CmmRet
481 infoLblToEntryLbl _
482         = panic "CLabel.infoLblToEntryLbl"
483
484
485 entryLblToInfoLbl :: CLabel -> CLabel 
486 entryLblToInfoLbl (IdLabel n c Entry)           = IdLabel n c InfoTable
487 entryLblToInfoLbl (IdLabel n c ConEntry)        = IdLabel n c ConInfoTable
488 entryLblToInfoLbl (IdLabel n c StaticConEntry)  = IdLabel n c StaticInfoTable
489 entryLblToInfoLbl (CaseLabel n CaseReturnPt)    = CaseLabel n CaseReturnInfo
490 entryLblToInfoLbl (CmmLabel m str CmmEntry)     = CmmLabel m str CmmInfo
491 entryLblToInfoLbl (CmmLabel m str CmmRet)       = CmmLabel m str CmmRetInfo
492 entryLblToInfoLbl l                             
493         = pprPanic "CLabel.entryLblToInfoLbl" (pprCLabel l)
494
495
496 cvtToClosureLbl   (IdLabel n c InfoTable)       = IdLabel n c Closure
497 cvtToClosureLbl   (IdLabel n c Entry)           = IdLabel n c Closure
498 cvtToClosureLbl   (IdLabel n c ConEntry)        = IdLabel n c Closure
499 cvtToClosureLbl l@(IdLabel n c Closure)         = l
500 cvtToClosureLbl l 
501         = pprPanic "cvtToClosureLbl" (pprCLabel l)
502
503
504 cvtToSRTLbl   (IdLabel n c InfoTable)           = mkSRTLabel n c
505 cvtToSRTLbl   (IdLabel n c Entry)               = mkSRTLabel n c
506 cvtToSRTLbl   (IdLabel n c ConEntry)            = mkSRTLabel n c
507 cvtToSRTLbl l@(IdLabel n c Closure)             = mkSRTLabel n c
508 cvtToSRTLbl l 
509         = pprPanic "cvtToSRTLbl" (pprCLabel l)
510
511
512 -- -----------------------------------------------------------------------------
513 -- Does a CLabel refer to a CAF?
514 hasCAF :: CLabel -> Bool
515 hasCAF (IdLabel _ MayHaveCafRefs _) = True
516 hasCAF _                            = False
517
518
519 -- -----------------------------------------------------------------------------
520 -- Does a CLabel need declaring before use or not?
521 --
522 -- See wiki:Commentary/Compiler/Backends/PprC#Prototypes
523
524 needsCDecl :: CLabel -> Bool
525   -- False <=> it's pre-declared; don't bother
526   -- don't bother declaring SRT & Bitmap labels, we always make sure
527   -- they are defined before use.
528 needsCDecl (IdLabel _ _ SRT)            = False
529 needsCDecl (LargeSRTLabel _)            = False
530 needsCDecl (LargeBitmapLabel _)         = False
531 needsCDecl (IdLabel _ _ _)              = True
532 needsCDecl (CaseLabel _ _)              = True
533 needsCDecl (ModuleInitLabel _ _)        = True
534 needsCDecl (PlainModuleInitLabel _)     = True
535 needsCDecl (ModuleInitTableLabel _)     = True
536 needsCDecl ModuleRegdLabel              = False
537
538 needsCDecl (StringLitLabel _)           = False
539 needsCDecl (AsmTempLabel _)             = False
540 needsCDecl (RtsLabel _)                 = False
541 needsCDecl l@(ForeignLabel _ _ _ _)     = not (isMathFun l)
542 needsCDecl (CC_Label _)                 = True
543 needsCDecl (CCS_Label _)                = True
544 needsCDecl (HpcTicksLabel _)            = True
545 needsCDecl HpcModuleNameLabel           = False
546
547
548 -- | Check whether a label is a local temporary for native code generation
549 isAsmTemp  :: CLabel -> Bool    
550 isAsmTemp (AsmTempLabel _)              = True
551 isAsmTemp _                             = False
552
553
554 -- | If a label is a local temporary used for native code generation
555 --      then return just its unique, otherwise nothing.
556 maybeAsmTemp :: CLabel -> Maybe Unique
557 maybeAsmTemp (AsmTempLabel uq)          = Just uq
558 maybeAsmTemp _                          = Nothing
559
560
561 -- Check whether a label corresponds to a C function that has 
562 --      a prototype in a system header somehere, or is built-in
563 --      to the C compiler. For these labels we abovoid generating our
564 --      own C prototypes.
565 isMathFun :: CLabel -> Bool
566 isMathFun (ForeignLabel fs _ _ _) = fs `elementOfUniqSet` math_funs
567 isMathFun _ = False
568
569 math_funs = mkUniqSet [
570         -- _ISOC99_SOURCE
571         (fsLit "acos"),         (fsLit "acosf"),        (fsLit "acosh"),
572         (fsLit "acoshf"),       (fsLit "acoshl"),       (fsLit "acosl"),
573         (fsLit "asin"),         (fsLit "asinf"),        (fsLit "asinl"),
574         (fsLit "asinh"),        (fsLit "asinhf"),       (fsLit "asinhl"),
575         (fsLit "atan"),         (fsLit "atanf"),        (fsLit "atanl"),
576         (fsLit "atan2"),        (fsLit "atan2f"),       (fsLit "atan2l"),
577         (fsLit "atanh"),        (fsLit "atanhf"),       (fsLit "atanhl"),
578         (fsLit "cbrt"),         (fsLit "cbrtf"),        (fsLit "cbrtl"),
579         (fsLit "ceil"),         (fsLit "ceilf"),        (fsLit "ceill"),
580         (fsLit "copysign"),     (fsLit "copysignf"),    (fsLit "copysignl"),
581         (fsLit "cos"),          (fsLit "cosf"),         (fsLit "cosl"),
582         (fsLit "cosh"),         (fsLit "coshf"),        (fsLit "coshl"),
583         (fsLit "erf"),          (fsLit "erff"),         (fsLit "erfl"),
584         (fsLit "erfc"),         (fsLit "erfcf"),        (fsLit "erfcl"),
585         (fsLit "exp"),          (fsLit "expf"),         (fsLit "expl"),
586         (fsLit "exp2"),         (fsLit "exp2f"),        (fsLit "exp2l"),
587         (fsLit "expm1"),        (fsLit "expm1f"),       (fsLit "expm1l"),
588         (fsLit "fabs"),         (fsLit "fabsf"),        (fsLit "fabsl"),
589         (fsLit "fdim"),         (fsLit "fdimf"),        (fsLit "fdiml"),
590         (fsLit "floor"),        (fsLit "floorf"),       (fsLit "floorl"),
591         (fsLit "fma"),          (fsLit "fmaf"),         (fsLit "fmal"),
592         (fsLit "fmax"),         (fsLit "fmaxf"),        (fsLit "fmaxl"),
593         (fsLit "fmin"),         (fsLit "fminf"),        (fsLit "fminl"),
594         (fsLit "fmod"),         (fsLit "fmodf"),        (fsLit "fmodl"),
595         (fsLit "frexp"),        (fsLit "frexpf"),       (fsLit "frexpl"),
596         (fsLit "hypot"),        (fsLit "hypotf"),       (fsLit "hypotl"),
597         (fsLit "ilogb"),        (fsLit "ilogbf"),       (fsLit "ilogbl"),
598         (fsLit "ldexp"),        (fsLit "ldexpf"),       (fsLit "ldexpl"),
599         (fsLit "lgamma"),       (fsLit "lgammaf"),      (fsLit "lgammal"),
600         (fsLit "llrint"),       (fsLit "llrintf"),      (fsLit "llrintl"),
601         (fsLit "llround"),      (fsLit "llroundf"),     (fsLit "llroundl"),
602         (fsLit "log"),          (fsLit "logf"),         (fsLit "logl"),
603         (fsLit "log10l"),       (fsLit "log10"),        (fsLit "log10f"),
604         (fsLit "log1pl"),       (fsLit "log1p"),        (fsLit "log1pf"),
605         (fsLit "log2"),         (fsLit "log2f"),        (fsLit "log2l"),
606         (fsLit "logb"),         (fsLit "logbf"),        (fsLit "logbl"),
607         (fsLit "lrint"),        (fsLit "lrintf"),       (fsLit "lrintl"),
608         (fsLit "lround"),       (fsLit "lroundf"),      (fsLit "lroundl"),
609         (fsLit "modf"),         (fsLit "modff"),        (fsLit "modfl"),
610         (fsLit "nan"),          (fsLit "nanf"),         (fsLit "nanl"),
611         (fsLit "nearbyint"),    (fsLit "nearbyintf"),   (fsLit "nearbyintl"),
612         (fsLit "nextafter"),    (fsLit "nextafterf"),   (fsLit "nextafterl"),
613         (fsLit "nexttoward"),   (fsLit "nexttowardf"),  (fsLit "nexttowardl"),
614         (fsLit "pow"),          (fsLit "powf"),         (fsLit "powl"),
615         (fsLit "remainder"),    (fsLit "remainderf"),   (fsLit "remainderl"),
616         (fsLit "remquo"),       (fsLit "remquof"),      (fsLit "remquol"),
617         (fsLit "rint"),         (fsLit "rintf"),        (fsLit "rintl"),
618         (fsLit "round"),        (fsLit "roundf"),       (fsLit "roundl"),
619         (fsLit "scalbln"),      (fsLit "scalblnf"),     (fsLit "scalblnl"),
620         (fsLit "scalbn"),       (fsLit "scalbnf"),      (fsLit "scalbnl"),
621         (fsLit "sin"),          (fsLit "sinf"),         (fsLit "sinl"),
622         (fsLit "sinh"),         (fsLit "sinhf"),        (fsLit "sinhl"),
623         (fsLit "sqrt"),         (fsLit "sqrtf"),        (fsLit "sqrtl"),
624         (fsLit "tan"),          (fsLit "tanf"),         (fsLit "tanl"),
625         (fsLit "tanh"),         (fsLit "tanhf"),        (fsLit "tanhl"),
626         (fsLit "tgamma"),       (fsLit "tgammaf"),      (fsLit "tgammal"),
627         (fsLit "trunc"),        (fsLit "truncf"),       (fsLit "truncl"),
628         -- ISO C 99 also defines these function-like macros in math.h:
629         -- fpclassify, isfinite, isinf, isnormal, signbit, isgreater,
630         -- isgreaterequal, isless, islessequal, islessgreater, isunordered
631
632         -- additional symbols from _BSD_SOURCE
633         (fsLit "drem"),         (fsLit "dremf"),        (fsLit "dreml"),
634         (fsLit "finite"),       (fsLit "finitef"),      (fsLit "finitel"),
635         (fsLit "gamma"),        (fsLit "gammaf"),       (fsLit "gammal"),
636         (fsLit "isinf"),        (fsLit "isinff"),       (fsLit "isinfl"),
637         (fsLit "isnan"),        (fsLit "isnanf"),       (fsLit "isnanl"),
638         (fsLit "j0"),           (fsLit "j0f"),          (fsLit "j0l"),
639         (fsLit "j1"),           (fsLit "j1f"),          (fsLit "j1l"),
640         (fsLit "jn"),           (fsLit "jnf"),          (fsLit "jnl"),
641         (fsLit "lgamma_r"),     (fsLit "lgammaf_r"),    (fsLit "lgammal_r"),
642         (fsLit "scalb"),        (fsLit "scalbf"),       (fsLit "scalbl"),
643         (fsLit "significand"),  (fsLit "significandf"), (fsLit "significandl"),
644         (fsLit "y0"),           (fsLit "y0f"),          (fsLit "y0l"),
645         (fsLit "y1"),           (fsLit "y1f"),          (fsLit "y1l"),
646         (fsLit "yn"),           (fsLit "ynf"),          (fsLit "ynl")
647     ]
648
649 -- -----------------------------------------------------------------------------
650 -- Is a CLabel visible outside this object file or not?
651
652 -- From the point of view of the code generator, a name is
653 -- externally visible if it has to be declared as exported
654 -- in the .o file's symbol table; that is, made non-static.
655
656 externallyVisibleCLabel :: CLabel -> Bool -- not C "static"
657 externallyVisibleCLabel (CaseLabel _ _)         = False
658 externallyVisibleCLabel (StringLitLabel _)      = False
659 externallyVisibleCLabel (AsmTempLabel _)        = False
660 externallyVisibleCLabel (ModuleInitLabel _ _)   = True
661 externallyVisibleCLabel (PlainModuleInitLabel _)= True
662 externallyVisibleCLabel (ModuleInitTableLabel _)= False
663 externallyVisibleCLabel ModuleRegdLabel         = False
664 externallyVisibleCLabel (RtsLabel _)            = True
665 externallyVisibleCLabel (CmmLabel _ _ _)        = True
666 externallyVisibleCLabel (ForeignLabel _ _ _ _)  = True
667 externallyVisibleCLabel (IdLabel name _ _)      = isExternalName name
668 externallyVisibleCLabel (CC_Label _)            = True
669 externallyVisibleCLabel (CCS_Label _)           = True
670 externallyVisibleCLabel (DynamicLinkerLabel _ _)  = False
671 externallyVisibleCLabel (HpcTicksLabel _)       = True
672 externallyVisibleCLabel HpcModuleNameLabel      = False
673 externallyVisibleCLabel (LargeBitmapLabel _)    = False
674 externallyVisibleCLabel (LargeSRTLabel _)       = False
675
676 -- -----------------------------------------------------------------------------
677 -- Finding the "type" of a CLabel 
678
679 -- For generating correct types in label declarations:
680
681 data CLabelType
682   = CodeLabel   -- Address of some executable instructions
683   | DataLabel   -- Address of data, not a GC ptr
684   | GcPtrLabel  -- Address of a (presumably static) GC object
685
686 isCFunctionLabel :: CLabel -> Bool
687 isCFunctionLabel lbl = case labelType lbl of
688                         CodeLabel -> True
689                         _other    -> False
690
691 isGcPtrLabel :: CLabel -> Bool
692 isGcPtrLabel lbl = case labelType lbl of
693                         GcPtrLabel -> True
694                         _other     -> False
695
696
697 -- | Work out the general type of data at the address of this label
698 --    whether it be code, data, or static GC object.
699 labelType :: CLabel -> CLabelType
700 labelType (CmmLabel _ _ CmmData)                = DataLabel
701 labelType (CmmLabel _ _ CmmGcPtr)               = GcPtrLabel
702 labelType (CmmLabel _ _ CmmCode)                = CodeLabel
703 labelType (CmmLabel _ _ CmmInfo)                = DataLabel
704 labelType (CmmLabel _ _ CmmEntry)               = CodeLabel
705 labelType (CmmLabel _ _ CmmRetInfo)             = DataLabel
706 labelType (CmmLabel _ _ CmmRet)                 = CodeLabel
707 labelType (RtsLabel (RtsSelectorInfoTable _ _)) = DataLabel
708 labelType (RtsLabel (RtsApInfoTable _ _))       = DataLabel
709 labelType (RtsLabel (RtsApFast _))              = CodeLabel
710 labelType (CaseLabel _ CaseReturnInfo)          = DataLabel
711 labelType (CaseLabel _ _)                       = CodeLabel
712 labelType (ModuleInitLabel _ _)                 = CodeLabel
713 labelType (PlainModuleInitLabel _)              = CodeLabel
714 labelType (ModuleInitTableLabel _)              = DataLabel
715 labelType (LargeSRTLabel _)                     = DataLabel
716 labelType (LargeBitmapLabel _)                  = DataLabel
717 labelType (ForeignLabel _ _ _ IsFunction)       = CodeLabel
718 labelType (IdLabel _ _ info)                    = idInfoLabelType info
719 labelType _                                     = DataLabel
720
721 idInfoLabelType info =
722   case info of
723     InfoTable     -> DataLabel
724     Closure       -> GcPtrLabel
725     ConInfoTable  -> DataLabel
726     StaticInfoTable -> DataLabel
727     ClosureTable  -> DataLabel
728     RednCounts    -> DataLabel
729     _             -> CodeLabel
730
731
732 -- -----------------------------------------------------------------------------
733 -- Does a CLabel need dynamic linkage?
734
735 -- When referring to data in code, we need to know whether
736 -- that data resides in a DLL or not. [Win32 only.]
737 -- @labelDynamic@ returns @True@ if the label is located
738 -- in a DLL, be it a data reference or not.
739
740 labelDynamic :: PackageId -> CLabel -> Bool
741 labelDynamic this_pkg lbl =
742   case lbl of
743    RtsLabel _        -> not opt_Static && (this_pkg /= rtsPackageId) -- i.e., is the RTS in a DLL or not?
744    IdLabel n _ k       -> isDllName this_pkg n
745 #if mingw32_TARGET_OS
746    ForeignLabel _ _ d _ -> d
747 #else
748    -- On Mac OS X and on ELF platforms, false positives are OK,
749    -- so we claim that all foreign imports come from dynamic libraries
750    ForeignLabel _ _ _ _ -> True
751 #endif
752    ModuleInitLabel m _    -> not opt_Static && this_pkg /= (modulePackageId m)
753    PlainModuleInitLabel m -> not opt_Static && this_pkg /= (modulePackageId m)
754    ModuleInitTableLabel m -> not opt_Static && this_pkg /= (modulePackageId m)
755    
756    -- Note that DynamicLinkerLabels do NOT require dynamic linking themselves.
757    _                 -> False
758
759 {-
760 OLD?: These GRAN functions are needed for spitting out GRAN_FETCH() at the
761 right places. It is used to detect when the abstractC statement of an
762 CCodeBlock actually contains the code for a slow entry point.  -- HWL
763
764 We need at least @Eq@ for @CLabels@, because we want to avoid
765 duplicate declarations in generating C (see @labelSeenTE@ in
766 @PprAbsC@).
767 -}
768
769 -----------------------------------------------------------------------------
770 -- Printing out CLabels.
771
772 {-
773 Convention:
774
775       <name>_<type>
776
777 where <name> is <Module>_<name> for external names and <unique> for
778 internal names. <type> is one of the following:
779
780          info                   Info table
781          srt                    Static reference table
782          srtd                   Static reference table descriptor
783          entry                  Entry code (function, closure)
784          slow                   Slow entry code (if any)
785          ret                    Direct return address    
786          vtbl                   Vector table
787          <n>_alt                Case alternative (tag n)
788          dflt                   Default case alternative
789          btm                    Large bitmap vector
790          closure                Static closure
791          con_entry              Dynamic Constructor entry code
792          con_info               Dynamic Constructor info table
793          static_entry           Static Constructor entry code
794          static_info            Static Constructor info table
795          sel_info               Selector info table
796          sel_entry              Selector entry code
797          cc                     Cost centre
798          ccs                    Cost centre stack
799
800 Many of these distinctions are only for documentation reasons.  For
801 example, _ret is only distinguished from _entry to make it easy to
802 tell whether a code fragment is a return point or a closure/function
803 entry.
804 -}
805
806 instance Outputable CLabel where
807   ppr = pprCLabel
808
809 pprCLabel :: CLabel -> SDoc
810
811 #if ! OMIT_NATIVE_CODEGEN
812 pprCLabel (AsmTempLabel u)
813   =  getPprStyle $ \ sty ->
814      if asmStyle sty then 
815         ptext asmTempLabelPrefix <> pprUnique u
816      else
817         char '_' <> pprUnique u
818
819 pprCLabel (DynamicLinkerLabel info lbl)
820    = pprDynamicLinkerAsmLabel info lbl
821    
822 pprCLabel PicBaseLabel
823    = ptext (sLit "1b")
824    
825 pprCLabel (DeadStripPreventer lbl)
826    = pprCLabel lbl <> ptext (sLit "_dsp")
827 #endif
828
829 pprCLabel lbl = 
830 #if ! OMIT_NATIVE_CODEGEN
831     getPprStyle $ \ sty ->
832     if asmStyle sty then 
833         maybe_underscore (pprAsmCLbl lbl)
834     else
835 #endif
836        pprCLbl lbl
837
838 maybe_underscore doc
839   | underscorePrefix = pp_cSEP <> doc
840   | otherwise        = doc
841
842 #ifdef mingw32_TARGET_OS
843 -- In asm mode, we need to put the suffix on a stdcall ForeignLabel.
844 -- (The C compiler does this itself).
845 pprAsmCLbl (ForeignLabel fs (Just sz) _ _)
846    = ftext fs <> char '@' <> int sz
847 #endif
848 pprAsmCLbl lbl
849    = pprCLbl lbl
850
851 pprCLbl (StringLitLabel u)
852   = pprUnique u <> ptext (sLit "_str")
853
854 pprCLbl (CaseLabel u CaseReturnPt)
855   = hcat [pprUnique u, ptext (sLit "_ret")]
856 pprCLbl (CaseLabel u CaseReturnInfo)
857   = hcat [pprUnique u, ptext (sLit "_info")]
858 pprCLbl (CaseLabel u (CaseAlt tag))
859   = hcat [pprUnique u, pp_cSEP, int tag, ptext (sLit "_alt")]
860 pprCLbl (CaseLabel u CaseDefault)
861   = hcat [pprUnique u, ptext (sLit "_dflt")]
862
863 pprCLbl (LargeSRTLabel u)  = pprUnique u <> pp_cSEP <> ptext (sLit "srtd")
864 pprCLbl (LargeBitmapLabel u)  = text "b" <> pprUnique u <> pp_cSEP <> ptext (sLit "btm")
865 -- Some bitsmaps for tuple constructors have a numeric tag (e.g. '7')
866 -- until that gets resolved we'll just force them to start
867 -- with a letter so the label will be legal assmbly code.
868         
869
870 pprCLbl (CmmLabel _ str CmmCode)        = ftext str
871 pprCLbl (CmmLabel _ str CmmData)        = ftext str
872 pprCLbl (CmmLabel _ str CmmGcPtr)       = ftext str
873
874 pprCLbl (RtsLabel (RtsApFast str))   = ftext str <> ptext (sLit "_fast")
875
876 pprCLbl (RtsLabel (RtsSelectorInfoTable upd_reqd offset))
877   = hcat [ptext (sLit "stg_sel_"), text (show offset),
878                 ptext (if upd_reqd 
879                         then (sLit "_upd_info") 
880                         else (sLit "_noupd_info"))
881         ]
882
883 pprCLbl (RtsLabel (RtsSelectorEntry upd_reqd offset))
884   = hcat [ptext (sLit "stg_sel_"), text (show offset),
885                 ptext (if upd_reqd 
886                         then (sLit "_upd_entry") 
887                         else (sLit "_noupd_entry"))
888         ]
889
890 pprCLbl (RtsLabel (RtsApInfoTable upd_reqd arity))
891   = hcat [ptext (sLit "stg_ap_"), text (show arity),
892                 ptext (if upd_reqd 
893                         then (sLit "_upd_info") 
894                         else (sLit "_noupd_info"))
895         ]
896
897 pprCLbl (RtsLabel (RtsApEntry upd_reqd arity))
898   = hcat [ptext (sLit "stg_ap_"), text (show arity),
899                 ptext (if upd_reqd 
900                         then (sLit "_upd_entry") 
901                         else (sLit "_noupd_entry"))
902         ]
903
904 pprCLbl (CmmLabel _ fs CmmInfo)
905   = ftext fs <> ptext (sLit "_info")
906
907 pprCLbl (CmmLabel _ fs CmmEntry)
908   = ftext fs <> ptext (sLit "_entry")
909
910 pprCLbl (CmmLabel _ fs CmmRetInfo)
911   = ftext fs <> ptext (sLit "_info")
912
913 pprCLbl (CmmLabel _ fs CmmRet)
914   = ftext fs <> ptext (sLit "_ret")
915
916 pprCLbl (RtsLabel (RtsPrimOp primop)) 
917   = ptext (sLit "stg_") <> ppr primop
918
919 pprCLbl (RtsLabel (RtsSlowTickyCtr pat)) 
920   = ptext (sLit "SLOW_CALL_") <> text pat <> ptext (sLit "_ctr")
921
922 pprCLbl ModuleRegdLabel
923   = ptext (sLit "_module_registered")
924
925 pprCLbl (ForeignLabel str _ _ _)
926   = ftext str
927
928 pprCLbl (IdLabel name cafs flavor) = ppr name <> ppIdFlavor flavor
929
930 pprCLbl (CC_Label cc)           = ppr cc
931 pprCLbl (CCS_Label ccs)         = ppr ccs
932
933 pprCLbl (ModuleInitLabel mod way)
934    = ptext (sLit "__stginit_") <> ppr mod
935         <> char '_' <> text way
936
937 pprCLbl (PlainModuleInitLabel mod)
938    = ptext (sLit "__stginit_") <> ppr mod
939
940 pprCLbl (ModuleInitTableLabel mod)
941    = ptext (sLit "__stginittable_") <> ppr mod
942
943 pprCLbl (HpcTicksLabel mod)
944   = ptext (sLit "_hpc_tickboxes_")  <> ppr mod <> ptext (sLit "_hpc")
945
946 pprCLbl HpcModuleNameLabel
947   = ptext (sLit "_hpc_module_name_str")
948
949 ppIdFlavor :: IdLabelInfo -> SDoc
950 ppIdFlavor x = pp_cSEP <>
951                (case x of
952                        Closure          -> ptext (sLit "closure")
953                        SRT              -> ptext (sLit "srt")
954                        InfoTable        -> ptext (sLit "info")
955                        Entry            -> ptext (sLit "entry")
956                        Slow             -> ptext (sLit "slow")
957                        RednCounts       -> ptext (sLit "ct")
958                        ConEntry         -> ptext (sLit "con_entry")
959                        ConInfoTable     -> ptext (sLit "con_info")
960                        StaticConEntry   -> ptext (sLit "static_entry")
961                        StaticInfoTable  -> ptext (sLit "static_info")
962                        ClosureTable     -> ptext (sLit "closure_tbl")
963                       )
964
965
966 pp_cSEP = char '_'
967
968 -- -----------------------------------------------------------------------------
969 -- Machine-dependent knowledge about labels.
970
971 underscorePrefix :: Bool   -- leading underscore on assembler labels?
972 underscorePrefix = (cLeadingUnderscore == "YES")
973
974 asmTempLabelPrefix :: LitString  -- for formatting labels
975 asmTempLabelPrefix =
976 #if alpha_TARGET_OS
977      {- The alpha assembler likes temporary labels to look like $L123
978         instead of L123.  (Don't toss the L, because then Lf28
979         turns into $f28.)
980      -}
981      (sLit "$")
982 #elif darwin_TARGET_OS
983      (sLit "L")
984 #else
985      (sLit ".L")
986 #endif
987
988 pprDynamicLinkerAsmLabel :: DynamicLinkerLabelInfo -> CLabel -> SDoc
989
990 #if x86_64_TARGET_ARCH && darwin_TARGET_OS
991 pprDynamicLinkerAsmLabel CodeStub lbl
992   = char 'L' <> pprCLabel lbl <> text "$stub"
993 pprDynamicLinkerAsmLabel SymbolPtr lbl
994   = char 'L' <> pprCLabel lbl <> text "$non_lazy_ptr"
995 pprDynamicLinkerAsmLabel GotSymbolPtr lbl
996   = pprCLabel lbl <> text "@GOTPCREL"
997 pprDynamicLinkerAsmLabel GotSymbolOffset lbl
998   = pprCLabel lbl
999 pprDynamicLinkerAsmLabel _ _
1000   = panic "pprDynamicLinkerAsmLabel"
1001
1002 #elif darwin_TARGET_OS
1003 pprDynamicLinkerAsmLabel CodeStub lbl
1004   = char 'L' <> pprCLabel lbl <> text "$stub"
1005 pprDynamicLinkerAsmLabel SymbolPtr lbl
1006   = char 'L' <> pprCLabel lbl <> text "$non_lazy_ptr"
1007 pprDynamicLinkerAsmLabel _ _
1008   = panic "pprDynamicLinkerAsmLabel"
1009
1010 #elif powerpc_TARGET_ARCH && linux_TARGET_OS
1011 pprDynamicLinkerAsmLabel CodeStub lbl
1012   = pprCLabel lbl <> text "@plt"
1013 pprDynamicLinkerAsmLabel SymbolPtr lbl
1014   = text ".LC_" <> pprCLabel lbl
1015 pprDynamicLinkerAsmLabel _ _
1016   = panic "pprDynamicLinkerAsmLabel"
1017
1018 #elif x86_64_TARGET_ARCH && linux_TARGET_OS
1019 pprDynamicLinkerAsmLabel CodeStub lbl
1020   = pprCLabel lbl <> text "@plt"
1021 pprDynamicLinkerAsmLabel GotSymbolPtr lbl
1022   = pprCLabel lbl <> text "@gotpcrel"
1023 pprDynamicLinkerAsmLabel GotSymbolOffset lbl
1024   = pprCLabel lbl
1025 pprDynamicLinkerAsmLabel SymbolPtr lbl
1026   = text ".LC_" <> pprCLabel lbl
1027
1028 #elif linux_TARGET_OS
1029 pprDynamicLinkerAsmLabel CodeStub lbl
1030   = pprCLabel lbl <> text "@plt"
1031 pprDynamicLinkerAsmLabel SymbolPtr lbl
1032   = text ".LC_" <> pprCLabel lbl
1033 pprDynamicLinkerAsmLabel GotSymbolPtr lbl
1034   = pprCLabel lbl <> text "@got"
1035 pprDynamicLinkerAsmLabel GotSymbolOffset lbl
1036   = pprCLabel lbl <> text "@gotoff"
1037
1038 #elif mingw32_TARGET_OS
1039 pprDynamicLinkerAsmLabel SymbolPtr lbl
1040   = text "__imp_" <> pprCLabel lbl
1041 pprDynamicLinkerAsmLabel _ _
1042   = panic "pprDynamicLinkerAsmLabel"
1043
1044 #else
1045 pprDynamicLinkerAsmLabel _ _
1046   = panic "pprDynamicLinkerAsmLabel"
1047 #endif