【发布时间】:2011-12-10 20:32:16
【问题描述】:
是否有一个网站列出了各种平台以及它们对 GCC 的 atomic built-ins 以及各种 GCC 版本的支持?
编辑:
为了更清楚: GCC 添加 _sync... 作为其支持的平台上的内在函数。在所有其他平台上,它将这些保留为普通函数声明,但不提供实现。这必须由某个框架来完成。
所以问题是:GCC 为哪些平台提供哪些内在函数而不需要添加函数实现?
【问题讨论】:
是否有一个网站列出了各种平台以及它们对 GCC 的 atomic built-ins 以及各种 GCC 版本的支持?
编辑:
为了更清楚: GCC 添加 _sync... 作为其支持的平台上的内在函数。在所有其他平台上,它将这些保留为普通函数声明,但不提供实现。这必须由某个框架来完成。
所以问题是:GCC 为哪些平台提供哪些内在函数而不需要添加函数实现?
【问题讨论】:
[虽然这是一个老问题,但我想我应该更新并完成答案]
我不知道每个架构版本和每个 gcc 版本的表,描述了支持的内置插件。
gcc 的 __sync 内置函数从 4.1 版开始就存在(例如,参见 gcc 4.1.2 manual。如上所述:
并非所有目标处理器都支持所有操作。如果无法在目标处理器上执行特定操作,则会生成警告并调用外部函数。外部函数将与内置函数具有相同的名称,并带有一个附加后缀“_n”,其中 n 是数据类型的大小。
因此,当没有特定架构的实现时,会出现编译警告,我猜是链接时错误,除非您提供具有适当名称的所需函数。
在 gcc 4.7 之后还有 __atomic 内置函数和 __sync 内置函数已被弃用。 例如,看看 Fedora 如何使用 gcc __sync 和 __atomic here
【讨论】:
我不知道是否有这样的列表,但是 http://gcc.gnu.org/projects/cxx0x.html 表示自 GCC 4.4 起支持原子。
GCC libstdc++ 在内置函数 `__sync_fetch_and_add' 和朋友 (http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Atomic-Builtins.html) 之上实现了
这些函数可以在目标的机器描述中使用特定于机器的扩展器(通常在名为 `sync.md' 的文件中)进行扩展,或者在缺少此类扩展器时使用 CAS 循环。如果 `sync.md' 文件的存在表明适当的原子支持,那么您可以计算 MIPS、i386、ARM、BlackFin、Alpha、PowerPC、IA64 和 Sparc。
【讨论】: