Search code examples
c++aesqt-creator

inlining failed in call to always_inline, target specific option mismatch in Qt


I am doing AES encryption using AES instruction set in C++ in QtCreator, this is my code:

void aes256_enc(int8_t *plainText, int8_t *cipherText, __m256i *exp_enc_key)
{
    __m256i m = _mm256_loadu_si256((__m256i *) plainText);

    m = _mm256_xor_si256(m, exp_enc_key[0]);
    for (int i = 1; i < 10; i++) {
        m = _mm256_aesenc_epi128(m, exp_enc_key[i]);
    }
    m = _mm256_aesenclast_epi128(m, exp_enc_key[10]);

    _mm256_storeu_si256((__m256i *) cipherText, m);
}

And this is in my .pro file:

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt

QMAKE_CXXFLAGS +=-march=native -maes

SOURCES += \
        main.cpp \
    aes256.cpp

HEADERS += \
    aes256.h

But I still get error like:

/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include/vaesintrin.h:50: error: inlining failed in call to always_inline ‘__m256i _mm256_aesenc_epi128(__m256i, __m256i)’: target specific option mismatch
   50 | _mm256_aesenc_epi128 (__m256i __A, __m256i __B)
      | ^~~~~~~~~~~~~~~~~~~~

My CPU is i5-4670.


Solution

  • In your .pro file add this line if your target processor support AVX-512 aka vaes:

    QMAKE_CXXFLAGS += -mvaes
    

    In vaesintrin.h this define seems to require vaes

    /* Default attributes for YMM forms. */
    #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("vaes"), __min_vector_width__(256)))
    

    As your processor i5-4670 does not support it, try this :

    DEFINES += "NO_AVX512=1"