From 24e3d4ad0661a283427b0ca776fc8cf906540da4 Mon Sep 17 00:00:00 2001 From: Francesco Gazzetta Date: Sat, 2 Jul 2022 12:05:42 +0200 Subject: [PATCH] Pretty instances for data definitions --- golden/data.qbe | 3 +++ src/Language/QBE.hs | 25 ++++++++++++++++++++++--- test/Main.hs | 5 +++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 golden/data.qbe diff --git a/golden/data.qbe b/golden/data.qbe new file mode 100644 index 0000000..30dff5e --- /dev/null +++ b/golden/data.qbe @@ -0,0 +1,3 @@ +export +data $d = align 8 +{z 16, b $g + 32 "foo\nbar\NULbaz" -1} \ No newline at end of file diff --git a/src/Language/QBE.hs b/src/Language/QBE.hs index b235f49..15867b7 100644 --- a/src/Language/QBE.hs +++ b/src/Language/QBE.hs @@ -10,9 +10,10 @@ import Data.Text.Short (ShortText) import qualified Data.Text.Short as TS import Data.ByteString (ByteString) import Data.Word (Word64) -import Data.List.NonEmpty (NonEmpty) +import Data.List.NonEmpty (NonEmpty, toList) +import Data.Maybe (maybeToList) import Prettyprinter - ( Pretty(pretty), (<+>) + ( Pretty(pretty), (<+>), vsep, hsep , space, encloseSep, lbrace, rbrace, comma, equals, braces ) -- Instances import Data.Hashable (Hashable) @@ -152,17 +153,35 @@ instance Pretty SubTy where data DataDef = DataDef [Linkage] (Ident 'Global) (Maybe Alignment) [Field] deriving (Show, Eq) +instance Pretty DataDef where + pretty (DataDef linkage ident alignment fields) = vsep + [ vsep $ pretty <$> linkage + , hsep $ ("data" <+> pretty ident <+> equals) + : maybeToList (("align" <+>) . pretty <$> alignment) + , encloseSep lbrace rbrace (comma <> space) (pretty <$> fields) + ] + data DataItem - = Symbol (Ident 'Global) Alignment + = Symbol (Ident 'Global) (Maybe Alignment) | String ByteString | Const Const deriving (Show, Eq) +instance Pretty DataItem where + pretty (Symbol ident alignment) = + hsep $ pretty ident : maybeToList ((pretty '+' <+>) . pretty <$> alignment) + pretty (String bs) = pretty $ show bs -- HACK: hoping that the escape sequences are the same... + pretty (Const c) = pretty c + data Field = FieldExtTy ExtTy (NonEmpty DataItem) | FieldZero Size deriving (Show, Eq) +instance Pretty Field where + pretty (FieldExtTy extTy items) = pretty extTy <+> hsep (toList $ pretty <$> items) + pretty (FieldZero size) = pretty 'z' <+> pretty size + -- ** Functions --------------- diff --git a/test/Main.hs b/test/Main.hs index 5b6101e..1ac8a32 100644 --- a/test/Main.hs +++ b/test/Main.hs @@ -11,6 +11,7 @@ import Test.Tasty.Silver (goldenVsAction) import System.FilePath ((), (<.>)) import Prettyprinter (Pretty(pretty), layoutPretty, defaultLayoutOptions) import Prettyprinter.Render.Text (renderStrict) +import Data.List.NonEmpty (NonEmpty((:|))) data P = forall a. Pretty a => P a @@ -42,6 +43,10 @@ goldenTests = testGroup "golden tests" , (SubAggregateTy "t1", Nothing) ] , t "opaque" $ Opaque "t" 8 16 + , t "data" $ DataDef [Export] "d" (Just 8) + [ FieldZero 16 + , FieldExtTy Byte $ Symbol "g" (Just 32) :| [String "foo\nbar\0baz", Const $ CInt True 1] + ] , t "val" [ValConst (CInt False 0), ValTemporary "temporary", ValGlobal "global"] , t "jmp" $ Jmp "target" , t "jnz" $ Jnz (ValConst $ CInt False 0) "target1" "target2"