module Data.LLVM.BitCode.IR.Blocks where

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

import Control.Monad ((<=<))


-- Generic Block Ids -----------------------------------------------------------

-- | Block info block selector.
blockInfoBlockId :: Match Entry [Entry]
blockInfoBlockId  = fmap blockEntries . hasBlockId 0 <=< block


-- Module Block Ids ------------------------------------------------------------

moduleBlockId :: Match Entry [Entry]
moduleBlockId  = fmap blockEntries . hasBlockId 8 <=< block

paramattrBlockId :: Match Entry [Entry]
paramattrBlockId  = fmap blockEntries . hasBlockId 9 <=< block

paramattrGroupBlockId :: Match Entry [Entry]
paramattrGroupBlockId  = fmap blockEntries . hasBlockId 10 <=< block

-- | Constants block selector.
constantsBlockId :: Match Entry [Entry]
constantsBlockId  = fmap blockEntries . hasBlockId 11 <=< block

-- | Function block selector.  This will succeed for function body, only.
functionBlockId :: Match Entry [Entry]
functionBlockId  = fmap blockEntries . hasBlockId 12 <=< block

-- UNUSED_ID2 (13)

-- | Value symbol table block selector.
valueSymtabBlockId :: Match Entry [Entry]
valueSymtabBlockId  = fmap blockEntries . hasBlockId 14 <=< block

-- | Metadata block selector.
metadataBlockId :: Match Entry [Entry]
metadataBlockId  = fmap blockEntries . hasBlockId 15 <=< block

-- | Metadata attachment block selector.
metadataAttachmentBlockId :: Match Entry [Entry]
metadataAttachmentBlockId  = fmap blockEntries . hasBlockId 16 <=< block

-- | TYPE_BLOCK_ID_NEW
typeBlockIdNew :: Match Entry [Entry]
typeBlockIdNew  = fmap blockEntries . hasBlockId 17 <=< block

uselistBlockId :: Match Entry [Entry]
uselistBlockId  = fmap blockEntries . hasBlockId 18 <=< block


-- Module Codes ----------------------------------------------------------------

-- | MODULE_CODE_VERSION
moduleCodeVersion :: Match Entry Record
moduleCodeVersion  = hasRecordCode 1 <=< fromEntry

-- | MODULE_CODE_TRIPLE
moduleCodeTriple :: Match Entry Record
moduleCodeTriple  = hasRecordCode 2 <=< fromEntry

-- | MODULE_CODE_DATALAYOUT
moduleCodeDatalayout :: Match Entry Record
moduleCodeDatalayout  = hasRecordCode 3 <=< fromEntry

-- | MODULE_CODE_ASM
moduleCodeAsm :: Match Entry Record
moduleCodeAsm  = hasRecordCode 4 <=< fromEntry

moduleCodeSectionname :: Match Entry Record
moduleCodeSectionname  = hasRecordCode 5 <=< fromEntry

moduleCodeDeplib :: Match Entry Record
moduleCodeDeplib  = hasRecordCode 6 <=< fromEntry

-- | MODULE_CODE_GLOBALVAR
moduleCodeGlobalvar :: Match Entry Record
moduleCodeGlobalvar  = hasRecordCode 7 <=< fromEntry

moduleCodeFunction :: Match Entry Record
moduleCodeFunction  = hasRecordCode 8 <=< fromEntry

-- | MODULE_CODE_ALIAS
moduleCodeAlias :: Match Entry Record
moduleCodeAlias  = hasRecordCode 9 <=< fromEntry

moduleCodePurgevals :: Match Entry Record
moduleCodePurgevals  = hasRecordCode 10 <=< fromEntry

moduleCodeGcname :: Match Entry Record
moduleCodeGcname  = hasRecordCode 11 <=< fromEntry