[llvm-dev] Bug in compiling libc on AArch64 (rasberry pi4)

Juergen Ilse via llvm-dev llvm-dev at lists.llvm.org
Sun Nov 29 17:22:22 PST 2020


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 at .
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 at usenet-verwaltung.de)


More information about the llvm-dev mailing list