llvm jit windows 8.1

我试图在VS 2013编译的Windows 8.1上运行斐波纳契演示。我解决了目前为止的几个问题:1.不兼容的对象文件格式 - 我在函数getDefaultFormat(const Triple&T)中将Triple :: COFF更改为Triple :: ELF for Windows 2.缺少asm打印机 - 我添加了InitializeNativeTargetAsmPrinter()3.内存保护 - 我手动将VirtualProtect设置为PAGE_EXECUTE(它没有设置,我不知道这应该如何工作)

现在我能够运行生成的代码,但它崩溃,这里是反汇编代码:000000EC4B890000 push rsi
000000EC4B890001推rdi
000000EC4B890002推送rbx
000000EC4B890003 sub rsp,20h
000000EC4B890007 mov esi,ecx
000000EC4B890009 cmp esi,2
000000EC4B89000C jg 000000EC4B890015
000000EC4B89000E mov eax,1
000000EC4B890013 jmp 000000EC4B89002F
000000EC4B890015 lea ecx,[rsi-1]
000000EC4B890018 mov rbx,0
000000EC4B890022调用rbx
000000EC4B890024 mov edi,eax
000000EC4B890026添加esi,0FFFFFFFEh
000000EC4B890029 mov ecx,esi
000000EC4B89002B调用rbx
000000EC4B89002D添加eax,edi
000000EC4B89002F添加rsp,20h
000000EC4B890033 pop rbx
000000EC4B890034 pop rdi
000000EC4B890035 pop rsi
000000EC4B890036 ret

地址000000EC4B890018是指令mov rbx,0,紧跟在调用rbx之后,并导致崩溃。 另外还有一件奇怪的事情,调用堆栈似乎已损坏,在序言之后调试器调用堆栈中有函数未被调用。

这里是IR:

define i32 @fib(i32 %AnArg) {
EntryBlock:
  %cond = icmp sle i32 %AnArg, 2
  br i1 %cond, label %return, label %recurse

return:                                           ; preds = %EntryBlock
  ret i32 1

recurse:                                          ; preds = %EntryBlock
  %arg = sub i32 %AnArg, 1
  %fibx1 = tail call i32 @fib(i32 %arg)
  %arg1 = sub i32 %AnArg, 2
  %fibx2 = tail call i32 @fib(i32 %arg1)
  %addresult = add i32 %fibx1, %fibx2
  ret i32 %addresult
}

我正在运行的Windows 8.1专业LLVM编译与VS 2013社区版x64配置我正在使用LLVM 3.6.0

注意:x86配置工程(解释器在发行版中除外,崩溃)

有什么我错过了吗? 我应该使用ELF for x64还是COFF(我认为它没有在JIT中实现)?

我正在开始一个大项目。 表现很关键,我想用一个脚本,但它必须被激发。 最重要的平台是Windows,Android和iOS。 我很担心llvm对这些平台的JIT支持。 我知道llvm和clang在所有这些平台上被广泛使用,但由于目前我遇到的问题,我不太确定JIT。


我遇到了与Windows 8.1,Visual Studio 2013,LLVM 3.6.1(-elf hack)完全相同的问题。 JIT的代码没有解析(mov reg,0x0),并且内存页面不可执行(立即崩溃)。

问题是:JIT模块并未实际完成,我认为它可能来自-elf。 为了解决这个问题,我必须在ExecutionEngine :: getFunctionAddress (它应该确保模块已完成)和JIT代码的调用之间显式调用ExecutionEngine :: finalizeObject

// Call the JIT'ed code
auto pCode = (BasicBlockCode)sm_pExecutionEngine->getFunctionAddress(pExecFunc->getName());
// NOTE: We must call this method explicitly since it seems getFunctionAddress won't call it
// -elf windows hack?
sm_pExecutionEngine->finalizeObject();
pCode(reinterpret_cast<u8*>(m_pCpuCtxt), reinterpret_cast<u8*>(m_pMemCtxt));

MC JIT尚未(尽管即将推出:http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20150216/261096.html)支持可动态加载的COFF对象。

因此,如果您希望跨平台的LLVM JIT,您需要检查您是否在Windows上运行,然后更改您的目标三元组以追加“-elf”。

我对C ++ API不太熟悉,所以我举了一个例子(使用LLVM .NET C#绑定):

var platform = Environment.OSVersion.Platform;
if (platform == PlatformID.Win32NT) // On Windows, LLVM currently (3.6) does not support PE/COFF
{
   LLVM.SetTarget(mod, Marshal.PtrToStringAnsi(LLVM.GetDefaultTargetTriple()) + "-elf");
}
链接地址: http://www.djcxy.com/p/86835.html

上一篇: llvm jit windows 8.1

下一篇: Qt5Cored!Qobject::disconnect... read access violation at 0x0