Библиотеку freebl в NSS не удается собрать должным образом (как часть Firefox) из-за заголовка emmintrin.h из Clang 3.7, вызывающего ошибки, которые, как я предполагаю, были вызваны отсутствующим флагом -msse2. Даже при этом флаге исходный файл, который вызывает этот заголовок, не работает.
14:08.94 d:/gecko-dev-release/security/nss/lib/freebl/intel-gcm-wrap.c(123,78) :
error(clang): passing 'int' to parameter of incompatible type '__m128i' (vecto
r of 2 'long long' values)
14:08.94 _mm_storeu_si128((__m128i*)gcm->CTR, _mm_shuffle_epi8(_mm_add_epi32
(ONE, _mm_shuffle_epi8(_mm_loadu_si128((__m128i*)gcm->CTR), BSWAP_MASK)), BSWAP_
MASK));
14:08.94
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
14:08.94 c:\Program Files\LLVM\bin\..\lib\clang\3.7.0\include\emmintrin.h(630,36
) : note(clang): passing argument to parameter '__b' here
14:08.94 _mm_add_epi32(__m128i __a, __m128i __b)
14:08.94 ^
14:08.94 1 error generated.
14:08.96 intel-gcm-wrap.c
14:08.99 d:/gecko-dev-release/security/nss/lib/freebl/intel-gcm-wrap.c(123) : er
ror C2164: '_mm_shuffle_epi8' : intrinsic function not declared
14:08.99 d:/gecko-dev-release/security/nss/lib/freebl/intel-gcm-wrap.c(123) : er
ror C2284: '_mm_shuffle_epi8': illegal argument to intrinsic function, parameter
1
14:08.99 d:/gecko-dev-release/security/nss/lib/freebl/intel-gcm-wrap.c(123) : er
ror C2284: '_mm_shuffle_epi8': illegal argument to intrinsic function, parameter
2
14:08.99 d:/gecko-dev-release/security/nss/lib/freebl/intel-gcm-wrap.c(123) : er
ror C2440: 'function' : cannot convert from '' to '__m128i'
14:08.99 clang-cl.exe: error: clang frontend command failed with exit code 2 (us
e -v to see invocation)
14:09.00 ../../coreconf/rules.mk:384: recipe for target 'd:/gecko-dev-release/ob
jdir/security/nss/lib/freebl/intel-gcm-wrap.obj' failed
14:09.00 mozmake.EXE[7]: *** [d:/gecko-dev-release/objdir/security/nss/lib/freeb
l/intel-gcm-wrap.obj] Error 2
14:09.00 Makefile:568: recipe for target 'libs' failed
14:09.00 mozmake.EXE[6]: *** [libs] Error 2
14:09.00 Makefile:468: recipe for target 'libs-nss/lib/freebl' failed
14:09.00 mozmake.EXE[5]: *** [libs-nss/lib/freebl] Error 2
14:09.00 mozmake.EXE[5]: *** Waiting for unfinished jobs....
14:11.30 d:/gecko-dev-release/config/recurse.mk:74: recipe for target 'config/ex
ternal/nss/target' failed
14:11.30 mozmake.EXE[4]: *** [config/external/nss/target] Error 2
14:11.30 d:/gecko-dev-release/config/recurse.mk:36: recipe for target 'compile'
failed
14:11.30 mozmake.EXE[3]: *** [compile] Error 2
14:11.30 d:/gecko-dev-release/config/rules.mk:541: recipe for target 'default' f
ailed
14:11.30 mozmake.EXE[2]: *** [default] Error 2
14:11.30 d:/gecko-dev-release/client.mk:400: recipe for target 'realbuild' faile
d
14:11.30 mozmake.EXE[1]: *** [realbuild] Error 2
14:11.31 client.mk:171: recipe for target 'build' failed
14:11.31 mozmake.EXE: *** [build] Error 2
14:11.36 0 compiler warnings present.
Вы можете просмотреть исходный каталог Вот.
Согласно Clang Внутренние Руководство:
__extension__
: Форма выражения этого расширения приводит к тому, что любое вычисляемое подвыражение принимается как целочисленное константное выражение.
Если мы посмотрим на текущее определение, которое имеет для Clang _mm_suffle_epi32
становится ясно, что это описано выше как «целочисленное константное выражение».
Просматривая историю для этого функционального макроса, кажется, что он был изменен для использования __extension__
ключевое слово для того, чтобы «Исправить векторные макросы для правильной проверки типов аргументов», и затем это изменение было со временем практически отменено, как вы можете видеть из текущего определения.
Таким образом, кажется, что это ошибка библиотеки Clang. _mm_shuffle_epi32
не самая документированная особенность на планете, но исследование, которое я обнаружил, подразумевало, что оно должно привести к __mm128i
, Возможно, если они хотят правильно проверить типы аргументов, они должны объявить это как [встроенную?] Функцию, а не как макрос?
Когда я пытался обсудить это на различных IRC-каналах, никто не ответил, так что … я подумал, что просто поставлю это здесь для ответа на ваш вопрос, потому что это слишком долго для комментария.