Building newlib for Cortex-M with LLVM

Olivier MARTIN olivier@labapart.com
Thu Nov 12 04:11:00 GMT 2015


Hello all,
recently I found a warning generated by Clang while building my project 
that is based on Newlib (see 
https://sourceware.org/ml/newlib/2015/msg00714.html).

I was curious... and I was wondering whether I could build newlib with 
Clang.
The answer is probably the one you were expected, no!
I am not really familiar with newlib build configuration, I went for the 
basic steps I found on the Internet:

mkdir build-newlib-llvm
cd build-newlib-llvm
export 
AS_FOR_TARGET=/home/olivier/Toolchains/gcc-arm-none-eabi-4_9-2014q4/bin/arm-none-eabi-as
export CC_FOR_TARGET=/usr/bin/clang-3.6
export CFLAGS_FOR_TARGET="-target arm-none-eabi"
export 
PATH=/home/olivier/Toolchains/gcc-arm-none-eabi-4_9-2014q4/bin:$PATH
../configure --target=arm-none-eabi 
--prefix=/home/olivier/Toolchains/gcc-arm-none-eabi-4_9-2014q4 
--disable-newlib-supplied-syscalls --with-cpu=armv7m --with-mode=thumb 
--enable-interwork
make all

There are two issues I manage to isolate.

* The first one can be solved. The space in the call of CONCAT2(a, b) by 
CONCAT() is propagated into the subsequent calls. It means when the 
strings 'a' and 'b' are concatenated, the space is inserted between both 
strings - which is not the expected behaviour.

The fix would be:

--- a/newlib/libc/machine/arm/setjmp.S
+++ b/newlib/libc/machine/arm/setjmp.S
@@ -3,7 +3,7 @@
     Nick Clifton, Cygnus Solutions, 13 June 1997.  */

  /* ANSI concatenation macros.  */
-#define CONCAT(a, b)  CONCAT2(a, b)
+#define CONCAT(a, b)  CONCAT2(a,b)

* The second issue is what I believe to be a Clang issue. Clang does not 
support when macros are defined into inline assembly and used later on.
Assembly macros are quite used in the ARM string functions (eg: 
'RETURN', 'optpld' macros).
I raised a Clang bug for this one: 
https://llvm.org/bugs/show_bug.cgi?id=25495

I had other issues but they might come from the fact I have not 
correctly configured newlib for Cortex-M...

For instance, the following errors:
- libgloss/arm/linux-crt0.c:34:2: error: non-ASM statement in naked 
function is not supported
         register int *sp asm("sp");
- libgloss/libnosys/chown.c
	<inline asm>:1:8: error: unsupported directive '.stabs'
	.stabs "_chown is not implemented and will always fail",30,0,0,0
- '.syntax divided' is not supported - it is used in 
newlib/libc/machine/arm/*.S

Note: I cannot see the armv7m/thumb/interwork flags to be propagated 
into the build commands.

Any feedback or comment on my investigation are welcome. I am quite 
happy to try few things.

Thanks,

---
Olivier MARTIN
http://labapart.com - Lab A Part



More information about the Newlib mailing list