{-# LANGUAGE ImplicitParams #-}
{-# LANGUAGE RankNTypes #-}
module Lang.Crucible.LLVM.PrettyPrint
( commaSepList
, ppIntType
, ppPtrType
, ppArrayType
, ppVectorType
, ppIntVector
, ppLLVMLatest
, ppDeclare
, ppIdent
, ppSymbol
, ppType
, ppValue
) where
import Numeric.Natural
import Prettyprinter
import qualified Text.PrettyPrint.HughesPJ as HPJ
import qualified Text.LLVM.AST as L
import qualified Text.LLVM.PP as L
commaSepList :: [Doc ann] -> Doc ann
commaSepList :: forall ann. [Doc ann] -> Doc ann
commaSepList [Doc ann]
l = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hcat (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate (Doc ann
forall ann. Doc ann
comma Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Char -> Doc ann
forall ann. Char -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Char
' ') [Doc ann]
l)
ppIntType :: Integral a => a -> Doc ann
ppIntType :: forall a ann. Integral a => a -> Doc ann
ppIntType a
i = Char -> Doc ann
forall ann. Char -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Char
'i' Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (a -> Integer
forall a. Integral a => a -> Integer
toInteger a
i)
ppPtrType :: Doc ann -> Doc ann
ppPtrType :: forall ann. Doc ann -> Doc ann
ppPtrType Doc ann
tp = Doc ann
tp Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Char -> Doc ann
forall ann. Char -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Char
'*'
ppArrayType :: Natural -> Doc ann -> Doc ann
ppArrayType :: forall ann. Natural -> Doc ann -> Doc ann
ppArrayType Natural
n Doc ann
e = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
n) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Char -> Doc ann
forall ann. Char -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Char
'x' Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
e)
ppVectorType :: Natural -> Doc ann -> Doc ann
ppVectorType :: forall ann. Natural -> Doc ann -> Doc ann
ppVectorType Natural
n Doc ann
e = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
angles (Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
n) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Char -> Doc ann
forall ann. Char -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Char
'x' Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
e)
ppIntVector :: Integral a => Natural -> a -> Doc ann
ppIntVector :: forall a ann. Integral a => Natural -> a -> Doc ann
ppIntVector Natural
n a
w = Natural -> Doc ann -> Doc ann
forall ann. Natural -> Doc ann -> Doc ann
ppVectorType Natural
n (a -> Doc ann
forall a ann. Integral a => a -> Doc ann
ppIntType a
w)
ppLLVMLatest :: ((?config :: L.Config) => a) -> a
ppLLVMLatest :: forall a. ((?config::Config) => a) -> a
ppLLVMLatest = Config -> ((?config::Config) => a) -> a
forall a. Config -> ((?config::Config) => a) -> a
L.withConfig (L.Config { cfgVer :: LLVMVer
L.cfgVer = LLVMVer
L.llvmVlatest })
ppDeclare :: L.Declare -> HPJ.Doc
ppDeclare :: Declare -> Doc
ppDeclare = ((?config::Config) => Declare -> Doc) -> Declare -> Doc
forall a. ((?config::Config) => a) -> a
ppLLVMLatest (?config::Config) => Declare -> Doc
Declare -> Doc
L.ppDeclare
ppIdent :: L.Ident -> HPJ.Doc
ppIdent :: Ident -> Doc
ppIdent = ((?config::Config) => Ident -> Doc) -> Ident -> Doc
forall a. ((?config::Config) => a) -> a
ppLLVMLatest (?config::Config) => Ident -> Doc
Ident -> Doc
L.ppIdent
ppSymbol :: L.Symbol -> HPJ.Doc
ppSymbol :: Symbol -> Doc
ppSymbol = ((?config::Config) => Symbol -> Doc) -> Symbol -> Doc
forall a. ((?config::Config) => a) -> a
ppLLVMLatest (?config::Config) => Symbol -> Doc
Symbol -> Doc
L.ppSymbol
ppType :: L.Type -> HPJ.Doc
ppType :: Type -> Doc
ppType = ((?config::Config) => Type -> Doc) -> Type -> Doc
forall a. ((?config::Config) => a) -> a
ppLLVMLatest (?config::Config) => Type -> Doc
Type -> Doc
L.ppType
ppValue :: L.Value -> HPJ.Doc
ppValue :: Value -> Doc
ppValue = ((?config::Config) => Value -> Doc) -> Value -> Doc
forall a. ((?config::Config) => a) -> a
ppLLVMLatest (?config::Config) => Value -> Doc
Value -> Doc
L.ppValue