llc
给了我以下错误:
LLVM错误:符号
上的不支持重定位
我正在为编译器的中级IR(MIR)实现LLVM前端,在将各种方法转换为许多bitcode文件之后,我将它们链接起来(llvm-link
),优化它们({{1将它们转换为机器代码(opt
),使它们成为共享库(llc
用于它的链接器包装器),并动态加载它们。
对于我正在编译的一些方法,clang
步骤失败了!
llc
:合并许多bitcode文件我可能有很多函数互相调用,所以我llvm-link
可以互相交互的不同bitcode文件。这一步没有问题。例如:
llvm-link
llvm-link function1.bc function2.bc -o lnk.bc
:运行优化传递目前我正在使用以下内容:
opt
此步骤没有任何问题,但那是 CAUSES 问题!
此外,这是必要的,因为将来我需要这一步来传递额外的通行证,例如opt -O3 lnk.bc -o opt.bc
loop-unroll
:生成机器代码(PIC)我使用以下命令:
llc
我保留了我设置的特定于拱的标志,以防他们对此问题做出贡献。我正在使用llc -march=thumb -arm-reserve-r9 -mcpu=cortex-a9 -filetype=obj -relocation-model pic opt.bc -o obj.o
,因为下一步我将构建Position Independent Code
。
这个命令失败了,我在这个答案之上写了错误。
shared object
:生成共享对象对于clang
失败的情况,未达到此步骤。
如果Step 3
成功,此步骤也将成功!
以下在llvm3.6上运行,它运行在llc
设备上。
arm
步骤中省略-O3
(或任何其他级别),则opt
将起作用。llc
省略它们,llc
仍然会失败。这让我觉得llc
导致了这个问题。opt -O<level>
它会有效,但我无法运行llc
允许我的特定传递,所以这不适合我。opt
处不使用pic
模型,则可以生成llc
,但之后我将无法从中创建obj.o
!为什么会这样???
为什么.so
有opt
选项?这不应该只是一个-relocation-model
的东西吗?我已尝试在llc
和opt
设置llc
,但仍然失败。
我正在使用pic
,因为它有一个链接器的包装器来获取clang
。是否有办法使用LLVM工具执行此步骤?
答案 0 :(得分:0)
首先,不要同时使用llc或opt。这些是开发人员工具,不应在任何生产环境中使用。取而代之的是,通过LLVM库实现您自己的正确优化和代码生成运行时。
至于这个特殊的错误 - 拇指代码生成器可能包含一些错误。请减少问题并报告。或者根本不使用拇指模式:)