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

Share