コード例 #1
0
ファイル: Program.cs プロジェクト: kaby76/swigged.llvm
        static void Main(string[] args)
        {
            Swigged.LLVM.Helper.Adjust.Path();
            LLVM.InitializeAllTargets();
            LLVM.InitializeAllTargetMCs();
            LLVM.InitializeAllTargetInfos();
            LLVM.InitializeAllAsmPrinters();

            ModuleRef mod = LLVM.ModuleCreateWithName("LLVMSharpIntro");

            TypeRef[]     param_types = { LLVM.Int32Type(), LLVM.Int32Type() };
            TypeRef       ret_type    = LLVM.FunctionType(LLVM.Int32Type(), param_types, false);
            ValueRef      sum         = LLVM.AddFunction(mod, "sum", ret_type);
            BasicBlockRef entry       = LLVM.AppendBasicBlock(sum, "entry");
            BuilderRef    builder     = LLVM.CreateBuilder();

            LLVM.PositionBuilderAtEnd(builder, entry);
            ValueRef tmp = LLVM.BuildAdd(builder, LLVM.GetParam(sum, 0), LLVM.GetParam(sum, 1), "tmp");

            LLVM.BuildRet(builder, tmp);
            MyString the_error = new MyString();

            LLVM.VerifyModule(mod, VerifierFailureAction.AbortProcessAction, the_error);
            //LLVM.DisposeMessage(error);
            ExecutionEngineRef   engine;
            MCJITCompilerOptions options = new MCJITCompilerOptions();
            var optionsSize = (4 * sizeof(int)) + IntPtr.Size; // LLVMMCJITCompilerOptions has 4 ints and a pointer

            LLVM.InitializeMCJITCompilerOptions(options, (uint)optionsSize);
            LLVM.CreateMCJITCompilerForModule(out engine, mod, options, (uint)optionsSize, the_error);
            var    ptr       = LLVM.GetPointerToGlobal(engine, sum);
            IntPtr p         = (IntPtr)ptr;
            Add    addMethod = (Add)Marshal.GetDelegateForFunctionPointer(p, typeof(Add));
            int    result    = addMethod(10, 10);

            Console.WriteLine("Result of sum is: " + result);
            if (LLVM.WriteBitcodeToFile(mod, "sum.bc") != 0)
            {
                Console.WriteLine("error writing bitcode to file, skipping");
            }
            LLVM.DumpModule(mod);
            LLVM.DisposeBuilder(builder);
            LLVM.DisposeExecutionEngine(engine);
        }
コード例 #2
0
        public void TestGCD()
        {
            Swigged.LLVM.ContextRef g = Swigged.LLVM.LLVM.GetGlobalContext();
            var Module = LLVM.ModuleCreateWithName("tut2");
            var triple = LLVM.GetDefaultTargetTriple();

            LLVM.SetTarget(Module, triple);

            var arg_types = new TypeRef[2] {
                LLVM.Int32Type(), LLVM.Int32Type()
            };
            var gcd = LLVM.AddFunction(Module, "gcd",
                                       LLVM.FunctionType(LLVM.Int32Type(),
                                                         arg_types,
                                                         false));

            LLVM.SetFunctionCallConv(gcd, (uint)Swigged.LLVM.CallConv.CCallConv);

            var x = LLVM.GetParam(gcd, 0);
            var y = LLVM.GetParam(gcd, 1);

            var entry        = LLVM.AppendBasicBlock(gcd, "entry");
            var ret          = LLVM.AppendBasicBlock(gcd, "return");
            var cond_false   = LLVM.AppendBasicBlock(gcd, "cond_false");
            var cond_true    = LLVM.AppendBasicBlock(gcd, "cond_true");
            var cond_false_2 = LLVM.AppendBasicBlock(gcd, "cond_false");

            BuilderRef builder = LLVM.CreateBuilder();

            LLVM.PositionBuilderAtEnd(builder, entry);
            var xEqualsY = LLVM.BuildICmp(builder, IntPredicate.IntEQ, x, y, "tmp");
            var br       = LLVM.BuildCondBr(builder, xEqualsY, ret, cond_false);

            LLVM.PositionBuilderAtEnd(builder, ret);
            LLVM.BuildRet(builder, x);

            LLVM.PositionBuilderAtEnd(builder, cond_false);
            var xLessThanY = LLVM.BuildICmp(builder, IntPredicate.IntULT, x, y, "tmp");

            LLVM.BuildCondBr(builder, xLessThanY, cond_true, cond_false_2);

            LLVM.PositionBuilderAtEnd(builder, cond_true);
            var yMinusX = LLVM.BuildSub(builder, y, x, "tmp");

            ValueRef[] args1 = new ValueRef[2] {
                x, yMinusX
            };
            var recur_1 = LLVM.BuildCall(builder, gcd, args1, "tmp");

            LLVM.BuildRet(builder, recur_1);

            LLVM.PositionBuilderAtEnd(builder, cond_false_2);
            var xMinusY = LLVM.BuildSub(builder, x, y, "tmp");

            ValueRef[] args2 = new ValueRef[2] {
                xMinusY, y
            };
            var recur_2 = LLVM.BuildCall(builder, gcd, args2, "tmp");

            LLVM.BuildRet(builder, recur_2);

            MyString error = new MyString();

            LLVM.VerifyModule(Module, VerifierFailureAction.PrintMessageAction, error);
            if (error.ToString() != "")
            {
                throw new Exception("Failed");
            }

            ExecutionEngineRef engine;

            LLVM.LinkInMCJIT();
            LLVM.InitializeNativeTarget();
            LLVM.InitializeNativeAsmPrinter();
            MCJITCompilerOptions options = new MCJITCompilerOptions();
            var optionsSize = (4 * sizeof(int)) + IntPtr.Size; // LLVMMCJITCompilerOptions has 4 ints and a pointer

            LLVM.InitializeMCJITCompilerOptions(options, (uint)optionsSize);
            LLVM.CreateMCJITCompilerForModule(out engine, Module, options, (uint)optionsSize, error);
            var    ptr       = LLVM.GetPointerToGlobal(engine, gcd);
            IntPtr p         = (IntPtr)ptr;
            Ack    ackMethod = (Ack)Marshal.GetDelegateForFunctionPointer(p, typeof(Ack));

            for (int i = 1; i < 10; ++i)
            {
                for (int j = 1; j < 10; ++j)
                {
                    int result  = ackMethod(i, j);
                    int result2 = CsAck(i, j);
                    if (result != result2)
                    {
                        throw new Exception("Test failed, results between C# and LLVM are not the same.");
                    }
                }
            }

            var pm  = Swigged.LLVM.LLVM.CreatePassManager();
            var str = LLVM.PrintModuleToString(Module);

            LLVM.DumpModule(Module);
            LLVM.DisposeBuilder(builder);
            LLVM.DisposeExecutionEngine(engine);
        }