{-# LANGUAGE MultiParamTypeClasses, TemplateHaskell, QuasiQuotes, FlexibleInstances #-} module LLVM.General.Internal.CallingConvention where import LLVM.General.Internal.Coding import Foreign.C.Types (CUInt(..)) import qualified LLVM.General.Internal.FFI.LLVMCTypes as FFI import LLVM.General.Internal.FFI.LLVMCTypes (callConvP) import qualified LLVM.General.AST.CallingConvention as A.CC instance Monad m => EncodeM m A.CC.CallingConvention FFI.CallConv where encodeM cc = return $ case cc of A.CC.C -> FFI.callConvC A.CC.Fast -> FFI.callConvFast A.CC.Cold -> FFI.callConvCold A.CC.GHC -> FFI.CallConv 10 A.CC.Numbered cc' -> FFI.CallConv (fromIntegral cc') instance Monad m => DecodeM m A.CC.CallingConvention FFI.CallConv where decodeM cc = return $ case cc of [callConvP|C|] -> A.CC.C [callConvP|Fast|] -> A.CC.Fast [callConvP|Cold|] -> A.CC.Cold FFI.CallConv (CUInt 10) -> A.CC.GHC FFI.CallConv (CUInt ci) | ci >= 64 -> A.CC.Numbered (fromIntegral ci)