module Data.LLVM.BitCode.IR.Attrs where

import Data.LLVM.BitCode.Bitstream
import Data.LLVM.BitCode.Match
import Data.LLVM.BitCode.Record
import Text.LLVM.AST

import Control.Monad ((<=<),mzero)


-- | Matching function for parsing the linkage types out of fields.
linkage :: Match Field Linkage
linkage :: Match Field Linkage
linkage  = Match Int Linkage
choose Match Int Linkage -> (Field -> Maybe Int) -> Match Field Linkage
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Field -> Maybe Int
forall a. (Num a, Bits a) => Match Field a
numeric
  where
  choose :: Match Int Linkage
  choose :: Match Int Linkage
choose Int
n = case Int
n of
    Int
0  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
External
    Int
1  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
Weak
    Int
2  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
Appending
    Int
3  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
Internal
    Int
4  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
Linkonce
    Int
5  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
DLLImport
    Int
6  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
DLLExport
    Int
7  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
ExternWeak
    Int
8  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
Common
    Int
9  -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
Private
    Int
10 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
WeakODR
    Int
11 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
LinkonceODR
    Int
12 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
AvailableExternally
    Int
13 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
LinkerPrivate
    Int
14 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
LinkerPrivateWeak
    Int
15 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
LinkerPrivateWeakDefAuto
    Int
16 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
Weak
    Int
17 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
WeakODR
    Int
18 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
Linkonce
    Int
19 -> Linkage -> Maybe Linkage
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Linkage
LinkonceODR
    Int
_  -> Maybe Linkage
forall a. Maybe a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

visibility :: Match Field Visibility
visibility :: Match Field Visibility
visibility = Match Int Visibility
choose Match Int Visibility
-> (Field -> Maybe Int) -> Match Field Visibility
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Field -> Maybe Int
forall a. (Num a, Bits a) => Match Field a
numeric
  where
  choose :: Match Int Visibility
  choose :: Match Int Visibility
choose Int
n = case Int
n of
    Int
0 -> Visibility -> Maybe Visibility
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Visibility
DefaultVisibility
    Int
1 -> Visibility -> Maybe Visibility
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Visibility
HiddenVisibility
    Int
2 -> Visibility -> Maybe Visibility
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Visibility
ProtectedVisibility
    Int
_ -> Maybe Visibility
forall a. Maybe a
forall (m :: * -> *) a. MonadPlus m => m a
mzero