LLVM 学习记录:如何添加一个 builtin 函数 - 2

Posted by 叉叉敌 on May 24, 2024

需要主要有一个地方。

如果是 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 这个里面是不会生效的。