如何使 llvm jit 在 MSVC++ 中工作

How to make llvm jit work in MSVC++

看来 LLVM 中的 Kaleidoscope 示例已被破坏,至少在 MSVC++ x64 中已经破坏了很长一段时间,也许几个月。出于同样的原因,它在 MCJIT 和他们的新 Orc JIT 框架中不起作用。

// Get the address of the JIT'd function in memory.
auto ExprSymbol = J.findUnmangledSymbol("__anon_expr");

这个表达式returns 为空,结果导致空指针错误。我现在猜不出如何解决,因为那里的调用树太深,可能需要~几天的调试。但从理论上讲,这段代码是有教育意义的,不应该给新手带来麻烦。所以也许我做错了什么。

来自 llvm 邮件列表的 Lang Hames 能够回答这个问题。 COFFObjectFile::getSymbolFlags 方法似乎根本没有启用 SF_Export 标志,因此对于 Windows 平台中 Kaleidoscope 的 findSymbol 方法,所有创建的符号都不可见。不过,可以访问未导出的符号,因此可以采取某种解决方法。

对我来说,解决此问题的最简单方法是修补 findMangledSymbol 函数,调用 CompileLayer.findSymbolIn 并将 bExportedSymbolsOnly 设置为 false。它不能解决问题,但可以避免症状。