llvm-remarkutil - 备注实用程序

概要

llvm-remarkutil [子命令] [选项]

描述

用于显示信息以及在不同备注格式之间进行转换的实用程序。

子命令

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=<类型> [–use-debug-loc] -o <输出文件>

摘要

为每个函数输出注释类型<类型>备注的计数。该计数表示在函数中插入的备注检查次数。

注释计数备注需要 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=<值>

选择按什么收集备注的选项。

  • remark-name:计算存在多少个单独的备注。

  • arg:根据 –(r)args 传递的指定参数计算备注。参数值必须是数字。

--group-by=<值>

按属性对备注的计数进行分组。

  • source:将按源路径收集计数。没有调试位置的备注将不会被计算。

  • function:按函数收集计数。

  • function-with-loc:按函数和源代码收集计数。没有调试位置的备注将不会被计算。

  • Total:报告提供的备注文件的计数。

--args[=参数]

如果count-by设置为arg,则可以使用此标志从表示为逗号分隔字符串的指定备注参数中收集。参数必须具有数值才能能够按此计数备注

--rargs[=参数]

如果count-by设置为arg,则可以使用此标志使用正则表达式从指定的备注参数中收集。参数必须具有数值才能能够按此计数备注

--pass-name[=<字符串>]

按传递名称过滤计数。

--rpass-name[=<字符串>]

使用正则表达式按传递名称过滤计数。

--remark-name[=<字符串>]

按备注名称过滤计数。

--rremark-name[=<字符串>]

使用正则表达式按备注名称过滤计数。

--filter-arg-by[=<字符串>]

按参数值过滤计数。

--rfilter-arg-by[=<字符串>]

使用正则表达式按参数值过滤计数。

--remark-type=<值>

使用以下选项按类型过滤备注。

  • 未知

  • 已通过

  • 未通过

  • 分析

  • 分析-浮点数交换

  • 分析-别名

  • 失败

size-diff

用法:llvm-remarkutil size-diff [选项] 文件_a 文件_b –parser 解析器

摘要

llvm-remarkutil size-diff 对两个备注文件中的大小备注进行差异化:文件_a文件_b

llvm-remarkutil size-diff 可用于深入了解哪些函数受代码生成更改的影响最大。

在大多数常见用例中,文件_a文件_b 将是通过使用不同的编译器不同的优化设置编译固定的源代码而输出的备注。

llvm-remarkutil size-diff 处理YAML位流备注。

选项

--parser=<yaml|bitstream>

选择输入备注解析器的类型。必需。

  • yaml:该工具将解析 YAML 备注。

  • bitstream:该工具将解析位流备注。

--report-style=<human|json>

输出样式。

  • human:人类可读的文本报告。默认选项。

  • json:JSON 报告。

--pretty

漂亮打印 JSON 输出。可选。

如果输出未设置为 JSON,则此操作无效。

-o=<文件>

报告的输出文件。默认输出到标准输出。

人类可读输出

llvm-remarkutil size-diff 的人类可读格式由两部分组成

  • 每个函数的更改。

  • 所有更改的高级摘要。

已更改函数部分

假设您正在比较两个备注文件 OLD 和 NEW。

对于 OLD 和 NEW 中指令计数已更改的每个函数,llvm-remarkutil size-diff 将发出如下所示的行

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

格式的细分如下

(++|--|==)

函数_名称 在 OLD 和 NEW 中的哪一个中存在。

  • ++:仅在 NEW 中。(“已添加”)

  • --:仅在 OLD 中。(“已删除”)

  • ==:在两者中都存在。

(>|<)

表示函数_名称 在第二个文件中是否具有更多指令或更少指令。

  • >: 第二个文件中的指令数量多于第一个文件。

  • <: 第二个文件中的指令数量少于第一个文件。

function_name

已更改函数的名称。

N instrs

第二个文件指令计数 - 第一个文件指令计数。

M stack B

第二个文件栈字节计数 - 第一个文件栈字节计数。

摘要部分

llvm-remarkutil size-diff 在打印所有已更改函数后将输出高级摘要。

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

第二个文件和第一个文件之间所有指令计数更改的总和。

inst_pct_change%

第二个文件和第一个文件之间指令计数的百分比增长或减少。

M

第二个文件和第一个文件之间所有栈字节计数更改的总和。

sb_pct_change%

第二个文件和第一个文件之间栈字节使用量的百分比增长或减少。

JSON 输出

高级视图

假设我们正在比较两个文件,OLD 和 NEW。

llvm-remarkutil size-diff 将输出如下 JSON。

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

"InBoth": [
  ...
],

"OnlyInA": [
  ...
],

"OnlyInB": [
  ...
]
文件

备注文件的原始路径。

  • A: 第一个文件的路径。

  • B: 第二个文件的路径。

InBoth

两个文件中都存在的函数。

OnlyInA

仅在第一个文件中存在的函数。

OnlyInB

仅在第二个文件中存在的函数。

函数 JSON

The InBothOnlyInAOnlyInB 部分包含输入备注文件中每个函数的大小信息。

{
  "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,否则返回非零值。