{-# LANGUAGE TemplateHaskell, FlexibleInstances, MultiParamTypeClasses, FlexibleContexts #-} module LLVM.General.Internal.Global where import Control.Monad.IO.Class import Data.Functor import Foreign.Ptr import Control.Monad.AnyCont import Data.Word import qualified LLVM.General.Internal.FFI.PtrHierarchy as FFI import qualified LLVM.General.Internal.FFI.LLVMCTypes as FFI import qualified LLVM.General.Internal.FFI.GlobalValue as FFI import LLVM.General.Internal.Coding import LLVM.General.Internal.DecodeAST import LLVM.General.Internal.EncodeAST import qualified LLVM.General.AST.Linkage as A.L import qualified LLVM.General.AST.Visibility as A.V genCodingInstance' [t| A.L.Linkage |] ''FFI.Linkage [ (FFI.linkageExternal, A.L.External), (FFI.linkageAvailableExternally, A.L.AvailableExternally), (FFI.linkageLinkOnceAny, A.L.LinkOnce), (FFI.linkageLinkOnceODR, A.L.LinkOnceODR), (FFI.linkageWeakAny, A.L.Weak), (FFI.linkageWeakODR, A.L.WeakODR), (FFI.linkageAppending, A.L.Appending), (FFI.linkageInternal, A.L.Internal), (FFI.linkagePrivate, A.L.Private), (FFI.linkageDLLImport, A.L.DLLImport), (FFI.linkageDLLExport, A.L.DLLExport), (FFI.linkageExternalWeak, A.L.ExternWeak), (FFI.linkageCommon, A.L.Common), (FFI.linkageLinkerPrivate, A.L.LinkerPrivate), (FFI.linkageLinkerPrivateWeak, A.L.LinkerPrivateWeak) ] getLinkage :: FFI.DescendentOf FFI.GlobalValue v => Ptr v -> DecodeAST A.L.Linkage getLinkage g = liftIO $ decodeM =<< FFI.getLinkage (FFI.upCast g) setLinkage :: FFI.DescendentOf FFI.GlobalValue v => Ptr v -> A.L.Linkage -> EncodeAST () setLinkage g l = liftIO . FFI.setLinkage (FFI.upCast g) =<< encodeM l genCodingInstance' [t| A.V.Visibility |] ''FFI.Visibility [ (FFI.visibilityDefault, A.V.Default), (FFI.visibilityHidden, A.V.Hidden), (FFI.visibilityProtected, A.V.Protected) ] getVisibility :: FFI.DescendentOf FFI.GlobalValue v => Ptr v -> DecodeAST A.V.Visibility getVisibility g = liftIO $ decodeM =<< FFI.getVisibility (FFI.upCast g) setVisibility :: FFI.DescendentOf FFI.GlobalValue v => Ptr v -> A.V.Visibility -> EncodeAST () setVisibility g v = liftIO . FFI.setVisibility (FFI.upCast g) =<< encodeM v getSection :: FFI.DescendentOf FFI.GlobalValue v => Ptr v -> DecodeAST (Maybe String) getSection g = liftIO $ do s <- decodeM =<< FFI.getSection (FFI.upCast g) return $ if (s == "") then Nothing else Just s setSection :: FFI.DescendentOf FFI.GlobalValue v => Ptr v -> Maybe String -> EncodeAST () setSection g s = scopeAnyCont $ do s <- encodeM (maybe "" id s) liftIO $ FFI.setSection (FFI.upCast g) s setAlignment :: FFI.DescendentOf FFI.GlobalValue v => Ptr v -> Word32 -> EncodeAST () setAlignment g i = liftIO $ FFI.setAlignment (FFI.upCast g) (fromIntegral i) getAlignment :: FFI.DescendentOf FFI.GlobalValue v => Ptr v -> DecodeAST Word32 getAlignment g = liftIO $ fromIntegral <$> FFI.getAlignment (FFI.upCast g)