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
The post Getting started with llvm-toolset appeared first on RHD Blog.