Esempio n. 1
0
        public static TypeRef getInt8PtrTy(Swigged.LLVM.ContextRef C, uint AS = 0)
        {
            TypeRef re = LLVM.PointerType(LLVM.Int8TypeInContext(C), 0);

            return(re);
        }
Esempio n. 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);
        }