packages feed

accelerate-llvm-1.4.0.0: src/LLVM/AST/Type/Global.hs

{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE GADTs                 #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeSynonymInstances  #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# OPTIONS_HADDOCK hide #-}
-- |
-- Module      : LLVM.AST.Type.Global
-- Copyright   : [2015..2020] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module LLVM.AST.Type.Global
  where

import LLVM.AST.Type.Downcast
import LLVM.AST.Type.Function
import LLVM.AST.Type.Name

import qualified Data.Array.Accelerate.LLVM.Internal.LLVMPretty     as LLVM


-- | An external global function definition.
--
type GlobalFunction args t = Function Label args t

instance Downcast (GlobalFunction args t) LLVM.Declare where
  downcast f = LLVM.Declare
    { LLVM.decLinkage = Just LLVM.External
    , LLVM.decVisibility = Nothing
    , LLVM.decRetType = res
    , LLVM.decName = nm
    , LLVM.decArgs = args
    , LLVM.decVarArgs = False
    , LLVM.decAttrs = []
    , LLVM.decComdat = Nothing }
    where
      trav :: GlobalFunction args t -> ([LLVM.Type], LLVM.Type, LLVM.Symbol)
      trav (Body t _ n) = ([], downcast t, labelToPrettyS n)
      trav (Lam a _ l)  = let (as, r, n) = trav l
                          in  (downcast a : as, r, n)
      --
      (args, res, nm)  = trav f