2020年12月28日月曜日

C-Reduceを使ってみたよ 2

C-Reduceを使って、これでデバッグが捗る!!と思ったわけですが、甘かったのです。

$ ls -l test.cc*
-rw-r--r-- 1 jam jam 134 Dec 27 09:23 test.cc
-rw-r--r-- 1 jam jam 13892 Dec 27 09:02 test.cc.orig
$ clang -O3 -fvectorize ... -S -emit-llvm test.cc
$ ls -l test.ll
-rw-r--r-- 1 jam jam 1031219 Dec 27 09:55 test.ll

orz... ヘッダファイルのre.hはデカかった・・・。

なので、一度cppで展開してから、もう一度C-Reduceを掛けます。

$ clang ... test.cc -E -o test2.cc
$ creduce test2.sh test2.cc
...
$ ls -l test2.cc*
-rw-r--r-- 1 jam jam 1180 Dec 27 10:41 test2.cc
-rw-r--r-- 1 jam jam 2350864 Dec 27 10:19 test2.cc.orig
$ clang -O3 -fvectorize ... -S -emit-llvm test2.cc
$ ls -l test2.ll
-rw-r--r-- 1 jam jam 8500 Dec 27 11:04 test2.ll
$ wc test2.ll
136 981 8500 test2.ll

よしよし、大分いい感じに。最初から`-E`で展開してから作業すべきでしたね。

2020年12月27日日曜日

C-Reduceを使ってみたよ

以前から気になってた、C-Reduceを、ついに使ってみました!

Cコードを破壊的に削っていくプログラムなのですが、コンパイラのバグが出たコードを、問題の箇所だけに削るのに便利なプログラムです。

案に違わず、なんでこれまで使ってなかったんだ、俺の馬鹿馬鹿!みたいな結果でした。まずは分かりやすく結果から。

$ ls -l test.cc
-rw-r--r-- 1 jam jam 13892 Dec 27 09:02 test.cc
$ creduce test.sh test.cc
...
#include "re.h"
namespace benchmark {
void a(std::string b) {
std::string d;
Regex c;
c.Init(b, &d);
}
} // namespace benchmark

え、そんだけ!?!?そんなに削ってくれるの!?

関数単位で削ってくれるだけかな?とか思ってたんですが、関数内のコードもガンガン削って、変数名なども適当に付け替えてくれて、超有能です!!

作るテストスクリプトは以下みたいな感じ。検出したい、エラーが出るパターンに!を付けます。!パターンだけだと、削り過ぎてsyntax errorが出るようになった時にcompile errorとsyntax errorが区別できなくなるので、コンパイルできて(syntax errorじゃなくて)、かつ最適化するとエラーになる物を検出としています。

$ cat test.sh
#!/bin/bash
clang -O3 -fno-vectorize ... &&\
! clang -O3 -fvectorize ...

いやあ、超便利!有能!なんで俺はこれまで使ってこなかったんだ・・・!!