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 >