Version 7 (modified by WeiY, on Feb 27, 2012 at 6:09:01 PM) (diff)

/* Open Issues */


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 If something is missing, let Joel know.

Development Log

Open Issues

These are issues in clang for them to address:

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 or change the format of -specs option from "-specs specs_file" by default to "-specs=specs_file".

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

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 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 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.

../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.