summaryrefslogtreecommitdiff
path: root/compiler/GHC/Cmm/Parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Cmm/Parser.y')
-rw-r--r--compiler/GHC/Cmm/Parser.y55
1 files changed, 33 insertions, 22 deletions
diff --git a/compiler/GHC/Cmm/Parser.y b/compiler/GHC/Cmm/Parser.y
index 35d8e4c40f..6ba2d9df71 100644
--- a/compiler/GHC/Cmm/Parser.y
+++ b/compiler/GHC/Cmm/Parser.y
@@ -375,11 +375,11 @@ import qualified Data.ByteString.Char8 as BS8
'float64' { L _ (CmmT_float64) }
'gcptr' { L _ (CmmT_gcptr) }
- GLOBALREG { L _ (CmmT_GlobalReg $$) }
- NAME { L _ (CmmT_Name $$) }
- STRING { L _ (CmmT_String $$) }
- INT { L _ (CmmT_Int $$) }
- FLOAT { L _ (CmmT_Float $$) }
+ GLOBALREG { L _ (CmmT_GlobalReg $$) }
+ NAME { L _ (CmmT_Name $$) }
+ STRING { L _ (CmmT_String $$) }
+ INT { L _ (CmmT_Int $$) }
+ FLOAT { L _ (CmmT_Float $$) }
%monad { PD } { >>= } { return }
%lexer { cmmlex } { L _ CmmT_EOF }
@@ -714,9 +714,9 @@ stmt :: { CmmParse () }
unwind_regs
:: { CmmParse [(GlobalReg, Maybe CmmExpr)] }
: GLOBALREG '=' expr_or_unknown ',' unwind_regs
- { do e <- $3; rest <- $5; return (($1, e) : rest) }
+ { do e <- $3; rest <- $5; return ((globalRegUseGlobalReg $1, e) : rest) }
| GLOBALREG '=' expr_or_unknown
- { do e <- $3; return [($1, e)] }
+ { do e <- $3; return [(globalRegUseGlobalReg $1, e)] }
-- | A memory ordering
mem_ordering :: { CmmParse MemoryOrdering }
@@ -763,9 +763,9 @@ vols :: { [GlobalReg] }
; return (realArgRegsCover platform) }
-- All of them. See comment attached
-- to realArgRegsCover
- | '[' globals ']' { $2 }
+ | '[' globals ']' { map globalRegUseGlobalReg $2 }
-globals :: { [GlobalReg] }
+globals :: { [GlobalRegUse] }
: GLOBALREG { [$1] }
| GLOBALREG ',' globals { $1 : $3 }
@@ -1177,19 +1177,30 @@ parseCmmHint str = failMsgPD $ \span -> mkPlainErrorMsgEnvelope span $
-- labels are always pointers, so we might as well infer the hint
inferCmmHint :: CmmExpr -> ForeignHint
-inferCmmHint (CmmLit (CmmLabel _)) = AddrHint
-inferCmmHint (CmmReg (CmmGlobal g)) | isPtrGlobalReg g = AddrHint
-inferCmmHint _ = NoHint
-
-isPtrGlobalReg Sp = True
-isPtrGlobalReg SpLim = True
-isPtrGlobalReg Hp = True
-isPtrGlobalReg HpLim = True
-isPtrGlobalReg CCCS = True
-isPtrGlobalReg CurrentTSO = True
-isPtrGlobalReg CurrentNursery = True
-isPtrGlobalReg (VanillaReg _ VGcPtr) = True
-isPtrGlobalReg _ = False
+inferCmmHint (CmmLit (CmmLabel _))
+ = AddrHint
+inferCmmHint (CmmReg (CmmGlobal reg))
+ | isPtrGlobalRegUse reg
+ = AddrHint
+inferCmmHint _
+ = NoHint
+
+isPtrGlobalRegUse :: GlobalRegUse -> Bool
+isPtrGlobalRegUse (GlobalRegUse reg ty)
+ | VanillaReg {} <- reg
+ , isGcPtrType ty
+ = True
+ | otherwise
+ = go reg
+ where
+ go Sp = True
+ go SpLim = True
+ go Hp = True
+ go HpLim = True
+ go CCCS = True
+ go CurrentTSO = True
+ go CurrentNursery = True
+ go _ = False
happyError :: PD a
happyError = PD $ \_ _ s -> unP srcParseFail s