2 % (c) The AQUA Project, Glasgow University, 1993-1995
5 Machine- and flag- specific bits that the abstract code generator has to know about.
7 No doubt there will be more...
10 #include "HsVersions.h"
13 Target, mkTarget, RegLoc(..),
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,
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(..)
32 import CmdLineOpts ( GlobalSwitch(..), stringSwitchSet, switchIsOn, SwitchResult(..) )
34 import OrdList ( OrdList )
35 import PrimKind ( PrimKind )
36 import SMRep ( SMRep )
40 import Unpretty ( PprStyle, CSeq )
43 data RegLoc = Save (StixTree) | Always (StixTree)
47 Think of this as a big runtime class dictionary
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
67 ([CAddrMode] -> PrimOp -> [CAddrMode] -> SUniqSM StixTreeList)
69 (CStmtMacro -> [CAddrMode] -> SUniqSM StixTreeList)
71 (StixTree -> StixTree -> StixTree -> SUniqSM StixTreeList)
74 (PprStyle -> [[StixTree]] -> SUniqSM Unpretty)
78 (String -> String) -- fmtAsmLbl
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
105 Trees for register save locations
109 saveLoc :: Target -> MagicId -> StixTree
110 saveLoc target reg = case stgReg target reg of {Always loc -> loc; Save loc -> loc}