On Thu, 01 Aug 2019 08:01:54 +0300, Ard Biesheuvel said: > > ERROR: "crypto_aegis128_decrypt_chunk_simd" [crypto/aegis128.ko] undefined! > > ERROR: "crypto_aegis128_update_simd" [crypto/aegis128.ko] undefined! > > ERROR: "crypto_aegis128_encrypt_chunk_simd" [crypto/aegis128.ko] undefined! > > make[1]: *** [scripts/Makefile.modpost:105: modules-modpost] Error 1 > > make: *** [Makefile:1299: modules] Error 2 > Which compiler version are you using? All references to the > crypt_aegis128_xx_simd() routines should disappear if > CONFIG_CRYPTO_AEGIS128_SIMD is not set (in which case have_simd will > always be false and so the compiler should optimize away those calls). gcc 9.1.1 obviously doesn't think it can be optimized away. Apparently, it's not smart enough to realize that nothing sets have_simd in any of the functions and therefor it's guaranteed to be zero, and it can do dead code optimization based on that. Now, if we had something like: #ifdef CONFIG_CRYPTO_AEGIS_128_SIMD static bool have_simd; #else #define have_simd (0) #endif then that should be enough to tell the compiler it can optimize it away, except that then runs into problems here: if (IS_ENABLED(CONFIG_CRYPTO_AEGIS128_SIMD)) have_simd = crypto_aegis128_have_simd(); because it will whine about the lack of an lvalue before it optimizes the assignment away...