Bug in compiling libc on AArch64 (rasberry pi4)

Hello,

i got errors, when i tried to compile llvm-11.0.0 on rasberry pi4 (8 GB model),
I tried to compile llvm-11.0.0 with gcc-8.3.0 as it was per default installed
on the RaspiOS 64 Bit Version. First i git error Messages, because gcc does not know anything about the command-line option "--print-resource-dir", which was
used to detect an llvm directory. To get around that issue, i used a script
named g++ instead of the real compiler found in /usr/bin/g++. The script
looked like this:

#!/bin/sh
if test "x$1" = "x--print-resource-dir"; then
        echo /usr/local/lib/clang/11.0.0
else
        /usr/bin/`basename $0` "$@"
fi

That was a (quick and dirty) workaround for this first issue. If you know
a better workaround, please let me know.

The second error was, that one test tried to include <malloc/malloc.h>, but
on RaspiOS, the include file malloc.h is not in a subdirectory "malloc".

To avoid this error, i changed temporarily my system with creating a
directory /usr/include/malloc and creating a softlink from
/usr/include(malloc.h to /usr/include/malloc/malloc.h.This workaround was
more simple than searching and patching the CMakefiles to test for
<malloc.h> and <malloc/malloc.h>

The next error was with testing cpu geatures. I found a special and (i hope)
portable workaround for the case, that there are no special cpu features.

I simply applied the following patch to the file
llvm-project-11.0.0/libc/cmake/modules/cpu_features/check_cpu_features.cpp.in:

+++ llvm-project-11.0.0/libc/cmake/modules/cpu_features/check_cpu_features.cpp.in.orig 2020-11-30 00:18:12.569056896 +0100
@@ -17,7 +17,7 @@

int main(int, char **) {
   const char *strings[] = {
- @DEFINITIONS@ ""
+ @DEFINITIONS@
   };
   const size_t size = sizeof(strings) / sizeof(strings[0]);
   for (size_t i = 0; i < size; ++i) {

With adding the empty string in this line, there will be no change in the
case, where @DEFINITIONS@ is empty (because ISO C++ will concatenate the
last string in @DEFINITIONS@ with the empty string, which will result in
the same string), but it will lead to a non empty list of strings
consisting only of the emptystring in the case of an empty @DEFINITIONS@.
With an empty @DEFINITIONS@, the above source will result in syntax errors,
because C++ does not allow "const char *strings[] = { };" ...

For the next error, i didn't find a workaround, because my C++ knowledge
is not good enough to find a fix for this error:

[ 76%] Building CXX object projects/libc/src/math/CMakeFiles/libc.src.math.modff_objects.dir/modff.cpp.o
In file included from /usr/src/llvm-11/llvm-project-11.0.0/libc/utils/FPUtil/ManipulationFunctions.h:9,
                 from /usr/src/llvm-11/llvm-project-11.0.0/libc/src/math/modff.cpp:10:
/usr/src/llvm-11/llvm-project-11.0.0/libc/utils/FPUtil/FPBits.h:103:37: error: expected ‘)’ before ‘x’
   explicit FPBits<long double>(XType x) {
                               ~ ^~
                                     )
/usr/src/llvm-11/llvm-project-11.0.0/libc/utils/FPUtil/FPBits.h: In instantiation of ‘__llvm_libc::fputil::FPBits<T>::FPBits(XType) [with XType = float; typename __llvm_libc::cpp::EnableIf<__llvm_libc::cpp::IsSame<T, XType>::Value, int>::Type <anonymous> = 0; T = float]’:
/usr/src/llvm-11/llvm-project-11.0.0/libc/utils/FPUtil/ManipulationFunctions.h:88:13: required from ‘T __llvm_libc::fputil::modf(T, T&) [with T = float; typename __llvm_libc::cpp::EnableIf<__llvm_libc::cpp::IsFloatingPointType<Type>::Value, int>::Type <anonymous> = 0]’
/usr/src/llvm-11/llvm-project-11.0.0/libc/src/math/modff.cpp:15:31: required from here
/usr/src/llvm-11/llvm-project-11.0.0/libc/utils/FPUtil/FPBits.h:81:13: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     *this = *reinterpret_cast<FPBits<T> *>(&x);
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/src/llvm-11/llvm-project-11.0.0/libc/utils/FPUtil/FPBits.h:81:11: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     *this = *reinterpret_cast<FPBits<T> *>(&x);
     ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [projects/libc/src/math/CMakeFiles/libc.src.math.modff_objects.dir/build.make:63: projects/libc/src/math/CMakeFiles/libc.src.math.modff_objects.dir/modff.cpp.o] Fehler 1
make[1]: *** [CMakeFiles/Makefile2:27781: projects/libc/src/math/CMakeFiles/libc.src.math.modff_objects.dir/all] Fehler 2
make: *** [Makefile:152: all] Fehler 2

Can you please try to fix those errors in the next release of llvm?
I would like to compile llvm ibcuding libc on 64 Bit Version of RaspiOS
on my Raspi4 ... A "MinSizeRel" build with all other subproject was
successful on my raspi4, but libc led to the above issues (and i think
i found an acceptable workaround for one of them, see the patch above).

I hope, this information about trying to compile LLVM on RaspiOS 64 Bit
is helpful to make llvm better and more portable.

Thanks in advance,
  Juergen Ilse (juergen@usenet-verwaltung.de)

Hello,

Thanks for the detailed report. We do test libc build on Aarch64 regularly but we use the Ninja generator and clang for our compiler. The problems you are seeing are perhaps linked to using gcc as a compiler. We are working on getting the build going gcc. We will also add a CI builder testing everything end-to-end with gcc.

Thanks,
Siva Chandra