我最近一直在看一些由 llvm-gcc 生成的 LLVM 程序集,我注意到一个反复出现的声明,我不确定它的用途。
例如,下面的 C 程序:
int main(void)
{
void (*f)(void) = (0x21332);
f();
}
当使用“llvm-gcc -emit-llvm -S”编译时,将产生以下代码(不相关部分已删除):
define i32 @main() nounwind {
entry:
%retval = alloca i32 ; <i32*> [#uses=1]
%f = alloca void ()* ; <void ()**> [#uses=2]
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
store void ()* inttoptr (i64 135986 to void ()*), void ()** %f, align 4
%0 = load void ()** %f, align 4 ; <void ()*> [#uses=1]
call void %0() nounwind
br label %return
我对该行的目的感兴趣:
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
似乎没有做任何事情,因为它分配给的变量永远不会再次使用,并且 bitcast 本身毫无意义。我能想到的是,它实际上是作为 nop 插入的,用于以后的代码生成/分析目的,表明代码的有趣部分。