Clang/LLVM

This forum is dedicated to feedback, discussions about ongoing or future developments, ideas and suggestions regarding the ChibiOS projects are welcome. This forum is NOT for support.
User avatar
Giovanni
Site Admin
Posts: 13566
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 873 times
Been thanked: 748 times
Contact:

Re: Clang/LLVM

Postby Giovanni » Tue Jul 10, 2018 12:46 pm

Any fix is on the repository, check it out and you have the latest state.

Use this makefile template:

Code: Select all

##############################################################################
# Build global options
# NOTE: Can be overridden externally.
#

# Compiler options here.
ifeq ($(USE_OPT),)
  USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16
endif

# C specific options here (added to USE_OPT).
ifeq ($(USE_COPT),)
  USE_COPT =
endif

# C++ specific options here (added to USE_OPT).
ifeq ($(USE_CPPOPT),)
  USE_CPPOPT = -fno-rtti
endif

# Enable this if you want the linker to remove unused code and data.
ifeq ($(USE_LINK_GC),)
  USE_LINK_GC = yes
endif

# Linker extra options here.
ifeq ($(USE_LDOPT),)
  USE_LDOPT =
endif

# Enable this if you want link time optimizations (LTO).
ifeq ($(USE_LTO),)
  USE_LTO = yes
endif

# Enable this if you want to see the full log while compiling.
ifeq ($(USE_VERBOSE_COMPILE),)
  USE_VERBOSE_COMPILE = no
endif

# If enabled, this option makes the build process faster by not compiling
# modules not used in the current configuration.
ifeq ($(USE_SMART_BUILD),)
  USE_SMART_BUILD = yes
endif

#
# Build global options
##############################################################################

##############################################################################
# Architecture or project specific options
#

# Stack size to be allocated to the Cortex-M process stack. This stack is
# the stack used by the main() thread.
ifeq ($(USE_PROCESS_STACKSIZE),)
  USE_PROCESS_STACKSIZE = 0x400
endif

# Stack size to the allocated to the Cortex-M main/exceptions stack. This
# stack is used for processing interrupts and exceptions.
ifeq ($(USE_EXCEPTIONS_STACKSIZE),)
  USE_EXCEPTIONS_STACKSIZE = 0x400
endif

# Enables the use of FPU (no, softfp, hard).
ifeq ($(USE_FPU),)
  USE_FPU = no
endif

# FPU-related options.
ifeq ($(USE_FPU_OPT),)
  USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16
endif

#
# Architecture or project specific options
##############################################################################

##############################################################################
# Project, target, sources and paths
#

# Define project name here
PROJECT = ch

# Target settings.
MCU  = cortex-m4 --target=arm-none-eabi -march=armv7em

# Imported source files and paths.
CHIBIOS = ../../..
CONFDIR  := ./cfg
BUILDDIR := ./build
DEPDIR   := ./.dep

# Licensing files.
include $(CHIBIOS)/os/license/license.mk
# Startup files.
include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/LLVM/mk/startup_stm32f4xx.mk
# HAL-OSAL files (optional).
include $(CHIBIOS)/os/hal/hal.mk
include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk
include $(CHIBIOS)/os/hal/boards/ST_NUCLEO64_F401RE/board.mk
include $(CHIBIOS)/os/hal/osal/rt/osal.mk
# RTOS files (optional).
include $(CHIBIOS)/os/rt/rt.mk
include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
# Auto-build files in ./source recursively.
include $(CHIBIOS)/tools/mk/autobuild.mk
# Other files (optional).
include $(CHIBIOS)/test/lib/test.mk
include $(CHIBIOS)/test/rt/rt_test.mk
include $(CHIBIOS)/test/oslib/oslib_test.mk

# Define linker script file here.
LDSCRIPT= $(STARTUPLD)/STM32F401xE.ld

# C sources that can be compiled in ARM or THUMB mode depending on the global
# setting.
CSRC = $(ALLCSRC) \
       $(TESTSRC) \
       main.c

# C++ sources that can be compiled in ARM or THUMB mode depending on the global
# setting.
CPPSRC = $(ALLCPPSRC)

# List ASM source files here.
ASMSRC = $(ALLASMSRC)

# List ASM with preprocessor source files here.
ASMXSRC = $(ALLXASMSRC)

# Inclusion directories.
INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC)

# Define C warning options here.
CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes

# Define C++ warning options here.
CPPWARN = -Wall -Wextra -Wundef

#
# Project, target, sources and paths
##############################################################################

##############################################################################
# Start of user section
#

# List all user C define here, like -D_DEBUG=1
UDEFS =

# Define ASM defines here
UADEFS =

# List all user directories here
UINCDIR =

# List the user directory to look for the libraries here
ULIBDIR =

# List all user libraries here
ULIBS =

#
# End of user section
##############################################################################

##############################################################################
# Common rules
#

RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/LLVM/mk
include $(RULESPATH)/clang.mk
include $(RULESPATH)/rules.mk

#
# Common rules
##############################################################################

##############################################################################
# Custom rules
#

#
# Custom rules
##############################################################################


Giovanni

User avatar
Giovanni
Site Admin
Posts: 13566
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 873 times
Been thanked: 748 times
Contact:

Re: Clang/LLVM

Postby Giovanni » Tue Jul 10, 2018 1:06 pm

I just committed some missing files and last updates, still not complete FYI.

Giovanni

kiran
Posts: 4
Joined: Tue Jul 10, 2018 7:20 am
Has thanked: 1 time

Re: Clang/LLVM

Postby kiran » Mon Jul 16, 2018 8:13 am

I am using the latest trunk source , but currently i am stuck with below linking error :
build/bin/ld.lld: error: unable to find library -lclang_rt.builtins-arm.a
I did downloaded the lib and provided the path in makefile but still its not picked up (ldd might be looking at a specific path for this).

Any help of this from your experience on building with clang.

Regards,
Kiran

User avatar
russian
Posts: 333
Joined: Mon Oct 29, 2012 3:17 am
Location: Jersey City, USA
Has thanked: 14 times
Been thanked: 11 times

Re: Clang/LLVM

Postby russian » Fri Apr 16, 2021 3:53 am

Giovanni wrote:The problem I can see is that there is no real support except for Linux

but Windows Subsystem for Linux is amazing and it gives all us Windows 10 users our own Linux :)

Poke clang support?
http://rusefi.com/ - electronic fuel injection

User avatar
FXCoder
Posts: 364
Joined: Sun Jun 12, 2016 4:10 am
Location: Sydney, Australia
Has thanked: 169 times
Been thanked: 121 times

Re: Clang/LLVM

Postby FXCoder » Fri Apr 16, 2021 4:37 am

WSL2 is OK for Linux compute stuff you want to do.
And even Docker containers work with desktop Docker for Windows.
But still no USB support....

User avatar
russian
Posts: 333
Joined: Mon Oct 29, 2012 3:17 am
Location: Jersey City, USA
Has thanked: 14 times
Been thanked: 11 times

Re: Clang/LLVM

Postby russian » Fri Apr 16, 2021 5:23 am

FXCoder wrote:But still no USB support....

I am 100% sure that USB support is not needed in order to compile ChibiOS with clang under WSL2
http://rusefi.com/ - electronic fuel injection

User avatar
Giovanni
Site Admin
Posts: 13566
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 873 times
Been thanked: 748 times
Contact:

Re: Clang/LLVM

Postby Giovanni » Fri Apr 16, 2021 5:41 am

Clang should already be supported, I tried it a while ago, did something break in the meanwhile? (I will check)

See /os/common/startup/ARMCMx/compilers/LLVM/mk

Note that I tried the LLVM-based Hightec compiler, which is proprietary. Results were below GCC, especially for code size, so I have not given it much attention anymore.

I found this guide:

https://interrupt.memfault.com/blog/arm ... -baremetal

It shows how use the precompiled libraries in GCC with LLVM for targeting bare-metal, maybe you could give it a try.

Giovanni

User avatar
alex31
Posts: 338
Joined: Fri May 25, 2012 10:23 am
Location: toulouse, france
Has thanked: 34 times
Been thanked: 50 times
Contact:

Re: Clang/LLVM

Postby alex31 » Fri Apr 16, 2021 8:12 am

Hello,

I will continue to use GCC for code generation, but CLANG offers very nice clang-tidy static analyser that is lacking in GCC.

A.

User avatar
Giovanni
Site Admin
Posts: 13566
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 873 times
Been thanked: 748 times
Contact:

Re: Clang/LLVM

Postby Giovanni » Fri Apr 16, 2021 8:51 am

alex31 wrote:Hello,

I will continue to use GCC for code generation, but CLANG offers very nice clang-tidy static analyser that is lacking in GCC.

A.


It would be nice to try it, currently ChibiOS is checked using PClint, it is not free however.

Giovanni

faisal
Posts: 279
Joined: Wed Jul 19, 2017 12:44 am
Has thanked: 37 times
Been thanked: 37 times

Re: Clang/LLVM

Postby faisal » Fri May 07, 2021 3:26 pm

Giovanni wrote:Clang should already be supported, I tried it a while ago, did something break in the meanwhile? (I will check)

See /os/common/startup/ARMCMx/compilers/LLVM/mk

Note that I tried the LLVM-based Hightec compiler, which is proprietary. Results were below GCC, especially for code size, so I have not given it much attention anymore.

I found this guide:

https://interrupt.memfault.com/blog/arm ... -baremetal

It shows how use the precompiled libraries in GCC with LLVM for targeting bare-metal, maybe you could give it a try.

Giovanni


I downloaded the latest clang+llvm (12.0.0) and gave it a whirl. A few problems.

* Looking at clang.mk, TRGT=aarch32 . This doesn't make sense, there are no programs in <clang-llvm-path>/bin that start with 'aarch32' . TRGT should be 'llvm' .
* Per the memfault interrupt blog post as well as others, it is recommended to use libc, libm, and builtins from the GNU ARM GCC distribution. I don't see anything in llvm/mk/rules.mk to suggest that it is doing that.
* LD is defined as clang. Not sure if the llvm linker is ready for prime-time, it didnt work on my end. I compiled with clang, and linked with arm-none-eabi-gcc and that worked.

Basically - how did you get it to work without addressing the above?


Return to “Development and Feedback”

Who is online

Users browsing this forum: No registered users and 6 guests