예제 #1
0
 public void TestLazyIRCompilation( )
 {
     using (Library.InitializeLLVM( ))
     {
         Library.RegisterNative( );
         using (LLVMContextRef context = LLVMContextCreate( ))
         {
             string nativeTriple = LLVMGetDefaultTargetTriple();
             Assert.IsFalse(string.IsNullOrWhiteSpace(nativeTriple));
             Assert.IsTrue(LLVMGetTargetFromTriple(nativeTriple, out LLVMTargetRef targetHandle, out string errorMessag).Succeeded);
             LLVMTargetMachineRef machine = LLVMCreateTargetMachine(
                 targetHandle,
                 nativeTriple,
                 string.Empty,
                 string.Empty,
                 LLVMCodeGenOptLevel.LLVMCodeGenLevelDefault,
                 LLVMRelocMode.LLVMRelocDefault,
                 LLVMCodeModel.LLVMCodeModelJITDefault);
             using ( machine )
             {
                 LLVMOrcJITStackRef orcJit = LLVMOrcCreateInstance(machine);
                 using ( orcJit )
                 {
                     // try several different modules with the same function name replacing the previous
                     AddAndExecuteTestModule(orcJit, context, machine, 42);
                     AddAndExecuteTestModule(orcJit, context, machine, 12345678);
                     AddAndExecuteTestModule(orcJit, context, machine, 87654321);
                 }
             }
         }
     }
 }
예제 #2
0
        private static void AddAndExecuteTestModule(LLVMOrcJITStackRef orcJit, LLVMContextRef context, LLVMTargetMachineRef machine, int expectedResult)
        {
            LLVMModuleRef module = CreateModule(context, machine, expectedResult);
            LLVMErrorRef  err    = LLVMOrcAddEagerlyCompiledIR(orcJit, out ulong jitHandle, module, SymbolResolver, IntPtr.Zero);

            Assert.IsTrue(err.IsInvalid);

            // ORC now owns the module, so it must never be released
            module.SetHandleAsInvalid();
            LLVMOrcGetMangledSymbol(orcJit, out string mangledName, "main");
            err = LibLLVMOrcGetSymbolAddress(orcJit, out ulong funcAddress, mangledName, false);
            Assert.IsTrue(err.IsInvalid);
            Assert.AreNotEqual(0ul, funcAddress);
            var callableMain = Marshal.GetDelegateForFunctionPointer <TestMain>(( IntPtr )funcAddress);

            Assert.AreEqual(expectedResult, callableMain( ));

            LLVMOrcRemoveModule(orcJit, jitHandle);
        }
예제 #3
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef @JITStack);
예제 #4
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef @JITStack, LLVMOrcModuleHandle @H);
예제 #5
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef @JITStack, out LLVMOrcTargetAddress retAddr, [MarshalAs(UnmanagedType.LPStr)] string @SymbolName);
예제 #6
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern LLVMOrcErrorCode LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef @JITStack, out LLVMOrcModuleHandle retHandle, LLVMSharedModuleRef @Mod, SymbolResolver @SymbolResolver, IntPtr @SymbolResolverCtx);
예제 #7
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern LLVMOrcErrorCode LLVMOrcAddObjectFile(LLVMOrcJITStackRef @JITStack, out LLVMOrcModuleHandle retHandle, LLVMSharedObjectBufferRef @Obj, SymbolResolver @SymbolResolver, IntPtr @SymbolResolverCtx);
예제 #8
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef @JITStack, [MarshalAs(UnmanagedType.LPStr)] string @StubName, LLVMOrcTargetAddress @NewAddr);
예제 #9
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef @JITStack, [MarshalAs(UnmanagedType.LPStr)] string @StubName, LLVMOrcTargetAddress @InitAddr);
예제 #10
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern LLVMOrcErrorCode LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef @JITStack, out LLVMOrcTargetAddress retAddr, LLVMOrcLazyCompileCallbackFn @Callback, IntPtr @CallbackCtx);
예제 #11
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef @JITStack, out IntPtr @MangledSymbol, [MarshalAs(UnmanagedType.LPStr)] string @Symbol);
예제 #12
0
파일: OrcJit.cs 프로젝트: nbsn2/Llvm.NET
 private static extern string LLVMOrcGetErrorMsg(LLVMOrcJITStackRef @JITStack);