Version 6 (modified by JoelSherrill, on 07/08/11 at 21:01:27) (diff) |
---|
CLANG
Table of Contents
This page is intended to capture notes and information about using Clang to compile RTEMS.
All supporting files, patches, replacement files, etc. needed should be in http://www.rtems.org/ftp/pub/rtems/people/joel/clang/. If something is missing, let Joel know.
Development Log
Open Issues
These are issues in clang for them to address:
- newlib uses pragma warning which clang does not know
- PR10300.
- Reported 2011-07-07 to http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-July/date.html
- clang does not know registers used in RTEMS i386 FP context macros
- PR10299.
- Reported 2011-07-07 to http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-July/016022.html
- clang does not preprocess score/cpu/i386/cpu_asm.S the same as gcc. Generates incorrect code.
- PR10298.
- Initially reported 2011-07-07 to http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-July/016019.html
These are issues in clang for us to address:
- clang does not know the RTEMS include paths. No immediate solution.
- clang when targeting i386-rtems needs to define USER_LABEL_PREFIX. Other ports probably have something similar and something like a register prefix macro.
These are issues in newlib:
- newlib has warnings for PTHREAD_MUTEX_xxx being redefined - need to submit patch.
- newlib has warnings in rtems specific crt0.c - need to submit patch.
There are the issues identified so far in RTEMS:
- Remove dependency on -specs.
Commit History
2011-07-07: Small patch to make sure rtems was defined was committed.
2011-07-01: The initial patches which add RTEMS support to clang and llvm (clang-rtems-20110629.diff and llvm-rtems-20110629.diff) were merged. This was reported in http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-July/015913.html
Base Tools
For now, you need the regular RTEMS toolchain installed. We are using the normal RTEMS binutils and gdb. In addition, the way I have been building requires using the CPU-rtems4.11-gcc as a helper wrapper.
Building Clang
Check out LLVM and Clang using the instructions at http://clang.llvm.org/get_started.html#build. In my case, I started in a working directory (/users/joel/llvm) and checked out into /users/joel/llvm/llvm. After the checkout completed, I performed the following commands:
cd /users/joel/llvm mkdir b-llvm cd b-llvm ../llvm/configure --prefix=/users/joel/llvm/install make make install
After this completed, I ensured that my PATH included /opt/rtems-4.11/bin and /users/joel/llvm/install/bin for subsequent builds.
Building Newlib With Clang
I created a script file named /users/joel/llvm/j-newlib with the following contents.
CPU=i386 ../newlib-1.19.0/configure --host=${CPU}-rtems4.11 \ --prefix=/users/joel/llvm/install \ --with-newlib \ CC="clang -ccc-host-triple ${CPU}-rtems4.11 -ccc-gcc-name ${CPU}-rtems4.11-gcc" \ CC_FOR_TARGET="clang -ccc-host-triple ${CPU}-rtems4.11 -ccc-gcc-name ${CPU}-rtems4.11-gcc" \ CC_FOR_BUILD="clang " \ PONIES=true \ AR=${CPU}-rtems4.11-ar \ AS=${CPU}-rtems4.11-as >c.log 2>&1 && \ make -j4 >b.log 2>&1 && \ make install >i.log 2>&1 echo $?
newlib must be patched as appropriate for the version of RTEMS being built.
I used the j-newlib script to build newlib as follows:
cd /users/joel/llvm mkdir b-newlib cd b-newlib sh -x ../j-newlib
clang cannot build the file newlib/libc/sys/rtems/crt0.c. There is a replacement of that file on the ftp site. I am not sure if this is a clang bug, questionable code in crt0.c or a combination of the two.
Building RTEMS
I have not successfully built RTEMS yet. I assume the problem is that I must pass in some combination of CC, CC_FOR_TARGET, and CC_FOR_BUILD in a way that makes the RTEMS build happy.