当我编译指令__atomic_add_fetch时会发生什么

时间:2019-05-16 12:53:31

标签: c++ gcc clang atomic android-x86

我的代码调用函数 __ atomic_add_fetch 中有一条指令。编译此代码时,出现如下编译错误

  

错误:对'__atomic_fetch_add_8'的未定义引用

我真的不明白为什么我在调用__atomic_add_fetch时会抛出未定义的__atomic_fetch_add_8引用。有人可以帮我理解在编译此代码时到底发生了什么吗?

注意:我特别希望了解“内部正在发生的事情,将__atomic_add_fetch转换为__atomic_fetch_add_8”。不是解决编译问题的解决方案。

1 个答案:

答案 0 :(得分:7)

您应该使用标准化的atomic_fetch_add

无论如何,看起来您的__atomic_fetch_add具有给定的参数类型(大概是8个字节的整数)无法解析为平台上的汇编指令,因此它被解析为一个函数您需要为其链接libatomic-latomic)的呼叫。

详细信息编辑:

在gcc上,__atomic_fetch_add似乎是用于实现stdatomic.h的{​​{1}}(仅是其简单宏名称)的内置编译器。如前所述,您实际上应该使用标准名称atomic_fetch_and_explicit,而不是atomic_fetch_add_explicit的不可移植的实现细节。

无论如何,问题似乎是gcc和clang在ARM上没有使用指令来实现__atomic_fetch_add(与ARM64或x86-64不同),而是它们生成了对(global-lock-using )函数从atomic_fetch_and_explicit库中获取。该函数的名称似乎是从您尝试fetch_add到的整数中的字节数派生的 ({libatomic如果您是fetch_adding到__atomic_fetch_add_8 _Atomic uin64_t(如果您要提取到__atomic_fetch_add_4等)。

https://gcc.godbolt.org/z/S67g7b