LLVM 11.0.0 Toolset の使用

Red Hat Developer Tools 1

LLVM 11.0.0 Toolset のインストールおよび使用

概要

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

多様性を受け入れるオープンソースの強化

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
RHEL 8 — 11.0.0

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

lldb

RHEL 7 — 11.0.1
RHEL 8 — 11.0.0

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

compiler-rt

RHEL 7 — 11.0.1
RHEL 8 — 11.0.0

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

llvm

RHEL 7 — 11.0.1
RHEL 8 — 11.0.0

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

libomp

RHEL 7 — 11.0.1
RHEL 8 — 11.0.0

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

lld

RHEL 7 — 11.0.1
RHEL 8 — 11.0.0

LLVM リンカー。

python-lit

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

  • 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

手順

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

オンラインドキュメント

第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.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 が読み取り可能なデバッグ情報でコンパイルするには、使用するコンパイラーがデバッグ情報の作成に指示されていることを確認してください。

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 へのエイリアスではありません。両方のコマンドを使用してブレークポイントを設定できますが、bgdb 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「新しいブレークポイントの設定」 の手順に問題なく従っていることを前提としています。

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;

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

オンラインドキュメント

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

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

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

Red Hat Universal Base Images (UBI) コンテナーの上に、独自の LLVM Toolset コンテナーイメージを構築できます。LLVM のコンテナーイメージの基盤として UBI を使用する方法の詳細は、「UBI リポジトリーの使用」 を参照してください。

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. 関連情報

第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 リリースノート を参照してください。