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 "" 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 = ''\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 "" "" 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 = ''\n\ \source_filename = \"\"\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 "" "" Nothing Nothing [ NamedMetadataDefinition "my-module-metadata" [ MetadataNodeID 0 ], MetadataNodeDefinition (MetadataNodeID 0) [ Just $ MDValue $ ConstantOperand (C.Int 32 1) ] ] let s = "; ModuleID = ''\n\ \source_filename = \"\"\n\ \\n\ \!my-module-metadata = !{!0}\n\ \\n\ \!0 = !{i32 1}\n" strCheck ast s, testCase "null" $ do let ast = Module "" "" Nothing Nothing [ NamedMetadataDefinition "my-module-metadata" [ MetadataNodeID 0 ], MetadataNodeDefinition (MetadataNodeID 0) [ Nothing ] ] let s = "; ModuleID = ''\n\ \source_filename = \"\"\n\ \\n\ \!my-module-metadata = !{!0}\n\ \\n\ \!0 = !{null}\n" strCheck ast s, testGroup "cyclic" [ testCase "metadata-only" $ do let ast = Module "" "" 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 = ''\n\ \source_filename = \"\"\n\ \\n\ \!my-module-metadata = !{!0}\n\ \\n\ \!0 = !{!1}\n\ \!1 = !{!0}\n" strCheck ast s, testCase "metadata-global" $ do let ast = Module "" "" 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 = ''\n\ \source_filename = \"\"\n\ \\n\ \define void @foo() {\n\ \ ret void, !my-metadatum !0\n\ \}\n\ \\n\ \!0 = !{void ()* @foo}\n" strCheck ast s ] ]