Error building compiler-rt

Hi,

I am trying to build llvm along with clang and compiler-rt. When I run make, I am getting the following compilation error (I tried compiling llvm-3.2, which is what I need for my project, but also tried llvm-3.3 and the current llvm source from the git repository).


COMPILE: clang_linux/full-x86_64/x86_64: /home/pranav/smack-project/llvm/src/projects/compiler-rt/lib/enable_execute_stack.c
/home/pranav/smack-project/llvm/src/projects/compiler-rt/lib/enable_execute_stack.c:53:29: error: cast to 'unsigned char ’ from smaller integer type ‘unsigned int’
[-Werror,-Wint-to-pointer-cast]
unsigned char
startPage = (unsigned char*)(p & pageAlignMask);
^
/home/pranav/smack-project/llvm/src/projects/compiler-rt/lib/enable_execute_stack.c:54:27: error: cast to 'unsigned char ’ from smaller integer type ‘unsigned int’
[-Werror,-Wint-to-pointer-cast]
unsigned char
endPage = (unsigned char*)((p+TRAMPOLINE_SIZE+pageSize) & pageAlignMask);
^
2 errors generated.

On gcc --version I get the following output:
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
My operating system is a Ubuntu 12.04.1 LTS. On typing uname -a I get:
Linux pranav 3.2.0-33-generic-pae #52-Ubuntu SMP Thu Oct 18 16:39:21 UTC 2012 i686 i686 i386 GNU/Linux

Any ideas as to how to resolve this compilation error?

Thanks
Pranav

You can disable -Werror by adding the cmake flag -DLLVM_ENABLE_WERROR=OFF, which should let it just ignore that (that's also the default, so you must have turned it on somewhere)

Hi,

I see that ENABLE_WERROR is being set to off (the default value) in the config.log in the llvm build. However on grepping for WERROR in the compiler-rt folder I get the following output:

pranav@pranav:~/smack-project/llvm-3.4/src/projects/compiler-rt$ grep -Rin WERROR *
lib/asan/tests/CMakeLists.txt:38: -Werror
lib/asan/asan_malloc_mac.cc:253:// This function is currently unused, and we build with -Werror.
lib/tsan/check_cmake.sh:8:CC=clang CXX=clang++ cmake -DLLVM_ENABLE_WERROR=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON $ROOT/…/…/…/…
lib/tsan/Makefile.old:3:CXXFLAGS = -fPIE -fno-rtti -g -Wall -Werror
lib/tsan/rtl/Makefile.old:1:CXXFLAGS = -fPIE -g -Wall -Werror -fno-builtin -DTSAN_DEBUG=$(DEBUG) -DSANITIZER_DEBUG=$(DEBUG)
lib/tsan/go/buildgo.sh:68:FLAGS=" -I…/rtl -I…/… -I…/…/sanitizer_common -I…/…/…/include -m64 -Wall -Werror -Wno-maybe-uninitialized -fno-exceptions -fno-rtti -DTSAN_GO -DSANITIZER_GO -DTSAN_SHADOW_COUNT=4 $OSCFLAGS"
lib/sanitizer_common/sanitizer_platform_limits_posix.cc:410: unsigned IOCTL_FDWERRORCLR = FDWERRORCLR;
lib/sanitizer_common/sanitizer_platform_limits_posix.cc:411: unsigned IOCTL_FDWERRORGET = FDWERRORGET;
lib/sanitizer_common/sanitizer_platform_limits_posix.h:442: extern unsigned IOCTL_FDWERRORCLR;
lib/sanitizer_common/sanitizer_platform_limits_posix.h:443: extern unsigned IOCTL_FDWERRORGET;
lib/sanitizer_common/tests/CMakeLists.txt:36: -Wall -Werror -Werror=sign-compare)
lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc:177: _(FDWERRORCLR, NONE, 0);
lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc:178: _(FDWERRORGET, WRITE, struct_floppy_write_errors_sz);
make/options.mk:10:CFLAGS := -Wall -Werror
make/platform/clang_linux.mk:85:CFLAGS := -Wall -Werror -O3 -fomit-frame-pointer
make/platform/clang_darwin.mk:109:CFLAGS := -Wall -Werror -O3 -fomit-frame-pointer
make/platform/multi_arch.mk:10:CFLAGS := -Wall -Werror
make/platform/darwin_fat.mk:42:CFLAGS := -Wall -Werror

I see that -DLLVM_ENABLE_WERROR is being set in the script “lib/tsan/check_cmake.sh”. Should I disable -DLLVM_ENABLE_WERROR at this point?

Thanks
Pranav

Hi Pranav,

Dear Alexey,

Yes I am sure that the llvm, clang and compiler-rt are synced to the same version. I downloaded them all from git http://llvm.org/docs/GettingStarted.html#git-mirror

I think I need compiler-rt for my project but I’ll verify it again to see if I can proceed without it.

You are correct that compiler-rt is compiled with the just built clang. The complete command that gives an error while compiler-rt compilation is:

/home/pranav/smack-project/llvm/build/Release+Asserts/bin/clang -fPIC -Wall -Werror -O3 -fomit-frame-pointer -m64 --sysroot=/home/pranav/smack-project/llvm/src/projects/compiler-rt/SDKs/linux -c -o /home/pranav/smack-project/llvm/build/tools/clang/runtime/compiler-rt/clang_linux/full-x86_64/x86_64/SubDir.lib/enable_execute_stack.o /home/pranav/smack-project/llvm/src/projects/compiler-rt/lib/enable_execute_stack.c
/home/pranav/smack-project/llvm/src/projects/compiler-rt/lib/enable_execute_stack.c:53:29: error: cast to 'unsigned char ’ from smaller integer type ‘unsigned int’
[-Werror,-Wint-to-pointer-cast]
unsigned char
startPage = (unsigned char*)(p & pageAlignMask);

Thanks

Pranav

Dear Alexey,

Yes I am sure that the llvm, clang and compiler-rt are synced to the same
version. I downloaded them all from git
http://llvm.org/docs/GettingStarted.html#git-mirror
I think I need compiler-rt for my project but I'll verify it again to see
if I can proceed without it.
You are correct that compiler-rt is compiled with the just built clang.
The complete command that gives an error while compiler-rt compilation is:

/home/pranav/smack-project/llvm/build/Release+Asserts/bin/clang -fPIC
-Wall -Werror -O3 -fomit-frame-pointer -m64
--sysroot=/home/pranav/smack-project/llvm/src/projects/compiler-rt/SDKs/linux
-c -o
/home/pranav/smack-project/llvm/build/tools/clang/runtime/compiler-rt/clang_linux/full-x86_64/x86_64/SubDir.lib/enable_execute_stack.o
/home/pranav/smack-project/llvm/src/projects/compiler-rt/lib/enable_execute_stack.c

/home/pranav/smack-project/llvm/src/projects/compiler-rt/lib/enable_execute_stack.c:53:29:
error: cast to 'unsigned char *' from smaller integer type 'unsigned int'
      [-Werror,-Wint-to-pointer-cast]
        unsigned char* startPage = (unsigned char*)(p & pageAlignMask);

Hm... Is it true that somewhy on your system (32-bit host, I presume),
sizeof(uintptr_t) != sizeof(unsigned char *) when you build code in 64-bit
mode (with -m64)?

yes I think that is correct. I wrote a simple program to print if sizeof(uintptr_t) != sizeof(unsigned char *) and when I compile with gcc -m64 and execute it on a 64-bit host (that is different from the 32-bit laptop on which I originally compiled the program), it says the sizes are not equal.

Thanks
Pranav

Btw I just checked, my project does not require compiler-rt (though its installation instructions had asked me to install compiler-rt). However, I would be glad to answer any questions related to my specific system to debug this compilation error.

Thanks

yes I think that is correct. I wrote a simple program to print if
sizeof(uintptr_t) != sizeof(unsigned char *) and when I compile with gcc
-m64 and execute it on a 64-bit host (that is different from the 32-bit
laptop on which I originally compiled the program), it says the sizes are
not equal.

I'm not a language lawyer, but looks like your system has broken headers -
uintptr_t shouldn't resolve to "unsigned int" in 64-bit mode.

Thanks