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); } } } } }
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); }
private static extern LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef @JITStack);
private static extern LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef @JITStack, LLVMOrcModuleHandle @H);
private static extern LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef @JITStack, out LLVMOrcTargetAddress retAddr, [MarshalAs(UnmanagedType.LPStr)] string @SymbolName);
private static extern LLVMOrcErrorCode LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef @JITStack, out LLVMOrcModuleHandle retHandle, LLVMSharedModuleRef @Mod, SymbolResolver @SymbolResolver, IntPtr @SymbolResolverCtx);
private static extern LLVMOrcErrorCode LLVMOrcAddObjectFile(LLVMOrcJITStackRef @JITStack, out LLVMOrcModuleHandle retHandle, LLVMSharedObjectBufferRef @Obj, SymbolResolver @SymbolResolver, IntPtr @SymbolResolverCtx);
private static extern LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef @JITStack, [MarshalAs(UnmanagedType.LPStr)] string @StubName, LLVMOrcTargetAddress @NewAddr);
private static extern LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef @JITStack, [MarshalAs(UnmanagedType.LPStr)] string @StubName, LLVMOrcTargetAddress @InitAddr);
private static extern LLVMOrcErrorCode LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef @JITStack, out LLVMOrcTargetAddress retAddr, LLVMOrcLazyCompileCallbackFn @Callback, IntPtr @CallbackCtx);
private static extern void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef @JITStack, out IntPtr @MangledSymbol, [MarshalAs(UnmanagedType.LPStr)] string @Symbol);
private static extern string LLVMOrcGetErrorMsg(LLVMOrcJITStackRef @JITStack);