Commit 6d3fb1b1 authored by ian@well-typed.com's avatar ian@well-typed.com
Browse files

Fix the generation of CallerSaves; fixes #7163

Simon Marlow spotted that we were #include'ing MachRegs.h several times,
but that doesn't work as (a) it uses ifdeffery to avoid being included
multiple times, and (b) even if we work around that, then the #define's
from previous inclusions are still defined when we #include it again.

So we now put the platform code for each platform in a separate .hs file.
parent d4ac7d81
module CallerSaves (callerSaves) where
import CmmExpr
import Platform
-- | Returns 'True' if this global register is stored in a caller-saves
-- machine register.
callerSaves :: Platform -> GlobalReg -> Bool
#define MACHREGS_NO_REGS 0
callerSaves (Platform { platformArch = ArchX86 }) = platformCallerSaves
where
#define MACHREGS_i386 1
#include "../../includes/CallerSaves.part.hs"
#undef MACHREGS_i386
callerSaves (Platform { platformArch = ArchX86_64 }) = platformCallerSaves
where
#define MACHREGS_x86_64 1
#include "../../includes/CallerSaves.part.hs"
#undef MACHREGS_x86_64
callerSaves (Platform { platformArch = ppcArch, platformOS = OSDarwin })
| ppcArch `elem` [ArchPPC, ArchPPC_64] = platformCallerSaves
where
#define MACHREGS_powerpc 1
#define MACHREGS_darwin 1
#include "../../includes/CallerSaves.part.hs"
#undef MACHREGS_powerpc
#undef MACHREGS_darwin
callerSaves (Platform { platformArch = ppcArch })
| ppcArch `elem` [ArchPPC, ArchPPC_64] = platformCallerSaves
where
#define MACHREGS_powerpc 1
#include "../../includes/CallerSaves.part.hs"
#undef MACHREGS_powerpc
callerSaves (Platform { platformArch = ArchSPARC }) = platformCallerSaves
where
#define MACHREGS_sparc 1
#include "../../includes/CallerSaves.part.hs"
#undef MACHREGS_sparc
callerSaves (Platform { platformArch = ArchARM {} }) = platformCallerSaves
where
#define MACHREGS_arm 1
#include "../../includes/CallerSaves.part.hs"
#undef MACHREGS_arm
callerSaves _ = platformCallerSaves
where
#undef MACHREGS_NO_REGS
#define MACHREGS_NO_REGS 1
#include "../../includes/CallerSaves.part.hs"
......@@ -48,7 +48,7 @@ module CgUtils (
#include "../includes/stg/HaskellMachRegs.h"
import BlockId
import CallerSaves
import CodeGen.CallerSaves
import CgMonad
import TyCon
import DataCon
......
module CodeGen.CallerSaves (callerSaves) where
import CmmExpr
import Platform
import qualified CodeGen.Platform.ARM as ARM
import qualified CodeGen.Platform.PPC as PPC
import qualified CodeGen.Platform.PPC_Darwin as PPC_Darwin
import qualified CodeGen.Platform.SPARC as SPARC
import qualified CodeGen.Platform.X86 as X86
import qualified CodeGen.Platform.X86_64 as X86_64
import qualified CodeGen.Platform.NoRegs as NoRegs
-- | Returns 'True' if this global register is stored in a caller-saves
-- machine register.
callerSaves :: Platform -> GlobalReg -> Bool
callerSaves platform
= case platformArch platform of
ArchX86 -> X86.callerSaves
ArchX86_64 -> X86_64.callerSaves
ArchSPARC -> SPARC.callerSaves
ArchARM {} -> ARM.callerSaves
arch
| arch `elem` [ArchPPC, ArchPPC_64] ->
case platformOS platform of
OSDarwin -> PPC_Darwin.callerSaves
_ -> PPC.callerSaves
| otherwise -> NoRegs.callerSaves
module CodeGen.Platform.ARM (callerSaves) where
import CmmExpr
#define MACHREGS_NO_REGS 0
#define MACHREGS_arm 1
#include "../../../../includes/CallerSaves.part.hs"
module CodeGen.Platform.NoRegs (callerSaves) where
import CmmExpr
#define MACHREGS_NO_REGS 1
#include "../../../../includes/CallerSaves.part.hs"
module CodeGen.Platform.PPC (callerSaves) where
import CmmExpr
#define MACHREGS_NO_REGS 0
#define MACHREGS_powerpc 1
#include "../../../../includes/CallerSaves.part.hs"
module CodeGen.Platform.PPC_Darwin (callerSaves) where
import CmmExpr
#define MACHREGS_NO_REGS 0
#define MACHREGS_powerpc 1
#define MACHREGS_darwin 1
#include "../../../../includes/CallerSaves.part.hs"
module CodeGen.Platform.SPARC (callerSaves) where
import CmmExpr
#define MACHREGS_NO_REGS 0
#define MACHREGS_sparc 1
#include "../../../../includes/CallerSaves.part.hs"
module CodeGen.Platform.X86 (callerSaves) where
import CmmExpr
#define MACHREGS_NO_REGS 0
#define MACHREGS_i386 1
#include "../../../../includes/CallerSaves.part.hs"
module CodeGen.Platform.X86_64 (callerSaves) where
import CmmExpr
#define MACHREGS_NO_REGS 0
#define MACHREGS_x86_64 1
#include "../../../../includes/CallerSaves.part.hs"
......@@ -57,7 +57,7 @@ import StgCmmClosure
import Cmm
import BlockId
import MkGraph
import CallerSaves
import CodeGen.CallerSaves
import CLabel
import CmmUtils
......
......@@ -200,7 +200,14 @@ Library
PprCmmDecl
PprCmmExpr
Bitmap
CallerSaves
CodeGen.CallerSaves
CodeGen.Platform.ARM
CodeGen.Platform.NoRegs
CodeGen.Platform.PPC
CodeGen.Platform.PPC_Darwin
CodeGen.Platform.SPARC
CodeGen.Platform.X86
CodeGen.Platform.X86_64
CgBindery
CgCallConv
CgCase
......
#include <stg/MachRegs.h>
platformCallerSaves :: GlobalReg -> Bool
callerSaves :: GlobalReg -> Bool
#ifdef CALLER_SAVES_Base
platformCallerSaves BaseReg = True
callerSaves BaseReg = True
#endif
#ifdef CALLER_SAVES_R1
platformCallerSaves (VanillaReg 1 _) = True
callerSaves (VanillaReg 1 _) = True
#endif
#ifdef CALLER_SAVES_R2
platformCallerSaves (VanillaReg 2 _) = True
callerSaves (VanillaReg 2 _) = True
#endif
#ifdef CALLER_SAVES_R3
platformCallerSaves (VanillaReg 3 _) = True
callerSaves (VanillaReg 3 _) = True
#endif
#ifdef CALLER_SAVES_R4
platformCallerSaves (VanillaReg 4 _) = True
callerSaves (VanillaReg 4 _) = True
#endif
#ifdef CALLER_SAVES_R5
platformCallerSaves (VanillaReg 5 _) = True
callerSaves (VanillaReg 5 _) = True
#endif
#ifdef CALLER_SAVES_R6
platformCallerSaves (VanillaReg 6 _) = True
callerSaves (VanillaReg 6 _) = True
#endif
#ifdef CALLER_SAVES_R7
platformCallerSaves (VanillaReg 7 _) = True
callerSaves (VanillaReg 7 _) = True
#endif
#ifdef CALLER_SAVES_R8
platformCallerSaves (VanillaReg 8 _) = True
callerSaves (VanillaReg 8 _) = True
#endif
#ifdef CALLER_SAVES_R9
platformCallerSaves (VanillaReg 9 _) = True
callerSaves (VanillaReg 9 _) = True
#endif
#ifdef CALLER_SAVES_R10
platformCallerSaves (VanillaReg 10 _) = True
callerSaves (VanillaReg 10 _) = True
#endif
#ifdef CALLER_SAVES_F1
platformCallerSaves (FloatReg 1) = True
callerSaves (FloatReg 1) = True
#endif
#ifdef CALLER_SAVES_F2
platformCallerSaves (FloatReg 2) = True
callerSaves (FloatReg 2) = True
#endif
#ifdef CALLER_SAVES_F3
platformCallerSaves (FloatReg 3) = True
callerSaves (FloatReg 3) = True
#endif
#ifdef CALLER_SAVES_F4
platformCallerSaves (FloatReg 4) = True
callerSaves (FloatReg 4) = True
#endif
#ifdef CALLER_SAVES_D1
platformCallerSaves (DoubleReg 1) = True
callerSaves (DoubleReg 1) = True
#endif
#ifdef CALLER_SAVES_D2
platformCallerSaves (DoubleReg 2) = True
callerSaves (DoubleReg 2) = True
#endif
#ifdef CALLER_SAVES_L1
platformCallerSaves (LongReg 1) = True
callerSaves (LongReg 1) = True
#endif
#ifdef CALLER_SAVES_Sp
platformCallerSaves Sp = True
callerSaves Sp = True
#endif
#ifdef CALLER_SAVES_SpLim
platformCallerSaves SpLim = True
callerSaves SpLim = True
#endif
#ifdef CALLER_SAVES_Hp
platformCallerSaves Hp = True
callerSaves Hp = True
#endif
#ifdef CALLER_SAVES_HpLim
platformCallerSaves HpLim = True
callerSaves HpLim = True
#endif
#ifdef CALLER_SAVES_CCCS
platformCallerSaves CCCS = True
callerSaves CCCS = True
#endif
#ifdef CALLER_SAVES_CurrentTSO
platformCallerSaves CurrentTSO = True
callerSaves CurrentTSO = True
#endif
#ifdef CALLER_SAVES_CurrentNursery
platformCallerSaves CurrentNursery = True
callerSaves CurrentNursery = True
#endif
platformCallerSaves _ = False
callerSaves _ = False
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment