[project @ 1996-01-08 20:28:12 by partain]
[ghc-hetmet.git] / ghc / compiler / nativeGen / MachDesc.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1993-1995
3 %
4
5 Machine- and flag- specific bits that the abstract code generator has to know about.
6
7 No doubt there will be more...
8
9 \begin{code}
10 #include "HsVersions.h"
11
12 module MachDesc (
13         Target, mkTarget, RegLoc(..), 
14
15         saveLoc,
16
17         targetSwitches, fixedHeaderSize, varHeaderSize, stgReg,
18         nativeOpt, sizeof, volatileSaves, volatileRestores, hpRel,
19         amodeToStix, amodeToStix', charLikeClosureSize,
20         intLikeClosureSize, mutHS, dataHS, primToStix, macroCode,
21         heapCheck, codeGen, underscore, fmtAsmLbl,
22
23         -- and, for self-sufficiency...
24         AbstractC, CAddrMode, CExprMacro, CStmtMacro, MagicId,
25         RegRelative, CSeq, BasicLit, CLabel, GlobalSwitch,
26         SwitchResult, HeapOffset, PrimOp, PprStyle,
27         PrimKind, SMRep, StixTree, Unique, SplitUniqSupply,
28         StixTreeList(..), SUniqSM(..), Unpretty(..)
29     ) where
30
31 import AbsCSyn
32 import CmdLineOpts  ( GlobalSwitch(..), stringSwitchSet, switchIsOn, SwitchResult(..) )
33 import Outputable
34 import OrdList      ( OrdList )
35 import PrimKind     ( PrimKind )
36 import SMRep        ( SMRep )
37 import Stix
38 import SplitUniq
39 import Unique
40 import Unpretty     ( PprStyle, CSeq )
41 import Util
42
43 data RegLoc = Save (StixTree) | Always (StixTree)
44
45 \end{code}
46
47 Think of this as a big runtime class dictionary
48
49 \begin{code}
50
51 data Target = Target
52     (GlobalSwitch -> SwitchResult)      -- switches
53     Int                                 -- fixedHeaderSize
54     (SMRep -> Int)                      -- varHeaderSize
55     (MagicId -> RegLoc)                 -- stgReg
56     (StixTree -> StixTree)              -- nativeOpt
57     (PrimKind -> Int)                   -- sizeof
58     ([MagicId] -> [StixTree])           -- volatileSaves
59     ([MagicId] -> [StixTree])           -- volatileRestores
60     (HeapOffset -> Int)                 -- hpRel
61     (CAddrMode -> StixTree)             -- amodeToStix
62     (CAddrMode -> StixTree)             -- amodeToStix'
63     Int                                 -- charLikeClosureSize
64     Int                                 -- intLikeClosureSize
65     StixTree                            -- mutHS
66     StixTree                            -- dataHS
67     ([CAddrMode] -> PrimOp -> [CAddrMode] -> SUniqSM StixTreeList)
68                                         -- primToStix
69     (CStmtMacro -> [CAddrMode] -> SUniqSM StixTreeList)
70                                         -- macroCode
71     (StixTree -> StixTree -> StixTree -> SUniqSM StixTreeList)
72                                         -- heapCheck
73
74     (PprStyle -> [[StixTree]] -> SUniqSM Unpretty)
75                                         -- codeGen
76
77     Bool                                -- underscore
78     (String -> String)                  -- fmtAsmLbl
79
80 mkTarget = Target
81
82 targetSwitches (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = sw
83 fixedHeaderSize (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = fhs
84 varHeaderSize (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = vhs
85 stgReg (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = reg
86 nativeOpt (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = opt
87 sizeof (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = size
88 volatileSaves (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = vsave
89 volatileRestores (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = vrest
90 hpRel (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = hprel
91 amodeToStix (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = am
92 amodeToStix' (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = am'
93 charLikeClosureSize (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = csz
94 intLikeClosureSize (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = isz
95 mutHS (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = mhs
96 dataHS (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = dhs
97 primToStix (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = ps
98 macroCode (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = mc
99 heapCheck (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = hc
100 codeGen (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = cg
101 underscore (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = us
102 fmtAsmLbl (Target sw fhs vhs reg opt size vsave vrest hprel am am' csz isz mhs dhs ps mc hc cg us fmt) = fmt
103 \end{code}
104
105 Trees for register save locations
106
107 \begin{code}
108
109 saveLoc :: Target -> MagicId -> StixTree
110 saveLoc target reg = case stgReg target reg of {Always loc -> loc; Save loc -> loc}
111
112 \end{code}
113