llvm-remarkutil - リマークユーティリティ

概要

llvm-remarkutil [サブコマンド] [オプション]

説明

異なるリマーク形式の情報を表示したり、変換したりするためのユーティリティです。

サブコマンド

  • bitstream2yaml - ビットストリームリマークをYAMLに再シリアライズします。

  • yaml2bitstream - YAMLリマークをビットストリームに再シリアライズします。

  • instruction-count - 関数の命令数を出力します。

  • annotation-count - アノテーションリマークからリマークタイプ数を表示します。

  • size-diff - サイズリマークの差分を計算します。

bitstream2yaml

使用法: llvm-remarkutil bitstream2yaml <入力ファイル> -o <出力ファイル>

概要

ビットストリームリマークファイルを入力として受け取り、そのファイルをYAMLとして再シリアライズします。

yaml2bitstream

使用法: llvm-remarkutil yaml2bitstream <入力ファイル> -o <出力ファイル>

概要

YAMLリマークファイルを入力として受け取り、そのファイルをビットストリーム形式で再シリアライズします。

instruction-count

使用法: llvm-remarkutil instruction-count <入力ファイル> –parser=<bitstream|yaml> [–use-debug-loc] -o <出力ファイル>

概要

すべての関数について命令数リマークを出力します。命令数リマークは、アセンブリ出力時の関数内の命令数をエンコードします。

命令数リマークにはasm-printerリマークが必要です。

CSV形式は以下のとおりです

Function,InstructionCount
foo,123

–use-debug-locが渡された場合、CSVにはソースパス、行番号、列が含まれます。

Source,Function,InstructionCount
path:line:column,foo,3

annotation-count

使用法: llvm-remarkutil annotation-count <入力ファイル> –parser=<bitstream|yaml> –annotation-type=<type> [–use-debug-loc] -o <出力ファイル>

概要

すべて関数に対してアノテーションタイプ<type>のリマークのカウントを出力します。カウントは、関数に挿入されたリマークチェックの数を表します。

アノテーションカウントのリマークにはAnnotationRemarksPassのリマークが必要です。

CSV形式は以下のとおりです

Function,Count
foo,123

–use-debug-locが渡された場合、CSVにはソースパス、行番号、列が含まれます。

Source,Function,Count
path:line:column,foo,3

count

使用法: llvm-remarkutil count [オプション] <入力ファイル>

概要

llvm-remarkutil count は、指定されたプロパティに基づいてリマークをカウントします。デフォルトでは、ツールは、ソースファイルまたは関数で発生したリマークの数、または生成されたリマークファイル全体のリマークの数をカウントします。また、特定の引数に基づいてカウントを収集することもサポートしています。レポートするには、指定された引数に整数値を指定する必要があります。

ツールには、リマーク名、パス名、引数値、リマークタイプに基づいてリマークカウントをフィルタリングするユーティリティが含まれています。

オプション

--parser=<yaml|bitstream>

入力リマークパーサーのタイプを選択します。必須です。

  • yaml : ツールはYAMLリマークを解析します。

  • bitstream : ツールはビットストリームリマークを解析します。

--count-by=<value>

リマークを収集するためのオプションを選択します。

  • remark-name : 個々のリマークがいくつ存在するかをカウントします。

  • arg : –(r)argsで渡された指定された引数に基づいてリマークをカウントします。引数値は数値である必要があります。

--group-by=<value>

プロパティごとにリマークのカウントをグループ化します。

  • source : ソースパスごとにカウントが収集されます。デバッグロケーションのないリマークはカウントされません。

  • function : カウントは関数ごとに収集されます。

  • function-with-loc : カウントは、ソースごとに、関数ごとに収集されます。デバッグロケーションのないリマークはカウントされません。

  • Total : 指定されたリマークファイルのカウントをレポートします。

--args[=引数]

count-byargに設定されている場合、このフラグを使用して、カンマ区切りの文字列で表される指定されたリマーク引数から収集できます。リマークをカウントするには、引数に数値が必要です。

--rargs[=引数]

count-byargに設定されている場合、このフラグを使用して、正規表現を使用して指定されたリマーク引数から収集できます。リマークをカウントするには、引数に数値が必要です。

--pass-name[=<string>]

パス名でカウントをフィルタリングします。

--rpass-name[=<string>]

正規表現を使用してパス名でカウントをフィルタリングします。

--remark-name[=<string>]

リマーク名でカウントをフィルタリングします。

--rremark-name[=<string>]

正規表現を使用してリマーク名でカウントをフィルタリングします。

--filter-arg-by[=<string>]

引数値でカウントをフィルタリングします。

--rfilter-arg-by[=<string>]

正規表現を使用して引数値でカウントをフィルタリングします。

--remark-type=<value>

以下のオプションでタイプごとにリマークをフィルタリングします。

  • 不明

  • 合格

  • 見逃し

  • 分析

  • 分析-fp-可換

  • 分析-エイリアシング

  • 失敗

size-diff

使用法: llvm-remarkutil size-diff [オプション] file_a file_b –parser parser

概要

llvm-remarkutil size-diff は、2つのリマークファイル: file_afile_bのサイズリマークの差分をとります。

llvm-remarkutil size-diff は、コード生成の変更によって最も影響を受けた関数を把握するために使用できます。

最も一般的なユースケースでは、file_afile_bは、異なるコンパイラーまたは異なる最適化設定固定ソースをコンパイルすることによって出力されるリマークになります。

llvm-remarkutil size-diff は、YAMLビットストリームのリマークの両方を処理します。

オプション

--parser=<yaml|bitstream>

入力リマークパーサーのタイプを選択します。必須です。

  • yaml : ツールはYAMLリマークを解析します。

  • bitstream : ツールはビットストリームリマークを解析します。

--report-style=<human|json>

出力スタイル。

  • human : 人間が読めるテキスト形式のレポート。デフォルトのオプションです。

  • json : JSON レポート。

--pretty

JSON出力をプリティプリントします。オプション。

出力がJSONに設定されていない場合、これは何も行いません。

-o=<file>

レポートの出力ファイル。デフォルトではstdoutに出力します。

人間が読める出力

llvm-remarkutil size-diff の人間が読める形式は、次の2つのセクションで構成されています

  • 関数ごとの変更。

  • すべての変更の概要。

変更された関数のセクション

2つのリマークファイルOLDとNEWを比較しているとします。

OLDとNEWで変更された命令数を持つ各関数について、llvm-remarkutil size-diffは以下のような行を出力します

(++|--|==) (>|<) function_name, N instrs, M stack B

形式の内訳は以下のとおりです

(++|--|==)

function_nameが存在するOLDとNEWのどちらか。

  • ++: NEWのみに存在します。(「追加」)

  • --: OLDのみに存在します。(「削除」)

  • ==: 両方に存在します。

(>|<)

function_nameが2番目のファイルでより多くの命令を持っているか、より少ない命令を持っているかを示します。

  • >:2番目のファイルが1番目のファイルよりも多くの命令を持っています。

  • <:2番目のファイルが1番目のファイルよりも少ない命令を持っています。

function_name

変更された関数の名前。

N instrs

2番目のファイルの命令数 - 1番目のファイルの命令数。

M stack B

2番目のファイルのスタックバイト数 - 1番目のファイルのスタックバイト数。

サマリーセクション

llvm-remarkutil size-diffは、変更されたすべての関数を出力した後、高レベルのサマリーを出力します。

instruction count: N (inst_pct_change%)
stack byte usage: M (sb_pct_change%)
N

2番目のファイルと1番目のファイル間のすべての命令数変更の合計。

inst_pct_change%

2番目のファイルと1番目のファイル間の命令数の増減率。

M

2番目のファイルと1番目のファイル間のすべてのスタックバイト数変更の合計。

sb_pct_change%

2番目のファイルと1番目のファイル間のスタックバイト使用量の増減率。

JSON出力

高レベルビュー

OLDとNEWの2つのファイルを比較していると仮定します。

llvm-remarkutil size-diffは、次のようにJSONを出力します。

"Files": [
  "A": "path/to/OLD",
  "B": "path/to/NEW"
]

"InBoth": [
  ...
],

"OnlyInA": [
  ...
],

"OnlyInB": [
  ...
]
ファイル

remarkファイルへの元のパス。

  • A:1番目のファイルへのパス。

  • B:2番目のファイルへのパス。

InBoth

両方のファイルに存在する関数。

OnlyInA

1番目のファイルにのみ存在する関数。

OnlyInB

2番目のファイルにのみ存在する関数。

関数JSON

InBothOnlyInA、およびOnlyInBセクションには、入力remarkファイルの各関数のサイズ情報が含まれています。

{
  "FunctionName" : "function_name"
  "InstCount": [
      INST_COUNT_A,
      INST_COUNT_B
    ],
  "StackSize": [
      STACK_BYTES_A,
      STACK_BYTES_B
    ],
}
FunctionName

関数の名前。

InstCount

関数の命令数。

  • INST_COUNT_A:OLDの命令数。

  • INST_COUNT_B:NEWの命令数。

StackSize

関数のスタックバイト数。

  • STACK_BYTES_A:OLDのスタックバイト数。

  • STACK_BYTES_B:NEWのスタックバイト数。

関数JSONからの差分の計算

関数JSONには差分は含まれていません。llvm-remarkutil size-diffからJSON出力を消費するツールは、差分を別途計算する必要があります。

差分を計算するには

  • 命令数の差分:INST_COUNT_B - INST_COUNT_A

  • スタックバイト数の差分:STACK_BYTES_B - STACK_BYTES_A

終了ステータス

llvm-remarkutil size-diffは、成功した場合は0を、それ以外の場合はゼロ以外の値を返します。