packages feed

llvm-general-3.3.0.0: test/LLVM/General/Test/Metadata.hs

module LLVM.General.Test.Metadata where

import Test.Framework
import Test.Framework.Providers.HUnit
import Test.HUnit

import LLVM.General.Test.Support

import LLVM.General.AST as A
import qualified LLVM.General.AST.Linkage as L
import qualified LLVM.General.AST.Visibility as V
import qualified LLVM.General.AST.CallingConvention as CC
import qualified LLVM.General.AST.Constant as C
import LLVM.General.AST.Global as G

tests = testGroup "Metadata" [
  testCase "local" $ do
    let ast = Module "<string>" Nothing Nothing [
         GlobalDefinition $ globalVariableDefaults { G.name = UnName 0, G.type' = IntegerType 32 },
         GlobalDefinition $ Function L.External V.Default CC.C [] (IntegerType 32) (Name "foo") ([
            ],False)
          [] 
          Nothing 0         
          [
           BasicBlock (UnName 0) [
              UnName 1 := Load {
                         volatile = False,
                         address = ConstantOperand (C.GlobalReference (UnName 0)),
                         maybeAtomicity = Nothing,
                         A.alignment = 0,
                         metadata = []
                       }
              ] (
              Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [
                (
                  "my-metadatum", 
                  MetadataNode [
                   LocalReference (UnName 1),
                   MetadataStringOperand "super hyper"
                  ]
                )
              ]
            )
          ]
         ]
    let s = "; ModuleID = '<string>'\n\
            \\n\
            \@0 = external global i32\n\
            \\n\
            \define i32 @foo() {\n\
            \  %1 = load i32* @0\n\
            \  ret i32 0, !my-metadatum !{i32 %1, metadata !\"super hyper\"}\n\
            \}\n"
    strCheck ast s,

  testCase "global" $ do
    let ast = Module "<string>" Nothing Nothing [
         GlobalDefinition $ Function L.External V.Default CC.C [] (IntegerType 32) (Name "foo") ([
            ],False)
          [] 
          Nothing 0         
          [
           BasicBlock (UnName 0) [
              ] (
              Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [
                ("my-metadatum", MetadataNodeReference (MetadataNodeID 0))
              ]
            )
          ],
          MetadataNodeDefinition (MetadataNodeID 0) [ ConstantOperand (C.Int 32 1) ]
         ]
    let s = "; ModuleID = '<string>'\n\
            \\n\
            \define i32 @foo() {\n\
            \  ret i32 0, !my-metadatum !0\n\
            \}\n\
            \\n\
            \!0 = metadata !{i32 1}\n"
    strCheck ast s,

  testCase "named" $ do
    let ast = Module "<string>" Nothing Nothing [
          NamedMetadataDefinition "my-module-metadata" [MetadataNodeID 0],
          MetadataNodeDefinition (MetadataNodeID 0) [ ConstantOperand (C.Int 32 1) ]
         ]
    let s = "; ModuleID = '<string>'\n\
            \\n\
            \!my-module-metadata = !{!0}\n\
            \\n\
            \!0 = metadata !{i32 1}\n"
    strCheck ast s,

  testGroup "cyclic" [
    testCase "metadata-only" $ do
      let ast = Module "<string>" Nothing Nothing [
            NamedMetadataDefinition "my-module-metadata" [MetadataNodeID 0],
            MetadataNodeDefinition (MetadataNodeID 0) [
              MetadataNodeOperand (MetadataNodeReference (MetadataNodeID 1)) 
             ],
            MetadataNodeDefinition (MetadataNodeID 1) [
              MetadataNodeOperand (MetadataNodeReference (MetadataNodeID 0)) 
             ]
           ]
      let s = "; ModuleID = '<string>'\n\
              \\n\
              \!my-module-metadata = !{!0}\n\
              \\n\
              \!0 = metadata !{metadata !1}\n\
              \!1 = metadata !{metadata !0}\n"
      strCheck ast s,

    testCase "metadata-global" $ do
      let ast = Module "<string>" Nothing Nothing [
           GlobalDefinition $ Function L.External V.Default CC.C [] VoidType (Name "foo") ([
              ],False)
            [] 
            Nothing 0         
            [
             BasicBlock (UnName 0) [
              ] (
                Do $ Ret Nothing [ ("my-metadatum", MetadataNodeReference (MetadataNodeID 0)) ]
              )
            ],
            MetadataNodeDefinition (MetadataNodeID 0) [
              ConstantOperand (C.GlobalReference (Name "foo"))
             ]
           ]
      let s = "; ModuleID = '<string>'\n\
              \\n\
              \define void @foo() {\n\
              \  ret void, !my-metadatum !0\n\
              \}\n\
              \\n\
              \!0 = metadata !{void ()* @foo}\n"
      strCheck ast s
   ]

 ]