LLVM 9.0.1 Toolset の使用

Red Hat Developer Tools 1

LLVM 9.0.1 ツールセットのインストールおよび使用

概要

LLVM は、Red Hat Enterprise Linux プラットフォームで開発者向けの Red Hat 製品です。LLVM の使用では、この製品の概要、ツールの LLVM バージョンの呼び出しおよび使用方法、および詳細な情報を含むリソースへのリンクを説明します。

第1章 LLVM

1.1. LLVM Toolset の概要

LLVM Toolset は、Red Hat Enterprise Linux プラットフォームで開発者向けの Red Hat 製品です。これは、LLVM コンパイラーインフラストラクチャーフレームワーク、C 言語および C++ 言語用の Clang コンパイラー、LLDB デバッガー、コード解析の関連ツールを提供します。

LLVM Toolset は、Red Hat Enterprise Linux 7 の一部として配布されており、Red Hat Enterprise Linux 8 でモジュールとして利用できます。

以下のコンポーネントは、LLVM Toolset の一部として利用できます。

表1.1 LLVM コンポーネント

名前バージョン説明

clang

9.0.1

C および C++ の LLVM コンパイラーフロントエンド。

lldb

9.0.1

LLVM の一部を使用した C および C++ デバッガー。

compiler-rt

9.0.1

LLVM のランタイムライブラリー。

llvm

9.0.1

一連のモジュールおよび再利用可能なコンパイラーおよびツールチェーン技術。

libomp

9.0.1

並列プログラミングに Open MP API 仕様を使用するためのライブラリー。

lld

9.0.1

LLVM リンカー。

python-lit

0.9.0

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 では、以下のアーキテクチャーで利用できます。

  • 64 ビット Intel および AMD アーキテクチャー
  • 64 ビット ARM アーキテクチャー
  • IBM Power Systems アーキテクチャー
  • IBM Power Systems アーキテクチャーのリトルエンディアンバリアント
  • IBM Z Systems アーキテクチャー

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

手順

  1. サーバーから最新のサブスクリプションデータを取得します。

    # subscription-manager refresh
  2. 以下のコマンドを使用して、システムを登録します。

    # subscription-manager register

    また、Red Hat Subscription Management ドキュメントの Registering and Unregistering a System の適切な手順に従って、システムを登録することもできます。

  3. システムで利用可能なすべてのサブスクリプションの一覧を表示し、サブスクリプションのプール ID を特定します。

    # subscription-manager list --available

    このコマンドは、サブスクリプション名、一意の ID、有効期限などの関連情報を表示します。プール ID は、Pool ID で始まる行に一覧表示されます。

  4. Red Hat Developer Tools リポジトリーへのアクセスを提供するサブスクリプションを割り当てます。直前の手順で特定したプール ID を使用します。

    # subscription-manager attach --pool=<appropriate pool ID from the subscription>
  5. システムに割り当てられているサブスクリプションの一覧を確認します。

    # sudo subscription-manager list --consumed
  6. 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 を使用して、最も幅広い開発ツールにアクセスすることを検討してください。

  7. rhel-variant-rhscl-7-rpms レポジトリーを有効化します。

    # subscription-manager repos --enable rhel-variant-rhscl-7-rpms

    variant を、Red Hat Enterprise Linux システムのバリアント (server または workstation) に置き換えます。

  8. 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 更新をインストールします。

  1. オペレーティングシステムの LLVM Toolset に含まれるすべてのコンポーネントをインストールします。

    • Red Hat Enterprise Linux 7 に、llvm-toolset 9.0 コレクションをインストールします。

      # yum install llvm-toolset-9.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-9.0-cmake パッケージをインストールします。

# yum install llvm-toolset-9.0-cmake llvm-toolset-9.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 では、Red Hat の opt/rh/llvm-toolset-9.0/root/usr/share/doc/llvm-toolset-9.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-9.0 パッケージをインストールします。
# yum install llvm-toolset-9.0-llvm-doc

このドキュメントは、/opt/rh/llvm-toolset-9.0/root/usr/share/doc/llvm-toolset-9.0-llvm-9.0.1/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 とその機能に関する詳細な説明は、本書の対象外です。詳細は、以下に記載のドキュメントを参照してください。

オンラインドキュメント

第2章 clang

clang は C、C++、Objective C/C++、OpenCL、および C をベースとする言語の LLVM コンパイラーフロントエンドです。

LLVM Toolset には、clang 9.0.1 が同梱されています。

2.1. clang の使用

注記

Red Hat Enterprise Linux 7 で scl ユーティリティーを使用してコマンドを実行すると、利用可能な LLVM バイナリーで実行することができます。すべてのコマンドで scl enable を使用せずに Red Hat Enterprise Linux 7 で LLVM Toolset を使用するには、次のコマンドを指定してシェルセッションを実行します。

$ scl enable llvm-toolset-9.0.1 'bash'

2.1.1. C ソースファイルのバイナリーファイルへのコンパイル

C プログラムをバイナリーファイルにコンパイルするには、次のコマンドを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable llvm-toolset-9.0.1 '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-9.0.1 'clang -o hello hello.c'
  • Red Hat Enterprise Linux 8 の場合:

    $ clang -o hello hello.c

これにより、現在の作業ディレクトリーに hello という新しいバイナリーファイルが作成されます。

2.1.2. オブジェクトファイルへの C ソースファイルのコンパイル

複数のソースファイルで設定されるプロジェクトで作業する場合、各ソースファイルのオブジェクトファイルを最初にコンパイルしてから、これらのオブジェクトファイルをリンクすることが一般的です。これにより、単一のソースファイルを変更する場合は、プロジェクト全体をコンパイルせずにこのファイルのみを再コンパイルできます。

C ソースファイルをオブジェクトファイルにコンパイルするには、以下を実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable llvm-toolset-9.0.1 'clang -o object_file -c source_file'
  • Red Hat Enterprise Linux 8 の場合:

    $ clang -o object_file -c source_file

これにより、object_file という名前のオブジェクトファイルが作成されます。-o オプションを省略すると、コンパイラーは、.c というファイル拡張子が付いたソースファイルからという名前のファイルを作成します。

2.1.4. clang 統合アセンブラーの使用

アセンブリー言語プログラムからオブジェクトファイルを生成するには、以下のように clang ツールを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable llvm-toolset-9.0.1 'clang -o object_file source_file'
  • Red Hat Enterprise Linux 8 の場合:

    $ clang -o object_file source_file

これにより、現在の作業ディレクトリーに object_file という名前のオブジェクトファイルが作成されます。

2.2. C プログラムの実行

clang がプログラムをコンパイルすると、実行可能なバイナリーファイルが作成されます。コマンドラインでこのプログラムを実行するには、実行ファイルがあるディレクトリーに移動し、プログラムを実行します。

$ ./file_name

例2.2 コマンドラインでの C プログラムの実行

例2.1「clang で C プログラムのコンパイル」 にあるように hello バイナリーファイルを正常にコンパイルしたと仮定して、シェルプロンプトで次のコマンドを実行します。

$ ./hello
Hello, World!

2.3. clang++ の使用

注記

Red Hat Enterprise Linux 7 で scl ユーティリティーを使用してコマンドを実行すると、利用可能な LLVM バイナリーで実行することができます。すべてのコマンドで scl enable を使用せずに Red Hat Enterprise Linux 7 で LLVM Toolset を使用するには、次のコマンドを指定してシェルセッションを実行します。

$ scl enable llvm-toolset-9.0.1 'bash'

2.3.1. C++ ソースファイルのバイナリーファイルへのコンパイル

コマンドラインで C++ プログラムをコンパイルするには、以下のように clang++ コンパイラーを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable llvm-toolset-9.0.1 'clang++ -o output_file source_file ...'
  • Red Hat Enterprise Linux 8 の場合:

    $ clang++ -o output_file source_file ...

これにより、現在の作業ディレクトリーに output_file という名前のバイナリーファイルが作成されます。-o オプションを省略すると、デフォルトで、clang++ コンパイラーは a.out という名前の ファイルを作成します。

2.3.2. オブジェクトファイルへの C++ ソースファイルのコンパイル

複数のソースファイルで設定されるプロジェクトで作業する場合、各ソースファイルのオブジェクトファイルを最初にコンパイルしてから、これらのオブジェクトファイルをリンクすることが一般的です。これにより、単一のソースファイルを変更する場合は、プロジェクト全体をコンパイルせずにこのファイルのみを再コンパイルできます。

コマンドラインでオブジェクトファイルをコンパイルするには、以下のコマンドを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable llvm-toolset-9.0.1 'clang++ -o object_file -c source_file'
  • Red Hat Enterprise Linux 8 の場合:

    $ clang++ -o object_file -c source_file

これにより、object_file という名前のオブジェクトファイルが作成されます。-o オプションを省略すると、clang++ コンパイラーは、.o ファイル拡張子でソースファイルの名前が付けられたファイルを作成します。

2.3.3. C++ オブジェクトファイルのバイナリーファイルへのリンク

オブジェクトファイルをリンクし、バイナリーファイルを作成します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable llvm-toolset-9.0.1 '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.3 コマンドラインでの 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-9.0.1 'clang++ -o hello hello.cpp'
  • Red Hat Enterprise Linux 8 の場合:

    $ clang++ -o hello hello.cpp

これにより、現在の作業ディレクトリーに hello という新しいバイナリーファイルが作成されます。

2.4. C プログラムの実行

clang++ がプログラムをコンパイルすると、実行可能なバイナリーファイルが作成されます。実行可能ファイルでディレクトリーに移動し、このプログラムを実行します。

./file_name

例2.4 コマンドラインでの C++ プログラムの実行

例2.3「コマンドラインでの C プログラムのコンパイル」 にあるように hello バイナリーファイルを正常にコンパイルしたと仮定して、シェルプロンプトで次のコマンドを実行します。

$ ./hello
Hello, World!

2.5. 関連情報

clang コンパイラーおよびその機能の詳しい説明は、本書の対象外となっています。詳細は、以下に記載のドキュメントを参照してください。

インストールされているドキュメント

  • clang(1): clang コンパイラーの man ページでは、その使用方法に関する詳細情報が提供されます。一部の例外を除き、clang++clang と同じコマンドラインオプションを受け付けます。LLVM Toolset に含まれるバージョンの man ページを表示するには、次のコマンドを実行します。
  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable llvm-toolset-9.0.1 'man clang'
  • Red Hat Enterprise Linux 8 の場合:

    $ man clang

オンラインドキュメント

  • clang: clang コンパイラードキュメントでは、clang の使用に関する詳細情報が提供されています。

以下も併せて参照してください。

  • 1章LLVM: LLVM の概要およびそのシステムへのインストール方法の詳細

第3章 lldb

lldb は、C および C++ で書かれたプログラムのデバッグに使用できるコマンドラインツールです。これにより、デバッグするコード内でメモリーを検査したり、コードの実行状態を制御したり、コードの特定セクションの実行を検出したりできます。

LLVM Toolset には、lldb 9.0.1 が同梱されています。

注記

Red Hat Enterprise Linux 7 で scl ユーティリティーを使用してコマンドを実行すると、利用可能な LLVM バイナリーで実行することができます。すべてのコマンドで scl enable を使用せずに Red Hat Enterprise Linux 7 で LLVM Toolset を使用するには、次のコマンドを指定してシェルセッションを実行します。

$ scl enable llvm-toolset-9.0.1 'bash'

3.1. デバッグプログラムの準備

C または C++ プログラムを lldb が読み取り可能なデバッグ情報でコンパイルするには、使用するコンパイラーがデバッグ情報の作成に指示されていることを確認してください。

3.2. lldb の実行

デバッグするプログラムで lldb を実行するには、次のコマンドを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable llvm-toolset-9.0.1 'lldb program_file_name'
  • Red Hat Enterprise Linux 8 の場合:

    $ lldb program_file_name

このコマンドは、対話モードで lldb を開始し、デフォルトのプロンプト (lldb) を表示します。

デバッグセッションを終了してシェルプロンプトに戻るには、いつでも以下のコマンドを実行します。

(lldb) quit

例3.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-9.0.1 '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-9.0.1 '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 がデバッグする準備が整っていることを示しています。

3.3. ソースコードの一覧表示

デバッグしているプログラムのソースコードを表示するには、次のコマンドを実行します。

(lldb) list

これにより、ソースコードの最初の 10 行が表示されます。

特定の行からコードを表示するには、次のコマンドを実行します。

(lldb) list source_file_name:line_number

さらに、lldb は、以下の状況で自動的にソースコードの一覧を表示します。

  • デバッグするプログラムの実行を開始する前に、lldb はソースコードの最初の 10 行を表示します。
  • プログラムの実行が停止するたびに、lldb により、実行が停止する行が示されます。

3.4. ブレークポイントの使用

新しいブレークポイントの設定

特定の行に新しいブレークポイントを設定するには、以下を行います。

(lldb) breakpoint source_file_name:line_number

特定の関数でブレークポイントを設定するには、以下を行います。

(lldb) breakpoint source_file_name:function_name

例3.2 新しいブレークポイントの設定

この例では、例3.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

例3.3 ブレークポイントの一覧表示

この例では、例3.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

例3.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

3.5. 実行の開始

デバッグしているプログラムの実行を開始するには、次のコマンドを実行します。

(lldb) run

プログラムがコマンドライン引数を許可する場合は、run コマンドに引数として指定できます。

(lldb) run argument

最初のブレークポイントに達するか、エラーが発生したとき、またはプログラムが終了したときに実行が停止します。

例3.5 lldb でのフィボナッチバイナリーファイルの実行

この例では、例3.2「新しいブレークポイントの設定」 の手順に問題なく従っていることを前提としています。

lldbfibonacci バイナリーファイルを実行します。

(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;

例3.2「新しいブレークポイントの設定」 に設定されたブレークポイントでプログラムの実行が停止します。

3.6. 現在のプログラムデータの表示

lldb ツールを使用すると、以下を含むプログラムの状態に関連するデータを表示できます。

  • 複雑さの変数
  • 任意の有効な式
  • 関数呼び出しの戻り値

一般的な使用方法は、変数の値を表示することです。特定の変数の現在の値を表示するには、次のコマンドを実行します。

(lldb) print variable_name

例3.6 変数の現在の値の表示

この例では、例3.5「lldb でのフィボナッチバイナリーファイルの実行」 の手順に問題なく従っていることを前提としています。fibonacci バイナリーの実行は、ブレークポイントが 10 行目に到達すると停止しました。

変数 a および b の現在の値を表示します。

(lldb) print a
$0 = 0
(lldb) print b
$1 = 1

3.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

例3.7 ブレークポイント後の fibonacci バイナリーファイルの実行の継続

この例では、例3.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

3.8. 関連情報

lldb とそのすべての機能に関する詳細な説明は、本書の対象外です。詳細は、以下に記載のドキュメントを参照してください。

オンラインドキュメント

以下も併せて参照してください。

  • 1章LLVM: LLVM の概要と、そのインストール方法の詳細情報

第4章 LLVM Toolset を使用したコンテナーイメージ

LLVM Toolset は、RHEL 7 および RHEL 8 のコンテナーイメージとして利用できます。Red Hat Container Registry からダウンロードできます。

4.1. イメージの内容

RHEL 7 および RHEL 8 コンテナーイメージは、次のパッケージに対応するコンテンツを提供します。

コンポーネントバージョンパッケージ

llvm

9.0.1

llvm-toolset-9.0.1-llvm

clang

9.0.1

llvm-toolset-9.0.1-clang

lldb

9.0.1

llvm-toolset-9.0.1-lldb

Runtime libraries

9.0.1

llvm-toolset-9.0.1-compiler-rt

OpenMP library

9.0.1

llvm-toolset-9.0.1-libomp

lld

9.0.1

llvm-toolset-9.0.1-lld

python-lit

0.9.0

llvm-toolset-9.0.1-python-lit

4.2. イメージへのアクセス

必要なイメージをプルするには、root で以下のコマンドを実行します。

RHEL 7 コンテナーイメージの場合:

# podman pull registry.redhat.io/devtools/llvm-toolset-rhel7

RHEL 8 コンテナーイメージの場合:

# podman pull registry.redhat.io/rhel8/llvm-toolset

4.3. Source-to-Image を使用したビルダーイメージとしての使用

LLVB ツールセットコンテナーイメージは、Source-to-Image(S2I) ビルダーイメージとして使用するために準備されます。

アプリケーションをビルドして実行できるようにするには、以下を実行します。

  • 独自の assemble スクリプトを /.s2i/bin に追加します。
  • 独自の実行スクリプトを /.s2i/bin に追加します。
  • 次のコマンドを実行します。

    $ s2i build \file://.app container-image container-image-application name.

例4.1 Source-to-Image を使用した LLVM アプリケーションイメージの構築

hello-world アプリケーションを構築するには、以下を実行します。

$ git clone https://github.com/sclorg/llvm-container
s2i build llvm-container/7/test/hello-world/app/ devtools/llvm-toolset-rhel7 llvm-hello-world

ローカルで利用可能なアプリケーションイメージ hello-world は、llvm-toolset コンテナーイメージを使用して GitHub のリポジトリーからビルドされます。

LLVM を S2I ビルダーイメージとしてフルに活用するには、変更した S2I アセンブリスクリプトを使用し、ビルドしている特定のアプリケーションをさらに調整してカスタムイメージをビルドします。

Source-to-Image を使用した LLVM の使用方法の詳細な説明は、本書の対象外です。Source-to-Image の詳細は以下を参照してください。

4.4. 関連情報

第5章 LLVM 9.0.1 Toolset の変更点

LLVM Toolset のバージョンが 8.0.1 から 9.0.1 に更新されました。

今回の更新で、asm goto ステートメントに対応するようになりました。この変更により、AMD64 および Intel 64 アーキテクチャーで Linux カーネルをコンパイルできます。

詳細は、アップストリームの LLVM 9.0.0 リリースノート を参照してください。