LLVM 11.0.0 Toolset の使用
LLVM 11.0.0 Toolset のインストールおよび使用
概要
多様性を受け入れるオープンソースの強化
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ をご覧ください。
第1章 LLVM
1.1. LLVM Toolset の概要
LLVM Toolset は、Red Hat Enterprise Linux プラットフォームで開発者向けの Red Hat 製品です。これは、LLVM コンパイラーインフラストラクチャーフレームワーク、C 言語および C++ 言語用の Clang コンパイラー、LLDB デバッガー、コード解析の関連ツールを提供します。
LLVM Toolset は、Red Hat Developer Tools for Red Hat Enterprise Linux 7 の一部として配布されています。LLVM Toolset は、Red Hat Enterprise Linux 8 のモジュールとして利用できます。
以下のコンポーネントは、LLVM Toolset の一部として利用できます。
表1.1 LLVM コンポーネント
名前 | バージョン | 説明 |
---|---|---|
clang |
RHEL 7 — 11.0.1 | C および C++ の LLVM コンパイラーフロントエンド。 |
lldb |
RHEL 7 — 11.0.1 | LLVM の一部を使用した C および C++ デバッガー。 |
compiler-rt |
RHEL 7 — 11.0.1 | LLVM のランタイムライブラリー。 |
llvm |
RHEL 7 — 11.0.1 | 一連のモジュールおよび再利用可能なコンパイラーおよびツールチェーン技術。 |
libomp |
RHEL 7 — 11.0.1 | 並列プログラミングに Open MP API 仕様を使用するためのライブラリー。 |
lld |
RHEL 7 — 11.0.1 | LLVM リンカー。 |
python-lit |
RHEL 7 — 0.11.1 | LLVM および Clang ベースのテストスイート用のソフトウェアテストツール。 |
Red Hat Enterprise Linux 7 の LLVM Toolset は、CMake を別のパッケージとして提供します。Red Hat Enterprise Linux 8 では、CMake がシステムリポジトリーから利用できます。CMake のインストール方法は 「LLVM Toolset のインストール」 を参照してください。
1.2. 互換性
LLVM Toolset は、Red Hat Enterprise Linux 7 および Red Hat Enterprise Linux 8 では、以下のアーキテクチャーで利用できます。
- AMD アーキテクチャーおよび Intel 64 ビットアーキテクチャー
- 64 ビット ARM アーキテクチャー (RHEL 8 のみ)
- IBM Power Systems (リトルエンディアン)
- IBM Power Systems、ビックエンディアン (RHEL 7 のみ)
- 64 ビット IBM Z
1.3. Red Hat Enterprise Linux 7 で LLVM Toolset へのアクセス
本章では、Red Hat Enterprise Linux 7 システムに LLVM Toolset をインストールする前に実行する手順を説明します。以下の手順をすべて実行して、Red Hat Developer Toolset レポジトリーにアクセスできるサブスクリプションをアタッチし、Red Hat Developer Tools および Red Hat Software Collections レポジトリーを有効化します。
前提条件
wget
がシステムにインストールされていることを確認します。このツールは、デフォルトの Red Hat Enterprise Linux リポジトリーから利用できます。これをインストールするには、root で以下のコマンドを入力します。# yum install wget
手順
サーバーから最新のサブスクリプションデータを取得します。
# subscription-manager refresh
以下のコマンドを使用して、システムを登録します。
# subscription-manager register
また、Red Hat Subscription Management ドキュメントの Registering and Unregistering a System の適切な手順に従って、システムを登録することもできます。
システムで利用可能なすべてのサブスクリプションの一覧を表示し、サブスクリプションのプール ID を特定します。
# subscription-manager list --available
このコマンドは、サブスクリプション名、一意の ID、有効期限などの関連情報を表示します。プール ID は、
Pool ID
で始まる行に一覧表示されます。Red Hat Developer Tools
リポジトリーへのアクセスを提供するサブスクリプションを割り当てます。直前の手順で特定したプール ID を使用します。# subscription-manager attach --pool=<appropriate pool ID from the subscription>
システムに割り当てられているサブスクリプションの一覧を確認します。
# sudo subscription-manager list --consumed
rhel-7-variant-devtools-rpms
レポジトリーを有効化します。# subscription-manager repos --enable rhel-7-variant-devtools-rpms
variant
を、Red Hat Enterprise Linux システムのバリアント (server
またはworkstation
) に置き換えます。Red Hat Enterprise Linux Server を使用して、最も幅広い開発ツールにアクセスすることを検討してください。
rhel-variant-rhscl-7-rpms
レポジトリーを有効化します。# subscription-manager repos --enable rhel-variant-rhscl-7-rpms
variant
を、Red Hat Enterprise Linux システムのバリアント (server
またはworkstation
) に置き換えます。Red Hat Developer Tools GPG キーをシステムに追加します。
# cd /etc/pki/rpm-gpg # wget -O RPM-GPG-KEY-redhat-devel https://www.redhat.com/security/data/a5787476.txt # rpm --import RPM-GPG-KEY-redhat-devel
サブスクリプションがシステムに割り当てられ、リポジトリーが有効になったら、「LLVM Toolset のインストール」 の説明に従って LLVM Toolset をインストールします。
関連資料
- Red Hat Subscription Management を使用してシステムを登録し、サブスクリプションに関連付ける方法は、Red Hat Subscription Management のガイドを参照してください。
1.4. LLVM Toolset のインストール
LLVM Toolset は、Red Hat Enterprise Linux に含まれる標準のパッケージ管理ツールを使用してインストール、更新、アンインストール、および検査できる RPM パッケージのコレクションとして配布されています。
LLVM Toolset を Red Hat Enterprise Linux 7 システムにインストールするには、Red Hat Developer Tool コンテンツセットへのアクセスを提供する有効なサブスクリプションが必要です。Red Hat Enterprise Linux 7 システムを適切なサブスクリプションに関連付け、LLVM Toolset にアクセスする方法は、「Red Hat Enterprise Linux 7 で LLVM Toolset へのアクセス」 を参照してください。
LLVM Toolset をインストールする前に、利用可能なすべての Red Hat Enterprise Linux 更新をインストールします。
オペレーティングシステムの LLVM Toolset に含まれるすべてのコンポーネントをインストールします。
Red Hat Enterprise Linux 7 に、llvm-toolset 11.0 コレクションをインストールします。
# yum install llvm-toolset-11.0
Red Hat Enterprise Linux 8 に、llvm-toolset モジュールをインストールします。
# yum module install llvm-toolset
これにより、すべての開発およびデバッグツール、および依存するパッケージがシステムにインストールされます。
1.4.1. Red Hat Enterprise Linux への CMake のインストール
CMake は、別のパッケージとして利用できます。CMake をインストールするには、以下を実行します。
Red Hat Enterprise Linux 7 で、llvm-toolset-11.0-cmake パッケージをインストールします。
# yum install llvm-toolset-11.0-cmake llvm-toolset-11.0-cmake-doc
Red Hat Enterprise Linux 8 で、cmake パッケージをインストールします。
# yum install cmake cmake-doc
1.4.1.1. CMake インストール可能なドキュメント
cmake パッケージには、インストールされたドキュメントが含まれています。Red Hat Enterprise Linux 7 では、opt/rh/llvm-toolset-11.0/root/usr/share/doc/llvm-toolset-11.0-cmake-3.6.2/html/index.html
のドキュメントを参照してください。Red Hat Enterprise Linux 8 では、/usr/share/doc/llvm/html/index.html
のドキュメントを参照してください。
1.4.2. インストール可能なドキュメント
ここでは、LLVM Toolset のインストール可能なドキュメントのインストール方法を説明します。
- Red Hat Enterprise Linux 7 で、llvm-doc-11.0 パッケージをインストールします。
# yum install llvm-toolset-11.0-llvm-doc
このドキュメントは、/opt/rh/llvm-toolset-11.0/root/usr/share/doc/llvm-toolset-11.0-llvm-11.0/html/index.html
で利用できます。
- Red Hat Enterprise Linux 8 で、llvm-doc パッケージをインストールします。
# yum install llvm llvm-doc
このドキュメントは、/usr/share/doc/llvm/html/index.html
で利用できます。
CMake のドキュメントは、LLVM ドキュメントパッケージに含まれていません。CMake のドキュメントをインストールするには、「CMake インストール可能なドキュメント」 を参照してください。
1.5. 関連資料
LLVM Toolset とその機能に関する詳細な説明は、本書の対象外です。詳細は、以下に記載のドキュメントを参照してください。
オンラインドキュメント
- LLVM ドキュメントの概要: 公式の LLVM ドキュメント
第2章 clang の使用
Clang は C、C++、Objective C/C++、OpenCL、および C をベースとする言語の LLVM コンパイラーフロントエンドです。
LLVM Toolset は、RHEL 7 では clang 11.0.1、RHEL 8 では clang 11.0.0 で配布されます。
Red Hat Enterprise Linux 7 で scl
ユーティリティーを使用してコマンドを実行すると、利用可能な LLVM バイナリーで実行することができます。すべてのコマンドで scl enable
を使用せずに Red Hat Enterprise Linux 7 で LLVM Toolset を使用するには、次のコマンドを指定してシェルセッションを実行します。
$ scl enable llvm-toolset-11.0 'bash'
2.1. C ソースファイルのバイナリーファイルへのコンパイル
C プログラムをバイナリーファイルにコンパイルするには、次のコマンドを実行します。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang -o output_file source_file'
Red Hat Enterprise Linux 8 の場合:
$ clang -o output_file source_file
これにより、現在の作業ディレクトリーに output_file
という名前のバイナリーファイルが作成されます。-o
オプションを省略すると、コンパイラーはデフォルトで a.out
でという名前のファイルを作成します。
例2.1 clang で C プログラムのコンパイル
以下の内容を含むソースファイル hello.c
について考えてみましょう。
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, World!\n"); return 0; }
LLVM Toolset の clang
コンパイラーを使用して、このソースコードをコマンドラインでコンパイルします。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang -o hello hello.c'
Red Hat Enterprise Linux 8 の場合:
$ clang -o hello hello.c
これにより、現在の作業ディレクトリーに hello
という新しいバイナリーファイルが作成されます。
2.2. オブジェクトファイルへの C ソースファイルのコンパイル
複数のソースファイルで設定されるプロジェクトで作業する場合、各ソースファイルのオブジェクトファイルを最初にコンパイルしてから、これらのオブジェクトファイルをリンクすることが一般的です。これにより、単一のソースファイルを変更する場合は、プロジェクト全体をコンパイルせずにこのファイルのみを再コンパイルできます。
C ソースファイルをオブジェクトファイルにコンパイルするには、以下を実行します。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang -o object_file -c source_file'
Red Hat Enterprise Linux 8 の場合:
$ clang -o object_file -c source_file
これにより、object_file
という名前のオブジェクトファイルが作成されます。-o
オプションを省略すると、コンパイラーは、.c
というファイル拡張子が付いたソースファイルからという名前のファイルを作成します。
2.3. バイナリーファイルへの C オブジェクトファイルのリンク
オブジェクトファイルをリンクし、バイナリーファイルを作成します。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang -o output_file object_file ...'
Red Hat Enterprise Linux 8 の場合:
$ clang -o output_file object_file ...
最新のライブラリー機能の一部は、複数のバージョンの Red Hat Enterprise Linux での実行に対応するために、LLVM Toolset で構築されたアプリケーションに静的にリンクされています。標準の Red Hat Enterprise Linux エラータではこのコードが変更されないため、これにより、重要性が高くないセキュリティーリスクが発生します。Red Hat は、このリスクにより、開発者がアプリケーションを再構築する必要がある場合でも、セキュリティーエラータを使用してこのアプリケーションと通信します。
このようなセキュリティーリスクが発生するため、開発者は同じ理由によりアプリケーション全体を静的にリンクしないことが強く推奨されます。
2.4. clang 統合アセンブラーの使用
アセンブリー言語プログラムからオブジェクトファイルを生成するには、以下のように clang
ツールを実行します。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang -o object_file source_file'
Red Hat Enterprise Linux 8 の場合:
$ clang -o object_file source_file
これにより、現在の作業ディレクトリーに object_file
という名前のオブジェクトファイルが作成されます。
2.5. C プログラムの実行
clang
がプログラムをコンパイルすると、実行可能なバイナリーファイルが作成されます。コマンドラインでこのプログラムを実行するには、実行ファイルがあるディレクトリーに移動し、プログラムを実行します。
$ ./file_name
例2.2 コマンドラインでの C プログラムの実行
例2.1「clang で C プログラムのコンパイル」 にあるように hello
バイナリーファイルを正常にコンパイルしたと仮定して、シェルプロンプトで次のコマンドを実行します。
$ ./hello Hello, World!
2.6. 関連情報
clang コンパイラーおよびその機能の詳しい説明は、本書の対象外となっています。詳細は、以下に記載のドキュメントを参照してください。
インストールされているドキュメント
clang(1):
clang
コンパイラーの man ページでは、その使用方法に関する詳細情報が提供されます。一部の例外を除き、clang++
はclang
と同じコマンドラインオプションを受け付けます。LLVM Toolset に含まれるバージョンの man ページを表示するには、次のコマンドを実行します。Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'man clang'
Red Hat Enterprise Linux 8 の場合:
$ man clang
オンラインドキュメント
-
clang: clang コンパイラードキュメントでは、
clang
の使用に関する詳細情報が提供されています。
以下も併せて参照してください。
- 1章LLVM: LLVM の概要およびそのシステムへのインストール方法の詳細
第3章 clang++ の使用
3.1. C++ ソースファイルのバイナリーファイルへのコンパイル
コマンドラインで C++ プログラムをコンパイルするには、以下のように clang++
コンパイラーを実行します。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang++ -o output_file source_file ...'
Red Hat Enterprise Linux 8 の場合:
$ clang++ -o output_file source_file ...
これにより、現在の作業ディレクトリーに output_file
という名前のバイナリーファイルが作成されます。-o
オプションを省略すると、デフォルトで、clang++
コンパイラーは a.out
という名前の ファイルを作成します。
3.2. オブジェクトファイルへの C++ ソースファイルのコンパイル
複数のソースファイルで設定されるプロジェクトで作業する場合、各ソースファイルのオブジェクトファイルを最初にコンパイルしてから、これらのオブジェクトファイルをリンクすることが一般的です。これにより、単一のソースファイルを変更する場合は、プロジェクト全体をコンパイルせずにこのファイルのみを再コンパイルできます。
コマンドラインでオブジェクトファイルをコンパイルするには、以下のコマンドを実行します。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang++ -o object_file -c source_file'
Red Hat Enterprise Linux 8 の場合:
$ clang++ -o object_file -c source_file
これにより、object_file
という名前のオブジェクトファイルが作成されます。-o
オプションを省略すると、clang++
コンパイラーは、.o
ファイル拡張子でソースファイルの名前が付けられたファイルを作成します。
3.3. C++ オブジェクトファイルのバイナリーファイルへのリンク
オブジェクトファイルをリンクし、バイナリーファイルを作成します。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang++ -o output_file object_file ...'
Red Hat Enterprise Linux 8 の場合:
$ clang++ -o output_file object_file ...
最新のライブラリー機能の一部は、複数のバージョンの Red Hat Enterprise Linux での実行に対応するために、LLVM Toolset で構築されたアプリケーションに静的にリンクされています。標準の Red Hat Enterprise Linux エラータではこのコードが変更されないため、これにより、重要性が高くないセキュリティーリスクが発生します。Red Hat は、このリスクにより、開発者がアプリケーションを再構築する必要がある場合でも、セキュリティーエラータを使用してこのアプリケーションと通信します。
このようなセキュリティーリスクが発生するため、開発者は同じ理由によりアプリケーション全体を静的にリンクしないことが強く推奨されます。
例3.1 コマンドラインでの C プログラムのコンパイル
以下の内容を含む hello.cpp
という名前のソースファイルについて考えてみましょう。
#include <iostream> using namespace std; int main(int argc, char *argv[]) { cout << "Hello, World!" << endl; return 0; }
LLVM の clang++
コンパイラーを使用して、コマンドラインでこのソースコードをコンパイルします。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang++ -o hello hello.cpp'
Red Hat Enterprise Linux 8 の場合:
$ clang++ -o hello hello.cpp
これにより、現在の作業ディレクトリーに hello
という新しいバイナリーファイルが作成されます。
3.4. C プログラムの実行
clang++
がプログラムをコンパイルすると、実行可能なバイナリーファイルが作成されます。実行可能ファイルでディレクトリーに移動し、このプログラムを実行します。
./file_name
例3.2 コマンドラインでの C++ プログラムの実行
例3.1「コマンドラインでの C プログラムのコンパイル」 にあるように hello
バイナリーファイルを正常にコンパイルしたと仮定して、シェルプロンプトで次のコマンドを実行します。
$ ./hello Hello, World!
3.5. 関連情報
clang コンパイラーおよびその機能の詳しい説明は、本書の対象外となっています。詳細は、以下に記載のドキュメントを参照してください。
インストールされているドキュメント
clang(1):
clang
コンパイラーの man ページでは、その使用方法に関する詳細情報が提供されます。一部の例外を除き、clang++
はclang
と同じコマンドラインオプションを受け付けます。LLVM Toolset に含まれるバージョンの man ページを表示するには、次のコマンドを実行します。Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'man clang'
Red Hat Enterprise Linux 8 の場合:
$ man clang
オンラインドキュメント
-
clang: clang コンパイラードキュメントでは、
clang
の使用に関する詳細情報が提供されています。
以下も併せて参照してください。
- 1章LLVM: LLVM の概要およびそのシステムへのインストール方法の詳細
第4章 lldb
lldb は、C および C++ で書かれたプログラムのデバッグに使用できるコマンドラインツールです。これにより、デバッグするコード内でメモリーを検査したり、コードの実行状態を制御したり、コードの特定セクションの実行を検出したりできます。
LLVM Toolset は、RHEL 7 では lldb 11.0.1、RHEL 8 では lldb 11.0.0 で配布されます。
Red Hat Enterprise Linux 7 で scl
ユーティリティーを使用してコマンドを実行すると、利用可能な LLVM バイナリーで実行することができます。すべてのコマンドで scl enable
を使用せずに Red Hat Enterprise Linux 7 で LLVM Toolset を使用するには、次のコマンドを指定してシェルセッションを実行します。
$ scl enable llvm-toolset-11.0 'bash'
4.1. デバッグプログラムの準備
C または C++ プログラムを lldb が読み取り可能なデバッグ情報でコンパイルするには、使用するコンパイラーがデバッグ情報の作成に指示されていることを確認してください。
- clang を適切に設定する方法は、Clang Compiler User's Manual の Controlling Debug Information を参照してください。
- GCC を適切に設定する手順については、Red Hat Developer Toolset User Guide の セクション 8.2 デバッグプログラムの準備 を参照してください。
4.2. lldb の実行
デバッグするプログラムで lldb を実行するには、次のコマンドを実行します。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'lldb program_file_name'
Red Hat Enterprise Linux 8 の場合:
$ lldb program_file_name
このコマンドは、対話モードで lldb
を開始し、デフォルトのプロンプト (lldb)
を表示します。
デバッグセッションを終了してシェルプロンプトに戻るには、いつでも以下のコマンドを実行します。
(lldb) quit
例4.1 fibonacci バイナリーファイルでの gdb ユーティリティーの実行
以下の内容を含む fibonacci.c
という名前の C ソースファイルについて考えてみましょう。
#include <stdio.h> #include <limits.h> int main (int argc, char *argv[]) { unsigned long int a = 0; unsigned long int b = 1; unsigned long int sum; while (b < LONG_MAX) { printf("%ld ", b); sum = a + b; a = b; b = sum; } return 0; }
デバッグ情報を有効にし、以下のコマンドを使用して fibonacci.c
ソースファイルをコンパイルします。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'clang -g -o fibonacci fibonacci.c'
Red Hat Enterprise Linux 8 の場合:
$ clang -g -o fibonacci fibonacci.c
GCC または clang を使用してデバッグ情報を制御する方法は、「デバッグプログラムの準備」 を参照してください。
lldb
でプログラムのデバッグを開始します。
Red Hat Enterprise Linux 7 の場合:
$ scl enable llvm-toolset-11.0 'lldb fibonacci' (lldb) target create "fibonacci" Current executable set to 'fibonacci' (x86_64). (lldb)
Red Hat Enterprise Linux 8 の場合:
$ lldb fibonacci (lldb) target create "fibonacci" Current executable set to 'fibonacci' (x86_64). (lldb)
この出力は、プログラムを fibonacci
がデバッグする準備が整っていることを示しています。
4.3. ソースコードの一覧表示
デバッグしているプログラムのソースコードを表示するには、次のコマンドを実行します。
(lldb) list
これにより、ソースコードの最初の 10 行が表示されます。
特定の行からコードを表示するには、次のコマンドを実行します。
(lldb) list source_file_name:line_number
さらに、lldb は、以下の状況で自動的にソースコードの一覧を表示します。
-
デバッグするプログラムの実行を開始する前に、
lldb
はソースコードの最初の 10 行を表示します。 -
プログラムの実行が停止するたびに、
lldb
により、実行が停止する行が示されます。
4.4. ブレークポイントの使用
新しいブレークポイントの設定
特定の行に新しいブレークポイントを設定するには、以下を行います。
(lldb) breakpoint source_file_name:line_number
特定の関数でブレークポイントを設定するには、以下を行います。
(lldb) breakpoint source_file_name:function_name
例4.2 新しいブレークポイントの設定
この例では、例4.1「fibonacci バイナリーファイルでの gdb ユーティリティーの実行」 に示したように、fibonacci.c
ファイルが正常にコンパイルされていることを前提としています。
以下のコマンドを実行して、10 行目に 2 つのブレークポイントを設定します。
(lldb) b 10 Breakpoint 1: where = fibonacci`main + 33 at fibonacci.c:10, address = 0x000000000040054e
(lldb) breakpoint set -f fibonacci.c --line 10 Breakpoint 2: where = fibonacci`main + 33 at fibonacci.c:10, address = 0x000000000040054e
lldb のコマンド b
は、breakpoint
へのエイリアスではありません。両方のコマンドを使用してブレークポイントを設定できますが、b
は gdb break
コマンドがサポートする構文のサブセットを使用し、breakpoint
の設定に lldb 構文を使用します。
ブレークポイントの一覧表示
現在設定されているブレークポイントの一覧を表示するには、次のコマンドを実行します。
(lldb) breakpoint list
例4.3 ブレークポイントの一覧表示
この例では、例4.2「新しいブレークポイントの設定」 の手順に問題なく従っていることを前提としています。
現在設定されているブレークポイントの一覧を表示します。
(lldb) breakpoint list Current breakpoints: 1: file = 'fibonacci.c', line = 10, exact_match = 0, locations = 1 1.1: where = fibonacci`main + 33 at fibonacci.c:10, address = fibonacci[0x000000000040054e], unresolved, hit count = 0 2: file = 'fibonacci.c', line = 10, exact_match = 0, locations = 1 2.1: where = fibonacci`main + 33 at fibonacci.c:10, address = fibonacci[0x000000000040054e], unresolved, hit count = 0
既存のブレークポイントの削除
特定の行に設定されているブレークポイントを削除するには、次のコマンドを実行します。
(lldb) breakpoint clear -f source_file_name -l line_number
例4.4 既存のブレークポイントの削除
この例では、fibonacci.c
ファイルを正常にコンパイルしていることを前提としています。
7 行目で新しいブレークポイントを設定します。
(lldb) b 7 Breakpoint 3: where = fibonacci`main + 31 at fibonacci.c:9, address = 0x000000000040054c
このブレークポイントを削除します。
(lldb) breakpoint clear -l 7 -f fibonacci.c 1 breakpoints cleared: 3: file = 'fibonacci.c', line = 7, exact_match = 0, locations = 1
4.5. 実行の開始
デバッグしているプログラムの実行を開始するには、次のコマンドを実行します。
(lldb) run
プログラムがコマンドライン引数を許可する場合は、run
コマンドに引数として指定できます。
(lldb) run argument …
最初のブレークポイントに達するか、エラーが発生したとき、またはプログラムが終了したときに実行が停止します。
例4.5 lldb でのフィボナッチバイナリーファイルの実行
この例では、例4.2「新しいブレークポイントの設定」 の手順に問題なく従っていることを前提としています。
lldb で fibonacci
バイナリーファイルを実行します。
(lldb) run Process 21054 launched: 'fibonacci' (x86_64) Process 21054 stopped * thread #1, name = 'fibonacci', stop reason = breakpoint 1.1 frame #0: fibonacci`main(argc=1, argv=0x00007fffffffdeb8) at fibonacci.c:10 7 unsigned long int sum; 8 9 while (b < LONG_MAX) { -> 10 printf("%ld ", b); 11 sum = a + b; 12 a = b; 13 b = sum;
例4.2「新しいブレークポイントの設定」 に設定されたブレークポイントでプログラムの実行が停止します。
4.6. 現在のプログラムデータの表示
lldb
ツールを使用すると、以下を含むプログラムの状態に関連するデータを表示できます。
- 複雑さの変数
- 任意の有効な式
- 関数呼び出しの戻り値
一般的な使用方法は、変数の値を表示することです。特定の変数の現在の値を表示するには、次のコマンドを実行します。
(lldb) print variable_name
例4.6 変数の現在の値の表示
この例では、例4.5「lldb でのフィボナッチバイナリーファイルの実行」 の手順に問題なく従っていることを前提としています。fibonacci
バイナリーの実行は、ブレークポイントが 10 行目に到達すると停止しました。
変数 a
および b
の現在の値を表示します。
(lldb) print a $0 = 0 (lldb) print b $1 = 1
4.7. ブレークポイント後の実行の継続
ブレークポイントに達した後にデバッグするプログラムの実行を再開するには、次のコマンドを実行します。
(lldb) continue
別のブレークポイントに到達すると、実行が再び停止します。
ループをデバッグする場合、特定の数のブレークポイントを省略するには、以下の形式で continue
コマンドを実行します。
(lldb) continue -i number_of_breakpoints_to_skip
ブレークポイントがループ上に設定されている場合、ループ全体を省略するには、ループの反復回数に一致するように number_of_breakpoints_to_skip を設定する必要があります。
lldb
ツールを使用すると、step
を使用して、現在の行ポインターからコードを 1 行実行することができます。
(lldb) step
特定の行を実行するには、次のコマンドを実行します。
(lldb) step -c number
例4.7 ブレークポイント後の fibonacci バイナリーファイルの実行の継続
この例では、例4.5「lldb でのフィボナッチバイナリーファイルの実行」 の手順に問題なく従っていることを前提としています。fibonacci
バイナリーの実行は、ブレークポイントが 10 行目に到達すると停止しました。
実行を再開します。
(lldb) continue Process 21580 resuming Process 21580 stopped * thread #1, name = 'fibonacci', stop reason = breakpoint 1.1 frame #0: fibonacci`main(argc=1, argv=0x00007fffffffdeb8) at fibonacci.c:10 7 unsigned long int sum; 8 9 while (b < LONG_MAX) { -> 10 printf("%ld ", b); 11 sum = a + b; 12 a = b; 13 b = sum;
次回ブレークポイントに到達すると、実行が停止します。この場合、これは同じブレークポイントになります。次の 3 行コードを実行します。
(lldb) step -c 3 Process 21580 stopped * thread #1, name = 'fibonacci', stop reason = step in frame #0: fibonacci`main(argc=1, argv=0x00007fffffffdeb8) at fibonacci.c:11 8 9 while (b < LONG_MAX) { 10 printf("%ld ", b); -> 11 sum = a + b; 12 a = b; 13 b = sum; 14 }
sum
変数の現在の値を確認します。
(lldb) print sum $2 = 2
4.8. 関連情報
lldb とそのすべての機能に関する詳細な説明は、本書の対象外です。詳細は、以下に記載のドキュメントを参照してください。
オンラインドキュメント
- lldb Tutorial: 公式の lldb チュートリアルです。
- GDB to lldb command map: GDB コマンドとその lldb に相当するものの一覧。
以下も併せて参照してください。
- 1章LLVM: LLVM の概要と、そのインストール方法の詳細情報
第5章 LLVM Toolset を使用したコンテナーイメージ
Red Hat Universal Base Images (UBI) コンテナーの上に、独自の LLVM Toolset コンテナーイメージを構築できます。LLVM のコンテナーイメージの基盤として UBI を使用する方法の詳細は、「UBI リポジトリーの使用」 を参照してください。
- Red Hat UBI イメージの詳細は、コンテナーの構築、実行、および管理 - 第 3 章、コンテナーイメージの操作 を参照してください。
5.1. UBI リポジトリーの使用
LLVM Toolset パッケージは、Red Hat Universal Base Images (UBI) リポジトリーの一部です。UBI リポジトリーにアクセスし、LLVM のコンテナーイメージを構築するには、UBI を設定する必要があります。
5.2. 例: Dockerfile を使用して RHEL 8 で LLVM のコンテナーイメージのビルド
前提条件
- UBI を設定します。
UBI を設定するには、次の手順を実行します。
- Red Hat Container Catalog にアクセスして、UBI 8 を検索します。
- UBI を選択します。
- Get this image をクリックして、指示に従います。
UBI イメージの使用方法は、コンテナーの構築、実行、および管理 - 第 3 章、コンテナーイメージの操作 を参照してください。
手順
Red Hat Enterprise Linux 8 で LLVM Toolset のコンテナーをビルドするには、Dockerfile に次の行が含まれている必要があります。
FROM registry.access.redhat.com/ubi8/ubi:latest
RUN yum install -y llvm-toolset
コンテナーのサイズをできるだけ小さくするには、個々のパッケージをインストールします。たとえば、Clang コンパイラーのみをコンテナーイメージにインストールするには、次を使用します。
RUN yum install clang
5.3. 例: Dockerfile を使用して RHEL 7 で LLVM のコンテナーイメージのビルド
前提条件
- UBI を設定します。
UBI を設定するには、次の手順を実行します。
- Red Hat Container Catalog にアクセスして、UBI 7 を検索します。
- UBI を選択します。
- Get this image をクリックして、指示に従います。
UBI イメージの使用方法は、コンテナーの構築、実行、および管理 - 第 3 章、コンテナーイメージの操作 を参照してください。
手順
Red Hat Enterprise Linux 7 で LLVM Toolset を含むコンテナーを構築するには、Dockerfile に次の行が含まれている必要があります。
FROM registry.access.redhat.com/ubi7/ubi:ilatest RUN yum install -y llvm-toolset-${version}
コンテナーのサイズをできるだけ小さくするには、個々のパッケージをインストールします。たとえば、Clang コンパイラーのみをコンテナーイメージにインストールするには、次を使用します。
RUN yum install llvm-toolset-${_version_}-clang
5.4. 関連情報
- Red Hat UBI イメージの詳細は、コンテナーの構築、実行、および管理 - 第 3 章、コンテナーイメージの操作 を参照してください。
- Red Hat UBI リポジトリーの詳細は、Universal Base Images (UBI): Images, repositories, packages, and source code を参照してください。
第6章 LLVM 11.0.0 Toolset の変更点
LLVM Toolset のバージョン 10.0.1 が、RedHatEnterprise Linux 8 では 11.0.0 に、Red Hat EnterpriseLinux7 では 11.0.1 に更新されました。以下は、主な変更点です。
-
-fstack-clash-protection
コマンドラインオプションのサポートが、AMD および Intel 64 ビットアーキテクチャー、IBM Power Systems、リトルエンディアン、および IBM Z に追加されました。新しいコンパイラーフラグは、各スタックページを自動的にチェックしてスタッククラッシュ攻撃から保護します。 -
新しいコンパイラーフラグ
ffp-exception-behavior={ignore,maytrap,strict}
は、浮動小数点例外動作の指定を有効にします。デフォルト設定はignore
です。 -
新しいコンパイラーフラグ
ffp-model={precise,strict,fast}
により、単一の目的の浮動小数点オプションを簡素化できます。デフォルト設定はprecise
になります。 -
新しいコンパイラーフラグ
-fno-common
がデフォルトで有効になりました。今回の機能強化により、複数の翻訳ユニットで 10 つの変数定義を使用して C で書かれたコードが、複数の有効なリンカーエラーをトリガーするようになりました。この設定を無効にするには、-fcommon
フラグを使用します。 - LLVM Toolset のコンテナーイメージが非推奨になり、LLVM Toolset は Universal Base Images (UBI) リポジトリーに追加されました。
詳細は、アップストリームの LLVM 11.0.0 リリースノート を参照してください。