aboutsummaryrefslogtreecommitdiff
path: root/CodeGen.hs
diff options
context:
space:
mode:
Diffstat (limited to 'CodeGen.hs')
-rw-r--r--CodeGen.hs12
1 files changed, 11 insertions, 1 deletions
diff --git a/CodeGen.hs b/CodeGen.hs
index 8d7cb78..9a46af7 100644
--- a/CodeGen.hs
+++ b/CodeGen.hs
@@ -65,7 +65,7 @@ codegen (IRProgram vars funcs) = do
X64.verify x64
varcg <- liftM unlines $ mapM codegenVar vars
x64opt <- x64Optimise x64
- return $ "extern putc, putint, getc, _builtin_malloc\n" ++
+ return $ "extern putc, putint, getc, exit, _builtin_malloc, _builtin_outofbounds\n" ++
"global main\ndefault rel\nsection .text\n" ++
X64.stringify x64opt ++
"\nsection .data\n" ++ varcg
@@ -317,6 +317,8 @@ codegenIns m fullins@(IResize d s) = do
addIns $ mkmov dm (XReg dsz RAX)
else do
addIns $ mkmov dm (X64.xrefSetSize dsz sm)
+codegenIns _ IDebugger = do
+ addIns $ INT3
codegenIns _ INop = return ()
arithTypeToCondCode :: ArithType -> Maybe X64.CondCode
@@ -335,6 +337,10 @@ cmpTypeToCondCode CGt = CCG
cmpTypeToCondCode CLt = CCL
cmpTypeToCondCode CGeq = CCGE
cmpTypeToCondCode CLeq = CCLE
+cmpTypeToCondCode CUGt = CCA
+cmpTypeToCondCode CULt = CCB
+cmpTypeToCondCode CUGeq = CCAE
+cmpTypeToCondCode CULeq = CCBE
arithTypeToIns :: ArithType -> Maybe (XRef -> XRef -> X64.Ins)
arithTypeToIns AAdd = Just $ \a b -> ADD (xref a) (xref b)
@@ -375,6 +381,7 @@ codegenTerm m (IRetr r) = do
addIns $ mkmov (XReg 8 RSP) (XReg 8 RBP)
addIns $ POP (xref $ XReg 8 RBP)
addIns RET
+codegenTerm _ IUnreachable = return ()
codegenTerm _ ITermNone = undefined
@@ -396,6 +403,7 @@ collectTempRefs bbs =
listRefsIns (ICall _ l) = [map LA.Read l]
listRefsIns (ICallr a _ l) = [LA.Write a : map LA.Read l]
listRefsIns (IResize a b) = [[LA.Read b], [LA.Write a]]
+ listRefsIns IDebugger = [[]]
listRefsIns INop = [[]]
listRefsTerm :: IRTerm -> [[LA.Access Ref]]
@@ -403,6 +411,7 @@ collectTempRefs bbs =
listRefsTerm (IJmp _) = [[]]
listRefsTerm IRet = [[]]
listRefsTerm (IRetr a) = [[LA.Read a]]
+ listRefsTerm IUnreachable = []
listRefsTerm ITermNone = undefined
listNextIds :: IRTerm -> [Id]
@@ -410,6 +419,7 @@ collectTempRefs bbs =
listNextIds (IJmp a) = [a]
listNextIds IRet = []
listNextIds (IRetr _) = []
+ listNextIds IUnreachable = []
listNextIds ITermNone = undefined
isTemp :: Ref -> Bool