LLVM out of source pass build:不支持可加载模块(在 Linux 上)

Posted

技术标签:

【中文标题】LLVM out of source pass build:不支持可加载模块(在 Linux 上)【英文标题】:LLVM out of source pass build: Loadable modules not supported (on Linux) 【发布时间】:2015-01-09 15:18:27 【问题描述】:

几周前,我在 debian wheezy 上编译并安装了 LLVM(配置和制作),现在尝试从源代码编译 llvm-mutate pass。 AFAICC,llvm-mutate 遵循 cmake out of source pass build instructions。

尝试构建 llvm-mutate 时

mkdir build
cd build
cmake -DCMAKE_MODULE_PATH=/usr/local/share/llvm/cmake ../

我明白了:

-- 忽略变异 -- 此平台不支持可加载模块。

嗯? opt 和可加载通道(在 llvm_trunk/build/Debug+Asserts/lib/xxx.so)存在并且可以工作(使用 configure & make 编译,而不是 cmake)。

所以这个问题好像和cmake有关? 其他人也遇到过这样的问题,但是在 Win 上使用 cygwin:here

有什么想法吗? 谢谢 亚历克斯

【问题讨论】:

【参考方案1】:

AddLLVM cmake 模块需要一些先决条件。添加到 CMakeLists.txt:

# AddLLVM needs these
set(LLVM_RUNTIME_OUTPUT_INTDIR $CMAKE_BINARY_DIR/$CMAKE_CFG_INTDIR/bin)
set(LLVM_LIBRARY_OUTPUT_INTDIR $CMAKE_BINARY_DIR/$CMAKE_CFG_INTDIR/lib)

include(HandleLLVMOptions) # important: matches compiler flags to LLVM/Clang build
include(AddLLVM)

一些灵感来自this message。

【讨论】:

【参考方案2】:

只是为了完整起见,如果有人会遇到此错误。此错误同时在 LLVM 3.8.0 中得到修复,因此您只需包含 AddLLVM 即可构建您的插件。 HandleLLVMOption 包含文件仅有助于获得正确的编译器标志,如上文所述。

【讨论】:

【参考方案3】:

添加到 alexei 的 reply。

您也可以在CMakeLists.txt 文件中的include(AddLLVM) 行之前添加list(APPEND CMAKE_MODULE_PATH "$LLVM_CMAKE_DIR"),然后在PATH 中添加llvm-config 的LLVM 二进制目录, 调用 cmake 为

CXX=clang++ cmake -DLLVM_DIR=$(llvm-config --prefix)/share/llvm/cmake ..

【讨论】:

以上是关于LLVM out of source pass build:不支持可加载模块(在 Linux 上)的主要内容,如果未能解决你的问题,请参考以下文章

LLVM 之 IR 篇:如何基于传统 Pass 框架扩展 LLVM IR 优化器

LLVM 之 IR 篇:如何基于新 Pass 框架扩展 LLVM IR 优化器

开发和调试第一个 LLVM Pass

LLVM 之 IR 篇:如何编写内联 Pass

LLVM 之 IR 篇:如何编写内联 Pass

LLVM每日谈之五十五 浅谈对Pass的错误认知及其原因