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
For updated installation instructions, see How to install Clang/LLVM 6 on Red Hat Enterprise Linux.
Clang/LLVM 5.x is packaged in as llvm-toolset-7
, which 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