On 6 April 2017 at 13:54, Maxim Uvarov <maxim.uva...@linaro.org> wrote:
> I'm ok with this patch. That can go to master, not need for api-next.
>
> Maxim.

We need this to be in api-next as well so that we can drop this from V3.

Thank you,
Honnapppa

>
> On 04/06/17 20:09, Brian Brooks wrote:
>> On 04/05 01:24:44, Dmitry Eremin-Solenikov wrote:
>>> On 04.04.2017 23:34, Brian Brooks wrote:
>>>> On 04/04 23:27:51, Dmitry Eremin-Solenikov wrote:
>>>>> On 04.04.2017 23:26, Brian Brooks wrote:
>>>>>> On 04/04 23:04:10, Dmitry Eremin-Solenikov wrote:
>>>>>>> On 04.04.2017 21:47, Brian Brooks wrote:
>>>>>>>> Signed-off-by: Brian Brooks <brian.bro...@arm.com>
>>>>>>>
>>>>>>> Brian,
>>>>>>>
>>>>>>> how does this fail with clang on ARMv8? Could you please include error
>>>>>>> message in the commit message?
>>>>>>
>>>>>> Well, you can't pass -mcx16 to clang when compiling natively on ARM.
>>>>>>
>>>>>> This is what it will look like:
>>>>>>
>>>>>>   clang: error: argument unused during compilation: '-mcx16'
>>>>>>
>>>>>> and Autotools will halt the rest of the build.
>>>>>
>>>>> Does this happen during configure stage or when building?
>>>>
>>>> You will see that error during build. That is when clang is invoked.
>>>> But, the bug is in configure.ac where -mcx16 is added to CFLAGS when
>>>> it shouldn't be.
>>>
>>> Then why isn't it detected by configure script?
>>
>> The configure script is generated by Autoconf. Autoconf takes the
>> configure.ac file as input. The autoconf tool is invoked when you
>> run this project's ./bootstrap script.
>>
>> configure.ac is a combination of shell script and M4 (a macro language).
>> If something in configure.ac doesn't look like shell, it is likely
>> a macro.
>>
>> Lets step through it:
>>
>>   0 if test "${CC}" != "gcc" -o ${CC_VERSION_MAJOR} -ge 5; then
>>   1    my_save_cflags="$CFLAGS"
>>   2
>>   3    CFLAGS=-mcx16
>>   4    AC_MSG_CHECKING([whether CC supports -mcx16])
>>   5    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
>>   6          [AC_MSG_RESULT([yes])]
>>   7          [ODP_CFLAGS="$ODP_CFLAGS $CFLAGS"],
>>   8          [AC_MSG_RESULT([no])]
>>   9          )
>>  10    CFLAGS="$my_save_cflags"
>>  11 fi
>>
>> Line 0 is specifically checking for whether we are using GCC or
>> whether whatever compiler we're using's version is greater than
>> or equal to 5.
>>
>> Line 1 saves CFLAGS into a temporary variable, and line 10 restores
>> it. This technique is useful for when you want to avoid altering
>> CFLAGS until the very end of the configure.ac has been processed.
>> The reason is that the compiler may be invoked as configure.ac is
>> processed and you want a pristine set of CFLAGS when you do this.
>>
>> Line 3 adds -mcx16 to CFLAGS. The original author probably wants
>> to compile a small program with -mcx16 at this point in the
>> processing of the configure.ac file. If we know we're not running
>> on an x86-based chip, we can skip this entirely. More on that later.
>>
>> Line 4 is a macro to print something to inform the user that we
>> are checking "whether CC supports -mcx16".
>>
>> Lines 5-9 will invoke the compiler with a provided program
>> (an empty program: AC_LANG_PROGRAM([])) and execute lines 6 and 7
>> on success or lines 7 and 8 on failure. The interesting part is
>> line 7 which appends CFLAGS to ODP_CFLAGS on success. We know
>> that CFLAGS contains -mcx16, but we must also be mindful that
>> there is nothing else in CFLAGS otherwise multiple consecutive
>> uses of this technique would end up appending redundant things
>> to CFLAGS.
>>
>> So, what happens when the configure script is run on ARM with
>> CC=clang?
>>
>>   checking whether CC supports -mcx16... yes
>>
>> Wat... umm... let's try something else...
>>
>>   $ touch poof.c
>>   $ clang -mcx16 poof.c
>>   clang: warning: argument unused during compilation: '-mcx16'
>>   (.text+0x30): undefined reference to `main'
>>   clang: error: linker command failed with exit code 1 (use -v to see 
>> invocation)
>>
>> OK. So, why does it fail when we do a 'make'? Because of -Werror.
>>
>>   $ clang -Werror -mcx16 poof.c
>>   clang: error: argument unused during compilation: '-mcx16'
>>
>> -Werror is in ODP_CFLAGS, not CFLAGS used throughout the processing
>> of the configure.ac file.
>>
>> An understandable argument is to add that flag to CFLAGS, but we can
>> do better. Much better. We can skip this onzin entirely because we
>> already know the architecture that we're targeting (the ${host}
>> variable). Skipping that saves time.
>>
>> So, we only check for the x86-based -mcx16 flag if we're targeting
>> an x86-based processor:
>>
>>  if "${host}" == i?86* -o "${host}" == x86*; then
>>    if test "${CC}" != "gcc" -o ${CC_VERSION_MAJOR} -ge 5; then
>>
>>      [..]
>>
>>    fi
>>  fi
>>
>> It is that simple! :)
>>
>>> --
>>> With best wishes
>>> Dmitry
>

Reply via email to