続 gcc-4.2.1-dw2-2でビルドしたbjamがクラッシュする問題
sjlj版でも再現したので、gcc4.2.1のバグと見なして追っかけてみました。
file_dirscan()では、
ということをやっているので、初回呼び出し時は_findfirst/_findnextの呼び出しに移るはずなのですが、いきなりキャッシュヒットしちゃっています。
原因は、
file_info_t * file_info(char * filename) { file_info_t finfo_, *finfo = &finfo_; if ( !filecache_hash ) filecache_hash = hashinit( sizeof( file_info_t ), "file_info" ); finfo->name = filename; if ( hashenter( filecache_hash, (HASHDATA**)&finfo ) ) { /* printf( "file_info: %s\n", filename ); */ finfo->name = newstr( finfo->name ); finfo->is_file = 0; finfo->is_dir = 0; finfo->size = 0; finfo->time = 0; finfo->files = 0; } return finfo; }filesys.c
の「〜 = 0」の部分が、最適化器のバグでごっそり消えていることでした。
この問題は次のコードで再現できました。
struct hoge { int a; }; void bar(struct hoge** p); struct hoge* foo() { struct hoge _h, *h = &_h; bar(&h); h->a = 0; return h; }
「-fdump-tree-all」オプションで中間結果を確認すると、dce1のフェーズで「h->a = 0」が消えています。(dce=Dead Code Elimination)
で、Bugzillaで検索したらこんなのが見つかりました。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32328
多分、これでしょう。