我把问题归结为一个小例子.这是我正在使用的LLVM汇编程序代码(在foo.ll中):
target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-pc-linux-gnu"
define fastcc i32 @foo(i32) {
entry:
%x = add i32 %0, 1
ret i32 %x
}
define i32 @main(i32, i8**) {
entry:
%2 = call i32 @foo(i32 %0)
ret i32 %2
}
Run Code Online (Sandbox Code Playgroud)
然后我编译:
clang -O1 -o foo foo.ll
Run Code Online (Sandbox Code Playgroud)
......当我运行它时,我得到:
Illegal instruction (core dumped)
Run Code Online (Sandbox Code Playgroud)
...所以我启动我的调试器,看到这个:
Program received signal SIGILL, Illegal instruction.
0x00000000004004d0 in main ()
(gdb) bt
#0 0x00000000004004d0 in main ()
(gdb) disas
Dump of assembler code for function main:
=> 0x00000000004004d0 <+0>: ud2
End of assembler dump.
(gdb)
Run Code Online (Sandbox Code Playgroud)
请注意,如果我更改以下任一项,程序执行正常:
作为参考,"clang -v"是:
clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
此外,如果它有帮助,这是"objdump -d foo"的结果.
小智 5
您的被叫方被标记为“fastcall”,但呼叫没有。调用约定需要匹配,否则它是未定义的行为,而后者又会被优化为“ud2”,或者根本没有。这是一个常见问题:http : //llvm.org/docs/FAQ.html#why-does-instcombine-simplifycfg-turn-a-call-to-a-function-with-a-mismatched-calling-convention-into -unreachable-why-not-make-the-verifier-reject-it
| 归档时间: |
|
| 查看次数: |
1746 次 |
| 最近记录: |