问题
llc给出了以下错误:
LLVM错误:符号上不受支持的重定位
详细编译流程
我正在为编译器的中级IR (MIR)实现一个LLVM前端,在我将各种方法转换成许多bitcode文件之后,我将它们链接(llvm-link)、优化它们(opt)、将它们转换为机器代码(llc)、使它们成为共享库(用于链接器包装的clang)并动态加载它们。对于我正在编译的一些方法,llc步骤失败了!
步骤1:llvm-link:合并多个bitcode文件
我可能有许多相互调用的函数,所以我会llvm-link不同的bitcode文件,它们可以相互交互。这一步没有问题。示例:
llvm-link function1.bc function2.bc -o lnk.bc
步骤2:opt:运行优化传递
就目前而言,我使用以下方法:
opt -O3 lnk.bc -o opt.bc
这个步骤没有问题,但那是导致问题的原因!此外,这也是必要的,因为在未来我将需要这个步骤来传递额外的通行证,例如loop-unroll
步骤3: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。这个命令在我在这个答案上面写的错误中失败。
步骤4:clang:生成共享对象
对于Step 3失败的情况,没有达到这个步骤。如果llc成功了,这个步骤也会成功!
更多信息
配置
下面的代码在运行在arm设备上的llvm3.6上运行。
我注意到的事情
-O3 (或任何其他级别)和opt步骤,那么llc就可以工作了。llc中忽略了它们,llc仍然会失败。这让我觉得是opt -O<level>引起了这个问题。llc,它就能工作,但是我无法运行opt允许的特定传递,所以这对我来说不是一个选项。llc上使用llc模型,它可以生成obj.o,但是我将在用它创建.so时遇到问题!问题
opt有-relocation-model选项?这不应该只是llc的事吗?我尝试过在opt和llc中将其设置为pic,但仍然失败。clang,是因为它有一个链接器的包装器来获取.so。有没有办法用LLVM工具来执行这个步骤呢?发布于 2017-07-25 20:25:55
首先,不要使用llc或opt。这些是开发人员端的工具,不应该在任何生产环境中使用。而不是这样,通过LLVM库实现您自己的适当优化和协同退化运行时。
至于这个特定的bug,拇指代码生成器可能包含一些bug。请减少问题并报告。或者根本不使用拇指模式:)
https://stackoverflow.com/questions/45306907
复制相似问题