{-# LANGUAGE
  MultiParamTypeClasses,
  TemplateHaskell,
  QuasiQuotes
  #-}
module LLVM.Internal.CallingConvention where

import LLVM.Prelude

import LLVM.Internal.Coding
import Foreign.C.Types (CUInt(..))

import qualified LLVM.Internal.FFI.LLVMCTypes as FFI
import LLVM.Internal.FFI.LLVMCTypes (callingConventionP)

import qualified LLVM.AST.CallingConvention as A.CC

instance Monad m => EncodeM m A.CC.CallingConvention FFI.CallingConvention where
  encodeM :: HasCallStack => CallingConvention -> m CallingConvention
encodeM CallingConvention
cc = CallingConvention -> m CallingConvention
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (CallingConvention -> m CallingConvention)
-> CallingConvention -> m CallingConvention
forall a b. (a -> b) -> a -> b
$ 
        case CallingConvention
cc of
          CallingConvention
A.CC.C -> CallingConvention
FFI.callingConventionC
          CallingConvention
A.CC.Fast -> CallingConvention
FFI.callingConventionFast
          CallingConvention
A.CC.Cold -> CallingConvention
FFI.callingConventionCold
          CallingConvention
A.CC.GHC -> CallingConvention
FFI.callingConventionGHC
          CallingConvention
A.CC.HiPE -> CallingConvention
FFI.callingConventionHiPE
          CallingConvention
A.CC.WebKit_JS -> CallingConvention
FFI.callingConventionWebKit_JS
          CallingConvention
A.CC.AnyReg -> CallingConvention
FFI.callingConventionAnyReg
          CallingConvention
A.CC.PreserveMost -> CallingConvention
FFI.callingConventionPreserveMost
          CallingConvention
A.CC.PreserveAll -> CallingConvention
FFI.callingConventionPreserveAll
          CallingConvention
A.CC.Swift -> CallingConvention
FFI.callingConventionSwift
          CallingConvention
A.CC.CXX_FastTLS -> CallingConvention
FFI.callingConventionCXX_FAST_TLS
          CallingConvention
A.CC.X86_StdCall -> CallingConvention
FFI.callingConventionX86_StdCall
          CallingConvention
A.CC.X86_FastCall -> CallingConvention
FFI.callingConventionX86_FastCall
          CallingConvention
A.CC.ARM_APCS -> CallingConvention
FFI.callingConventionARM_APCS
          CallingConvention
A.CC.ARM_AAPCS -> CallingConvention
FFI.callingConventionARM_AAPCS
          CallingConvention
A.CC.ARM_AAPCS_VFP -> CallingConvention
FFI.callingConventionARM_AAPCS_VFP
          CallingConvention
A.CC.MSP430_INTR -> CallingConvention
FFI.callingConventionMSP430_INTR
          CallingConvention
A.CC.X86_ThisCall -> CallingConvention
FFI.callingConventionX86_ThisCall
          CallingConvention
A.CC.PTX_Kernel -> CallingConvention
FFI.callingConventionPTX_Kernel
          CallingConvention
A.CC.PTX_Device -> CallingConvention
FFI.callingConventionPTX_Device
          CallingConvention
A.CC.SPIR_FUNC -> CallingConvention
FFI.callingConventionSPIR_FUNC
          CallingConvention
A.CC.SPIR_KERNEL -> CallingConvention
FFI.callingConventionSPIR_KERNEL
          CallingConvention
A.CC.Intel_OCL_BI -> CallingConvention
FFI.callingConventionIntel_OCL_BI
          CallingConvention
A.CC.X86_64_SysV -> CallingConvention
FFI.callingConventionX86_64_SysV
          CallingConvention
A.CC.Win64 -> CallingConvention
FFI.callingConventionWin64
          CallingConvention
A.CC.X86_VectorCall -> CallingConvention
FFI.callingConventionX86_VectorCall
          CallingConvention
A.CC.HHVM -> CallingConvention
FFI.callingConventionHHVM
          CallingConvention
A.CC.HHVM_C -> CallingConvention
FFI.callingConventionHHVM_C
          CallingConvention
A.CC.X86_Intr -> CallingConvention
FFI.callingConventionX86_INTR
          CallingConvention
A.CC.AVR_Intr -> CallingConvention
FFI.callingConventionAVR_INTR
          CallingConvention
A.CC.AVR_Signal -> CallingConvention
FFI.callingConventionAVR_SIGNAL
          CallingConvention
A.CC.AVR_Builtin -> CallingConvention
FFI.callingConventionAVR_BUILTIN
          CallingConvention
A.CC.AMDGPU_VS -> CallingConvention
FFI.callingConventionAMDGPU_VS
          CallingConvention
A.CC.AMDGPU_HS -> CallingConvention
FFI.callingConventionAMDGPU_HS
          CallingConvention
A.CC.AMDGPU_GS -> CallingConvention
FFI.callingConventionAMDGPU_GS
          CallingConvention
A.CC.AMDGPU_PS -> CallingConvention
FFI.callingConventionAMDGPU_PS
          CallingConvention
A.CC.AMDGPU_CS -> CallingConvention
FFI.callingConventionAMDGPU_CS
          CallingConvention
A.CC.AMDGPU_Kernel -> CallingConvention
FFI.callingConventionAMDGPU_KERNEL
          CallingConvention
A.CC.X86_RegCall -> CallingConvention
FFI.callingConventionX86_RegCall
          CallingConvention
A.CC.MSP430_Builtin -> CallingConvention
FFI.callingConventionMSP430_BUILTIN
          A.CC.Numbered Word32
cc' -> CUInt -> CallingConvention
FFI.CallingConvention (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
cc')

instance Monad m => DecodeM m A.CC.CallingConvention FFI.CallingConvention where
  decodeM :: HasCallStack => CallingConvention -> m CallingConvention
decodeM CallingConvention
cc = CallingConvention -> m CallingConvention
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (CallingConvention -> m CallingConvention)
-> CallingConvention -> m CallingConvention
forall a b. (a -> b) -> a -> b
$ case CallingConvention
cc of
    CallingConvention
[callingConventionP|C|] -> CallingConvention
A.CC.C
    CallingConvention
[callingConventionP|Fast|] -> CallingConvention
A.CC.Fast
    CallingConvention
[callingConventionP|Cold|] -> CallingConvention
A.CC.Cold
    CallingConvention
[callingConventionP|GHC|] -> CallingConvention
A.CC.GHC
    CallingConvention
[callingConventionP|HiPE|] -> CallingConvention
A.CC.HiPE
    CallingConvention
[callingConventionP|WebKit_JS|] -> CallingConvention
A.CC.WebKit_JS
    CallingConvention
[callingConventionP|AnyReg|] -> CallingConvention
A.CC.AnyReg
    CallingConvention
[callingConventionP|PreserveMost|] -> CallingConvention
A.CC.PreserveMost
    CallingConvention
[callingConventionP|PreserveAll|] -> CallingConvention
A.CC.PreserveAll
    CallingConvention
[callingConventionP|Swift|] -> CallingConvention
A.CC.Swift
    CallingConvention
[callingConventionP|CXX_FAST_TLS|] -> CallingConvention
A.CC.CXX_FastTLS
    CallingConvention
[callingConventionP|X86_StdCall|] -> CallingConvention
A.CC.X86_StdCall
    CallingConvention
[callingConventionP|X86_FastCall|] -> CallingConvention
A.CC.X86_FastCall
    CallingConvention
[callingConventionP|ARM_APCS|] -> CallingConvention
A.CC.ARM_APCS
    CallingConvention
[callingConventionP|ARM_AAPCS|] -> CallingConvention
A.CC.ARM_AAPCS
    CallingConvention
[callingConventionP|ARM_AAPCS_VFP|] -> CallingConvention
A.CC.ARM_AAPCS_VFP
    CallingConvention
[callingConventionP|MSP430_INTR|] -> CallingConvention
A.CC.MSP430_INTR
    CallingConvention
[callingConventionP|X86_ThisCall|] -> CallingConvention
A.CC.X86_ThisCall
    CallingConvention
[callingConventionP|PTX_Kernel|] -> CallingConvention
A.CC.PTX_Kernel
    CallingConvention
[callingConventionP|PTX_Device|] -> CallingConvention
A.CC.PTX_Device
    CallingConvention
[callingConventionP|SPIR_FUNC|] -> CallingConvention
A.CC.SPIR_FUNC
    CallingConvention
[callingConventionP|SPIR_KERNEL|] -> CallingConvention
A.CC.SPIR_KERNEL
    CallingConvention
[callingConventionP|Intel_OCL_BI|] -> CallingConvention
A.CC.Intel_OCL_BI
    CallingConvention
[callingConventionP|X86_64_SysV|] -> CallingConvention
A.CC.X86_64_SysV
    CallingConvention
[callingConventionP|Win64|] -> CallingConvention
A.CC.Win64
    CallingConvention
[callingConventionP|X86_VectorCall|] -> CallingConvention
A.CC.X86_VectorCall
    CallingConvention
[callingConventionP|HHVM|] -> CallingConvention
A.CC.HHVM
    CallingConvention
[callingConventionP|HHVM_C|] -> CallingConvention
A.CC.HHVM_C
    CallingConvention
[callingConventionP|X86_INTR|] -> CallingConvention
A.CC.X86_Intr
    CallingConvention
[callingConventionP|AVR_INTR|] -> CallingConvention
A.CC.AVR_Intr
    CallingConvention
[callingConventionP|AVR_SIGNAL|] -> CallingConvention
A.CC.AVR_Signal
    CallingConvention
[callingConventionP|AVR_BUILTIN|] -> CallingConvention
A.CC.AVR_Builtin
    CallingConvention
[callingConventionP|AMDGPU_VS|] -> CallingConvention
A.CC.AMDGPU_VS
    CallingConvention
[callingConventionP|AMDGPU_HS|] -> CallingConvention
A.CC.AMDGPU_HS
    CallingConvention
[callingConventionP|AMDGPU_GS|] -> CallingConvention
A.CC.AMDGPU_GS
    CallingConvention
[callingConventionP|AMDGPU_PS|] -> CallingConvention
A.CC.AMDGPU_PS
    CallingConvention
[callingConventionP|AMDGPU_CS|] -> CallingConvention
A.CC.AMDGPU_CS
    CallingConvention
[callingConventionP|AMDGPU_KERNEL|] -> CallingConvention
A.CC.AMDGPU_Kernel
    CallingConvention
[callingConventionP|X86_RegCall|] -> CallingConvention
A.CC.X86_RegCall
    CallingConvention
[callingConventionP|MSP430_BUILTIN|] -> CallingConvention
A.CC.MSP430_Builtin
    FFI.CallingConvention (CUInt Word32
ci)
      | Word32
ci Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word32
64 -> Word32 -> CallingConvention
A.CC.Numbered (Word32 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
ci)
      | Bool
otherwise -> [Char] -> CallingConvention
forall a. HasCallStack => [Char] -> a
error ([Char]
"Unknown calling convention: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Word32 -> [Char]
forall a. Show a => a -> [Char]
show Word32
ci)