Beispiel #1
0
        public static void Main(string[] args)
        {
            Utilities.WaitForDebugger( );

            using (StaticState.InitializeLLVM( ))
            {
                StaticState.RegisterNative( );
                using (var machine = TargetMachine.FromTriple(Triple.HostTriple))
                    using (var generator = new CodeGenerator(LanguageLevel.MutableVariables, machine))
                    {
                        RunReplLoop(generator);
                        generator.Module.DIBuilder.Finish( );
                        if (!generator.Module.Verify(out string errMsg))
                        {
                            Console.Error.WriteLine(errMsg);
                        }
                        else
                        {
                            machine.EmitToFile(generator.Module, "kls.o", CodeGenFileType.ObjectFile);
                            Console.WriteLine(generator.Module.WriteToString( ));
                            Console.WriteLine("Wrote module to kls.o");
                        }
                    }
            }
        }
Beispiel #2
0
        public static void Initialize(TestContext ctx)
        {
            _ = ctx; // unused
            using var llvmContext = new Context( );
            using var module      = llvmContext.CreateBitcodeModule("test", SourceLanguage.C, TestSrcFileName, "unit tests");
            var tm = TargetMachine.FromTriple(Triple.HostTriple);

            module.TargetTriple = tm.Triple;
            module.Layout       = tm.TargetData;

            var doubleType = new DebugBasicType(llvmContext.DoubleType, module, "double", DiTypeKind.Float);
            var voidType   = DebugType.Create <ITypeRef, DIType>(module.Context.VoidType, null);

            var printDecl = module.CreateFunction(PrintFuncName, false, voidType, doubleType);

            var bldr = CreateFunctionAndGetBuilder(module, doubleType, AddFuncName, AddSectionName, 0);

            bldr.CurrentDebugLocation = new DILocation(llvmContext, 2, 1, bldr.InsertFunction !.DISubProgram !);
            var result = bldr.FAdd(bldr.InsertFunction.Parameters[0], bldr.InsertFunction.Parameters[1]);

            _ = bldr.Call(printDecl, result);
            bldr.Return(result);

            bldr = CreateFunctionAndGetBuilder(module, doubleType, SubFuncName, SubSectionName, 5);
            bldr.CurrentDebugLocation = new DILocation(llvmContext, 7, 1, bldr.InsertFunction !.DISubProgram !);
            result = bldr.FSub(bldr.InsertFunction.Parameters[0], bldr.InsertFunction.Parameters[1]);
            _      = bldr.Call(printDecl, result);
            bldr.Return(result);

            bldr = CreateFunctionAndGetBuilder(module, doubleType, MulFuncName, MulSectionName, 10);
            bldr.CurrentDebugLocation = new DILocation(llvmContext, 12, 1, bldr.InsertFunction !.DISubProgram !);
            result = bldr.FMul(bldr.InsertFunction.Parameters[0], bldr.InsertFunction.Parameters[1]);
            _      = bldr.Call(printDecl, result);
            bldr.Return(result);

            bldr = CreateFunctionAndGetBuilder(module, doubleType, DivFuncName, DivSectionName, 15);
            bldr.CurrentDebugLocation = new DILocation(llvmContext, 17, 1, bldr.InsertFunction !.DISubProgram !);
            result = bldr.FDiv(bldr.InsertFunction.Parameters[0], bldr.InsertFunction.Parameters[1]);
            _      = bldr.Call(printDecl, result);
            bldr.Return(result);

            Debug.WriteLine(module.WriteToString( ));
            tm.EmitToFile(module, TestObjFileName, CodeGenFileType.ObjectFile);
        }