C++ __builtin_* 函数源代码

C++ __builtin_* functions source codes

我想了解如何在 C++ 中找到 __builtin 函数的源代码,例如 __builtin_cbrt()。如果你知道,你能帮帮我吗?

I want to learn how can I find

首先熟悉您正在使用的语言 - 学习 C 和 C++ 编程语言。了解 gitautotools 等工具以及这些编程语言的环境。熟悉浏览文件所需的工具集 - 至少 grep,但我推荐它(方式)更快的替代品 - “the silver searcher”agack,但要注意工具像 ctags 或 GNU Global。

然后研究。 GNU 项目是开源的 - 很容易找到 GNU 项目的源代码,现在它们甚至在 github.

上有镜像

那就只是一种“感觉”或“体验”。当然,一个项目将在名为“builtins.c”或类似名称的文件中包含内置函数。保持好奇、理性和创造性。如果你想在代码库中添加一个内置函数,你会把它放在哪里?熟悉您正在使用的项目结构。并期望大型和旧项目的东西散落在各处。

首先我找到gcc sources with builtins.def (BUILT_IN_CBRT, "cbrt", and some references of BUILT_IN_CBRT in builtins.c.

克隆 gcc 存储库后,我扫描 BUILT_IN_CBRT 宏名称。浏览代码将我带到 CASE_CFN_CBRT 宏名称,这将我带到 fold-const-call.c:

CASE_CFN_CBRT:
  return do_mpfr_arg1 (result, mpfr_cbrt, arg, format);

根据文件的名称fold-const-call.c我怀疑这部分代码仅在折叠常量调用时被占用。

从那里我可以浏览 google 关于 mpfr_cbrt 符号,它引导我到 GNU MPFR 库。我在 github 上找到了 MPRF 库的克隆并搜索名为 cbrt 的文件,我在 MPRF 库中找到了带有 cbrt 源的 cbrt.c with mpfr_cbrt() sources。我怀疑,当 __builtin_cbrt 折叠在常量表达式中时,这是将被调用并计算数字的 cbrt 的代码。

当不在 constnat 表达式中时,我怀疑 [fold_const_call_ss]https://code.woboq.org/gcc/gcc/fold-const-call.c.html#_ZL18fold_const_call_ssP10real_value11combined_fnPKS_PK11real_format) is not called at all, instead some fold_const_* function returns 到 gcc 表达式不能不断折叠所以调用实际 cbrt() 生成标准函数。