テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(macro-of-inline report) 変換の過程をロギングするrecordオプションの実装

macro-of-inlineは, inline関数を等価なマクロに変換するために, 多段的な変換を行っています.

その過程をファイルとして残すことは, デバッグにも役立つ可能性がありますし, macro-of-inlineに始めて触れる人が, 変換の概要を掴むためにも役立ちます. 今日追加したrecordオプションをつけると, 変換の過程をロギングします.

$ macro-of-inline tests/proj/main.c --record

--recordオプションが指定された場合, オプション引数がなければ, "./record-macro-of-inline"に, オプション引数があればそのディレクトリ以下に, ログを出力します. 例えば, 上の小さなテストケース(tests/proj)に適用した場合, 以下のようなファイルを出力します.

トップレベルに並んでいるファイルは, 「ファイル変換ごと」の中間結果です. そしてd-(d+1)のようなディレクトリは, (より粒度の細かい)そのファイル変換間の, 関数変換のログです. マクロ化(macroize)してから, 整形処理のようなことをしてることがわかります. ラベルを固定長にしたり, gccでインクルードしてしまった要素を消して, もとのソースコードにあったものを復元すると言った処理を行っています. これは, 実際にコンパイルして実行する環境に渡すまでずっとLinux+Gccの環境で前処理をするという方針にもとづきます.

akira@Hercules:~/macro-of-inline$ tree record-macro-of-inline/
record-macro-of-inline/
|-- 1-2
|   |-- f_guard
|   |   |-- 1-rename_function_body.txt
|   |   |-- 2-rename_args.txt
|   |   `-- 3-insert_decl_lines.txt
|   |-- ff
|   |   |-- 1-rename_function_body.txt
|   |   |-- 2-rename_args.txt
|   |   `-- 3-insert_decl_lines.txt
|   |-- fff
|   |   |-- 1-rename_function_body.txt
|   |   |-- 2-rename_args.txt
|   |   `-- 3-insert_decl_lines.txt
|   |-- inf
|   |   |-- 1-rename_function_body.txt
|   |   |-- 2-rename_args.txt
|   |   `-- 3-insert_decl_lines.txt
|   `-- inf_2
|       |-- 1-rename_function_body.txt
|       |-- 2-rename_args.txt
|       `-- 3-insert_decl_lines.txt
|-- 1-preprocessed.txt
|-- 2-sanitize_names.txt
|-- 3-4
|   |-- f_guard
|   |   |-- 4-insert_goto_label.txt
|   |   |-- 5-rewrite_return_to_goto.txt
|   |   |-- 6-append_namespace_to_labels.txt
|   |   `-- 7-memoize.txt
|   |-- ff
|   |   |-- 4-insert_goto_label.txt
|   |   |-- 5-rewrite_return_to_goto.txt
|   |   |-- 6-append_namespace_to_labels.txt
|   |   `-- 7-memoize.txt
|   |-- fff
|   |   |-- 4-insert_goto_label.txt
|   |   |-- 5-rewrite_return_to_goto.txt
|   |   |-- 6-append_namespace_to_labels.txt
|   |   `-- 7-memoize.txt
|   |-- inf
|   |   |-- 4-insert_goto_label.txt
|   |   |-- 5-rewrite_return_to_goto.txt
|   |   |-- 6-append_namespace_to_labels.txt
|   |   `-- 7-memoize.txt
|   `-- inf_2
|       |-- 4-insert_goto_label.txt
|       |-- 5-rewrite_return_to_goto.txt
|       |-- 6-append_namespace_to_labels.txt
|       `-- 7-memoize.txt
|-- 3-labelize_func_call.txt
|-- 4-macroize.txt
|-- 5-normalize_labels.txt
|-- 6-delete_included_decls.txt
`-- 7-union_header_directives.txt

と言ってたら, バグに気づきました. 5-7の処理は危険だ・・・fake includeを使ってマクロを展開してはならない... (ざわ・・ざわざわ・・・)