Getting started with llvm-toolset

Red Hat Logo

llvm-toolset is a new software collection that packages together a number of the tools distributed by the LLVM project, including: LLVM tools and libraries, clang, clang-tools-extra, and lldb.

Installing llvm-toolset

llvm-toolset is available in the rhel-7-server-devtools-rpms repo for RHEL 7. (If you don’t already have RHEL 7, Red Hat offers no-cost RHEL subscriptions for development use here.) You can use subscription manager to enable the repo, then yum to install it as usual.

# subscription-manager repos --enable rhel-7-server-devtools-rpms
# yum install llvm-toolset-7

llvm-toolset-7 is a metapackage that will pull in the llvm, clang, clang-tools-extra, and lldb packages.

You can verify the packages are installed correctly by checking the versions of the various tools:

$ scl enable llvm-toolset-7 'clang -v'
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/rh/llvm-toolset-7/root/usr/bin
Found candidate GCC installation: /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7
Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/4.8.5
Selected GCC installation: /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64

Note that clang will use the standard libraries and linker distributed with devtoolset-7. These dependencies are automatically installed when you install llvm-toolset-7.

$ scl enable llvm-toolset-7 'lldb -v'
lldb version 4.0.1

Running through scl for every command can be a nuisance, but it’s easy to start a shell with the appropriate paths enabled:

$ scl enable llvm-toolset-7 bash

The rest of this post assumes such an enabled shell.

Trying it out

You can use a simple hello world program to experiment with some of the tools distributed with llvm-toolset. Start by creating a simple c file called hello.c:

#include <stdio.h>
int main()
int ret;
printf("hello world!");
return ret;

clang-format is a tool for reformatting source code. It supports a number of built-in coding styles and you can define your own. Use clang-format to change the coding style (clang-format defaults to LLVM coding style):

$ clang-format -i hello.c
#include <stdio.h>
int main() {
  int ret;
  printf("hello world!");
  return ret;

clang-tidy is a tool that can be used to catch common programming errors. It supports many different kinds of checks and is integrated with the clang static analyzer. Use clang-tidy to check for programmer errors:

$ clang-tidy -checks=all hello.c --

1 warning generated.
hello.c:5:3: warning: Undefined or garbage value returned to caller [clang-analyzer-core.uninitialized.UndefReturn]
return ret;
hello.c:3:3: note: 'ret' declared without an initial value
int ret;
hello.c:5:3: note: Undefined or garbage value returned to caller
return ret;

Compile your code using clang:

$ clang -g -o hello hello.c

Debug the program using lldb:

$ lldb ./hello
(lldb) target create "./hello"
Current executable set to './hello' (x86_64).
(lldb) b main
Breakpoint 1: where = hello`main + 25 at hello.c:4, address = 0x0000000000400529
(lldb) run
* thread #1, name = 'hello', stop reason = breakpoint 1.1
frame #0: hello`main at hello.c:4
  1 #include
  2 int main() {
  3 int ret;
> 4 printf("hello world!");
  5 return ret;
  6 }

Further Reading

For more information, please visit these resources:

llvm-toolset-7 online documentation
Official LLVM online documentation
Official clang online documentation

Join the Red Hat Developer Program (it’s free) and get access to related cheat sheets, books, and product downloads.

Take advantage of your Red Hat Developers membership and download RHEL today at no cost.