on master help sign in
Fix case on strings and bigints
cca0ac0Benjamin Saunders
src/IRTS/CodegenLLVM.hs+7−16
@@ -87,7 +87,7 @@ mainDef =
87 , G.name = Name "main"
87 , G.name = Name "main"
88 , G.basicBlocks =
88 , G.basicBlocks =
89 [ BasicBlock (UnName 0)
89 [ BasicBlock (UnName 0)
90− [ UnName 1 := idrCall "{runMain0}" [] ]
90+ [ UnName 1 := idrCall "{runMain0}" [] ] -- TODO: Set GMP memory functions
91 (Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [])
91 (Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [])
92 ]}
92 ]}
93
93
@@ -516,26 +516,17 @@ cgConCase con defExp alts = do
516
516
517cgChainCase :: Operand -> Maybe SExp -> [SAlt] -> Codegen (Maybe Operand)
517cgChainCase :: Operand -> Maybe SExp -> [SAlt] -> Codegen (Maybe Operand)
518cgChainCase caseValPtr defExp alts = do
518cgChainCase caseValPtr defExp alts = do
519− (caseTy, comparator, caseVal) <-
519+ let (caseTy, comparator) =
520− case head alts of
520+ case head alts of
521− SConstCase (TT.BI _) _ -> do
521+ SConstCase (TT.BI _) _ -> (FInt ITBig, "__gmpz_cmp")
522− realPtr <- inst $ BitCast caseValPtr (PointerType (primTy mpzTy) (AddrSpace 0)) []
523− valPtr <- inst $ GetElementPtr True realPtr [ ConstantOperand (C.Int 32 0)
524− , ConstantOperand (C.Int 32 1)] []
525− return (mpzTy, "__gmpz_cmp", valPtr)
526− SConstCase (TT.Str _) _ -> do
522+ SConstCase (TT.Str _) _ -> (FString, "strcmp")
527− let caseTy = PointerType (IntegerType 8) (AddrSpace 0)
523+ caseVal <- unbox caseTy caseValPtr
528− realPtr <- inst $ BitCast caseValPtr (PointerType (primTy caseTy) (AddrSpace 0)) []
529− valPtr <- inst $ GetElementPtr True realPtr [ ConstantOperand (C.Int 32 0)
530− , ConstantOperand (C.Int 32 1)] []
531− strPtr <- inst $ Load False valPtr Nothing 0 []
532− return (caseTy, "strcmp", strPtr)
533 defBlockName <- getName "default"
524 defBlockName <- getName "default"
534 exitBlockName <- getName "caseExit"
525 exitBlockName <- getName "caseExit"
535 namedAlts <- mapM (\a -> do n <- nameAlt defBlockName a; return (n, a)) alts
526 namedAlts <- mapM (\a -> do n <- nameAlt defBlockName a; return (n, a)) alts
536 initEnv <- gets lexenv
527 initEnv <- gets lexenv
537 results <- forM namedAlts $ \(name, SConstCase c e) ->
528 results <- forM namedAlts $ \(name, SConstCase c e) ->
538− do const <- cgConst c
529+ do const <- unbox caseTy =<< cgConst c
539 cmp <- inst $ simpleCall comparator [const, caseVal]
530 cmp <- inst $ simpleCall comparator [const, caseVal]
540 cmpResult <- inst $ ICmp IPred.EQ cmp (ConstantOperand (C.Int 32 0)) []
531 cmpResult <- inst $ ICmp IPred.EQ cmp (ConstantOperand (C.Int 32 0)) []
541 elseName <- getName "else"
532 elseName <- getName "else"