llvm-hs-4.0.0.0: test/LLVM/Test/Metadata.hs
module LLVM.Test.Metadata where
import Test.Tasty
import Test.Tasty.HUnit
import LLVM.Test.Support
import LLVM.AST as A
import LLVM.AST.Type as A.T
import LLVM.AST.AddrSpace as A
import qualified LLVM.AST.Linkage as L
import qualified LLVM.AST.Visibility as V
import qualified LLVM.AST.CallingConvention as CC
import qualified LLVM.AST.Constant as C
import LLVM.AST.Global as G
tests = testGroup "Metadata" [
-- testCase "local" $ do
-- let ast = Module "<string>" Nothing Nothing [
-- GlobalDefinition $ globalVariableDefaults { G.name = UnName 0, G.type' = i32 },
-- GlobalDefinition $ functionDefaults {
-- G.returnType = i32,
-- G.name = Name "foo",
-- G.basicBlocks = [
-- BasicBlock (UnName 0) [
-- UnName 1 := Load {
-- volatile = False,
-- address = ConstantOperand (C.GlobalReference (ptr i32) (UnName 0)),
-- maybeAtomicity = Nothing,
-- A.alignment = 0,
-- metadata = []
-- }
-- ] (
-- Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [
-- (
-- "my-metadatum",
-- MetadataNode [
-- Just $ MDValue $ LocalReference i32 (UnName 1),
-- Just $ MDString "super hyper",
-- Nothing
-- ]
-- )
-- ]
-- )
-- ]
-- }
-- ]
-- let s = "; ModuleID = '<string>'\n\
-- \\n\
-- \@0 = external global i32\n\
-- \\n\
-- \define i32 @foo() {\n\
-- \ %1 = load i32, i32* @0\n\
-- \ ret i32 0, !my-metadatum !{i32 %1, !\"super hyper\", null}\n\
-- \}\n"
-- strCheck ast s,
testCase "global" $ do
let ast = Module "<string>" "<string>" Nothing Nothing [
GlobalDefinition $ functionDefaults {
G.returnType = i32,
G.name = Name "foo",
G.basicBlocks = [
BasicBlock (UnName 0) [
] (
Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [
("my-metadatum", MetadataNodeReference (MetadataNodeID 0))
]
)
]
},
MetadataNodeDefinition (MetadataNodeID 0) [ Just $ MDValue $ ConstantOperand (C.Int 32 1) ]
]
let s = "; ModuleID = '<string>'\n\
\source_filename = \"<string>\"\n\
\\n\
\define i32 @foo() {\n\
\ ret i32 0, !my-metadatum !0\n\
\}\n\
\\n\
\!0 = !{i32 1}\n"
strCheck ast s,
testCase "named" $ do
let ast = Module "<string>" "<string>" Nothing Nothing [
NamedMetadataDefinition "my-module-metadata" [ MetadataNodeID 0 ],
MetadataNodeDefinition (MetadataNodeID 0) [ Just $ MDValue $ ConstantOperand (C.Int 32 1) ]
]
let s = "; ModuleID = '<string>'\n\
\source_filename = \"<string>\"\n\
\\n\
\!my-module-metadata = !{!0}\n\
\\n\
\!0 = !{i32 1}\n"
strCheck ast s,
testCase "null" $ do
let ast = Module "<string>" "<string>" Nothing Nothing [
NamedMetadataDefinition "my-module-metadata" [ MetadataNodeID 0 ],
MetadataNodeDefinition (MetadataNodeID 0) [ Nothing ]
]
let s = "; ModuleID = '<string>'\n\
\source_filename = \"<string>\"\n\
\\n\
\!my-module-metadata = !{!0}\n\
\\n\
\!0 = !{null}\n"
strCheck ast s,
testGroup "cyclic" [
testCase "metadata-only" $ do
let ast = Module "<string>" "<string>" Nothing Nothing [
NamedMetadataDefinition "my-module-metadata" [MetadataNodeID 0],
MetadataNodeDefinition (MetadataNodeID 0) [
Just $ MDNode (MetadataNodeReference (MetadataNodeID 1))
],
MetadataNodeDefinition (MetadataNodeID 1) [
Just $ MDNode (MetadataNodeReference (MetadataNodeID 0))
]
]
let s = "; ModuleID = '<string>'\n\
\source_filename = \"<string>\"\n\
\\n\
\!my-module-metadata = !{!0}\n\
\\n\
\!0 = !{!1}\n\
\!1 = !{!0}\n"
strCheck ast s,
testCase "metadata-global" $ do
let ast = Module "<string>" "<string>" Nothing Nothing [
GlobalDefinition $ functionDefaults {
G.returnType = A.T.void,
G.name = Name "foo",
G.basicBlocks = [
BasicBlock (UnName 0) [
] (
Do $ Ret Nothing [ ("my-metadatum", MetadataNodeReference (MetadataNodeID 0)) ]
)
]
},
MetadataNodeDefinition (MetadataNodeID 0) [
Just $ MDValue $ ConstantOperand (C.GlobalReference (ptr (FunctionType A.T.void [] False)) (Name "foo"))
]
]
let s = "; ModuleID = '<string>'\n\
\source_filename = \"<string>\"\n\
\\n\
\define void @foo() {\n\
\ ret void, !my-metadatum !0\n\
\}\n\
\\n\
\!0 = !{void ()* @foo}\n"
strCheck ast s
]
]