我发现在LLVM中有一些内置函数,比如llvm.memcpy
、llvm.va_start
。
然而我不知道它们为什么存在以及其他函数为什么不是内置的。例如,由于memcpy
的原型在string.h
中,为什么其他函数(如strcpy
)不被视为内置函数呢?
我注意到前端在某些情况下可能会生成特殊的内置函数调用。对于一个简单的例子:
#include<string.h>
int foo(void){
char str[10] = "str";
return 0;
}
clang 生成的 foo
的 LLVM IR 如下:
define i32 @foo() #0 {
entry:
%str = alloca [10 x i8], align 1
%0 = bitcast [10 x i8]* %str to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* getelementptr inbounds ([10 x i8]* @foo.str, i32 0, i32 0), i64 10, i32 1, i1 false)
ret i32 0
}
llvm.memcpy
在IR中被调用,但不在源代码中。但是前端是否可以生成没有这个内部函数的LLVM IR呢?
我还查阅了一份关于llvm
语言参考的早期版本文档,发现一些特殊函数如malloc
,free
包含在LLVM指令中(显然它们已不再存在)。
那么,llvm
指令的设计背后有什么深意呢?
llvm.memcpy
的(伪)IR会是什么样子? - Hongxu Chen