что именно происходит, когда я компилирую инструкцию __atomic_add_fetch - PullRequest
0 голосов
/ 16 мая 2019

У меня есть инструкция в моем коде, вызывающая функцию __ atomic_add_fetch .Когда я компилирую этот код, я получаю ошибку компиляции, как показано ниже:

ошибка: неопределенная ссылка на '__atomic_fetch_add_8'

Я действительно не мог понять, почему он выбрасывает неопределенную ссылкуна __atomic_fetch_add_8, когда я звоню __atomic_add_fetch.Может ли кто-нибудь помочь мне понять, что именно происходит во время компиляции этого кода?

Примечание: я специально пытаюсь понять, "что происходит внутри, что переводит __atomic_add_fetch в __atomic_fetch_add_8".Не решение проблемы с компиляцией.

1 Ответ

7 голосов
/ 16 мая 2019

Вы должны использовать стандартизированный atomic_fetch_add.

В любом случае, похоже, что ваш __atomic_fetch_add с данным типом аргумента (предположительно, 8-байтовым целым числом) не может быть преобразован в инструкцию (ы) сборки на вашей платформе, поэтому он становится разрешенным вызовом функции для который вам нужно будет связать libatomic (-latomic).

Редактировать с деталями:

В gcc __atomic_fetch_add представляется встроенным компилятором, используемым для реализации stdatomic.h atomic_fetch_and_explicit (это просто простое имя макроса для него). Как я уже отмечал, вам действительно следует использовать стандартное имя atomic_fetch_add_explicit, а не непереносимые детали реализации, которыми является __atomic_fetch_add.

Несмотря на это, проблема в том, что gcc и clang не реализуют atomic_fetch_and_explicit с инструкциями по ARM (в отличие от ARM64 или x86-64), но вместо этого они генерируют вызов функции (с использованием глобальной блокировки) из библиотеки libatomic. Название функции, кажется, получено из числа байтов в целом числе, к которому вы пытаетесь получить fetch_add (__atomic_fetch_add_8 если вы fetch_adding к _Atomic uin64_t __atomic_fetch_add_4 если вы fetch_adding к _Atomic uin32_t и т. Д.).

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

...