需要主要有一个地方。
如果是 intrinsic*.td 里面使用了,ClangBuiltin<>, 那么就不需要再 CGBuiltin.cpp 里面添加枚举了。
先来看一组定义的差别
定义 1
def int_stackrestore : DefaultAttrsIntrinsic<[], [llvm_anyptr_ty]>,
ClangBuiltin<"__builtin_stack_restore">;
定义 2
def int_stackrestore : DefaultAttrsIntrinsic<[], [llvm_anyptr_ty]>;
这两个定义的主要区别在于是否将 LLVM 固有函数与 Clang builtin 函数关联。这确实是一个关键差别,影响到 Clang 如何处理 builtin 函数以及它们在 LLVM IR 中的表示。
ClangBuiltin<"__builtin_stack_restore">
表示这个固有函数在 Clang 中对应于 builtin 函数 __builtin_stack_restore。这意味着,当你在 C/C++ 代码中使用 __builtin_stack_restore 时,Clang 会将其转换为 LLVM IR 中的 llvm.stackrestore builtin 函数调用。
没看懂,举个例子?
比如在 intrinsic.td 里面定义了
https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/IR/Intrinsics.td
def int_stackrestore : DefaultAttrsIntrinsic<[], [llvm_anyptr_ty]>,
ClangBuiltin<"__builtin_stack_restore">;
其中ClangBuiltin<"__builtin_stack_restore">;
Clang 内建函数关联:
ClangBuiltin<”__builtin_stack_restore”> 表示这个固有函数在 Clang 中对应于内建函数 __builtin_stack_restore。即,当你在 C/C++ 代码中使用 __builtin_stack_restore 时,Clang 会将它转换为 LLVM IR 中的 llvm.stackrestore 固有函数调用。
有了这个,就不需要在 CGbuiltin.cpp 里面添加枚举了,添加了也不会走到枚举这里的。
再来看看 ClangBuiltin<> 这个定义说的啥?
/// ClangBuiltin - If this intrinsic exactly corresponds to a Clang builtin, this
/// specifies the name of the builtin. This provides automatic CBE and CFE
/// support.
class ClangBuiltin<string name> {
string ClangBuiltinName = name;
}
意思就是 ClangBuiltin 如果此内在 intrinsic 函数能完全对应于 Clang builtin 函数,则此指定 builtin 的名称,会自动支持 clang 前后端。
还没看懂?别开玩笑了,我的零基础的都能看懂~
还有一个问题,估计你和我一样,好奇,如果是 2 边都添加了,会怎么样?
我试了,如过 intrinsic.td 里面添加了,又在 CGBuiltin.cpp 里面添加了。CGBuiltin.cpp 这个里面是不会生效的。