プログラムのパフォーマンス解析

ロック lint 環境の管理

ロック lint インタフェースは、シェルで実行される lock_lint コマンドと lock_lint サブコマンドから構成されます。デフォルトでは、ロック lint は環境変数 $SHELL によって指定されるシェルを使用します。あるいは、lock_lint start コマンドで使用するシェルを指定することによって、ロック lint は任意のシェルを実行できます。以下の例では、Korn シェルでロック lint セッションを開始しています。


% lock_lint start /bin/ksh

ロック lint は子シェル上で見られる LL_CONTEXT という環境変数を作成します。初期設定のために準備したシェルを使用する場合、ホームディレクトリの .ll_init ファイルを、lock_lint コマンドが読み込むようにアレンジし、カレントディレクトリの .ll_init ファイル (存在する場合は) を実行させることができます。csh を使用する場合は、.cshrc ファイルに以下のコードを挿入することで、こうした操作を実行できます。


if ($?LL_CONTEXT) then
     if (-x $(HOME)/.ll_init) source $(HOME)/.ll_init
endif

ロック lint を同じファイルに対して実行したいと考えるほかのユーザーが、同じシェルを使うとは限らないため、.cshrc に現在の作業ディレクトリのファイルを読み込ませないようにすることをお薦めします。ユーザーの $(HOME)/.ll_init を使用するのは 1 人だけであるため、ロック lint セッション中にプロンプトを変更し、使用するエイリアスを定義できるように、$(HOME)/.ll_init を読み込む形式とすべきです。以下の 〜/.ll_init バージョンは csh に対してこの操作を実行します。


# Cause analyze subcommand to save state before analysis.
alias analyze "lock_lint save before analyze;¥
    lock_lint analyze"
# Change prompt to show we are in lock_lint.
set prompt="lock_lint‾$prompt"

startも参照してください。

サブコマンドを実行する場合は、目的に応じて、パイプ、リダイレクト、逆引用符 (``) などを利用できます。たとえば、以下のコマンドは、ロック foo がすべてのグローバル変数を保護することをアサートしています (グローバル変数の公式名称はコロンで始まります)。


% lock_lint assert foo protects `lock_lint vars | grep ^:`

一般的に、サブコマンドは grepsed などのフィルタとともに簡単に利用できるように設定されます。特に、各変数や関数に対して 1 行分の情報を出力する varsfuncs には、こうした機能は欠かせません。各行には、変数や関数の (定義されたあるいは派生した) 属性が含まれます。以下の例は、構造体 bar のどのメンバーが、メンバー lock によって保護されるかを示します。


% lock_lint vars -a `lock_lint members bar` | grep =bar::lock

シェルインタフェースを使用するため、ユーザーコマンドのログは、シェルの履歴 (history) 機能を利用することで得られます (history のレベルは、.ll_init ファイルにおいて、大きめに設定する必要があるかもしれません)。

一時ファイル

$TMPDIR が設定されていない限り、ロック lint は /var/tmp に一時利用ファイルを出力します。

メークファイルの規則

.ll ファイルを生成するように メークファイルを修正するには、まずは .c から .o を作成するための規則を使って、.c から .ll を作成するルールを記述します。たとえば、以下の例から、その次の例を記述できます。


# Rule for making .o from .c in ../src.
%.o: ../src/%.c
    $(COMPILE.c) -o $@ $<


# Rule for making .ll from .c in ../src.
%.ll: ../src/%.c
    cc $(CFLAGS) $(CPPFLAGS) $(FOO) $<

上記の例では、コンパイラオプション (CFLAGSCPPFLAGS) 用のメークマクロに -Zll フラグが指定されていなければなりません。

接尾辞規則を使用する場合、.ll をサフィックスとして定義する必要があります。そのため、ユーザーによっては、% ルールの使用を好むかもしれません。

適切な .o ファイルが make 変数 FOO_OBJS に含まれている場合、以下の行によって FOO_LLS を作成できます。


FOO_LLS = ${FOO_OBJS:%.o=%.ll}

あるいは、それらがサブディレクトリ ll にある場合は、以下のようになります。


FOO_LLS = ${FOO_OBJS:%.o=ll/%.ll}

サブディレクトリ ll/.ll ファイルを保存したい場合、以下のラベルにより、メークファイルに自動的にこのファイルを作成させることができます。


.INIT:
     @if [ ! -d ll ]; then mkdir ll; fi