GCCについて part8
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/10/13(土) 00:07:39GNU本家のGCCページ
http://gcc.gnu.org/
Binutils - Collection of binary utilities ←これも必要だぞ。
http://www.gnu.org/directory/GNU/binutils.html
GNU Binutils
http://sources.redhat.com/binutils/
GCC online documentation
http://gcc.gnu.org/onlinedocs/
Installing GCC
http://gcc.gnu.org/install/
GCC Timeline
http://gcc.gnu.org/releases.html#timeline
Calendar
http://gcc.gnu.org/develop.html#timeline
前スレ
GCCについて part7
http://pc11.2ch.net/test/read.cgi/tech/1145357824/l50
0655デフォルトの名無しさん
2008/12/21(日) 16:01:170656デフォルトの名無しさん
2008/12/21(日) 16:08:562. cc1内部は-fdump-rtl-allで出力ファイルのタイムスタンプを見る
0657デフォルトの名無しさん
2008/12/21(日) 16:32:33あざっす。いまからいろいろ調べてみます。
0658デフォルトの名無しさん
2008/12/21(日) 17:10:270659デフォルトの名無しさん
2008/12/21(日) 17:21:19テンプレートをガンガン使ってるなら、まぁ遅くなっても納得するんですが・・・
コンパイルしているプログラムが、
ASSERT_TRUE( .xxxx )
ASSERT_TRUE( yyyy )
みたいなものが延々と続いているだけのプログラムなので不可解なのです
0660デフォルトの名無しさん
2008/12/21(日) 18:25:36time コマンドで実行時間を測定しました。
-c 81.34s user 12.30s system 97% cpu 1:35.78 total
-S 82.63s user 11.62s system 99% cpu 1:34.66 total
-E 0.36s user 0.17s system 99% cpu 0.533 total
それぞれ一回しかやってないのでちょっと揺れがありますが…
つまり-Eは一瞬で、asに時間がかかっているという解釈で正しいんでしょうか?
ひょっとしてプリプロセッサによってファイルが膨れ上がっているのかとも思いましたが、
他のファイルでも-E 後の行数はほぼ同じだったので、単純に行数が原因ではないようです。
(すべて 50k〜60k行の範囲内)
次に-fdump-rtl-allを付けてコンパイルしようとしましたが…
ディスク領域不足でコンパイル中断しましたとか出る上に30分経ってもまだ終わらない…
0661デフォルトの名無しさん
2008/12/21(日) 18:30:50どこを減らせばどのくらい時間が変わるか見てみたら?
0662デフォルトの名無しさん
2008/12/21(日) 18:35:33どう見てもcc1だろ時間かかってるのは。
-Q ってオプションがあるので試してみ。
0663デフォルトの名無しさん
2008/12/21(日) 19:00:410664デフォルトの名無しさん
2008/12/21(日) 19:51:110665デフォルトの名無しさん
2008/12/21(日) 20:20:12でかいファイルでインタープロシージャルな最適化まで
やったら結構重くなるだろ。
0666デフォルトの名無しさん
2008/12/21(日) 20:34:10これは誤差範囲だと思います。一回しか測定してないので
>>662
-Q を試してみます。
#if 0 したりしていろいろ測定してみました。どうも、ASSERT_XXXXの個数と
だいたい相関があるようなので、1つ1つのコンパイルが遅いような気配です。
マクロの中身を減らせないかどうか検討中です。
0667デフォルトの名無しさん
2008/12/21(日) 20:35:400668デフォルトの名無しさん
2008/12/21(日) 20:37:50プリプロセス後のコードは50k行程度です。
一般的に見て多いのか少ないのかよくわからないですが、
他の、数秒でコンパイルが終わるような同列のソースファイルも
行数はさほど変わらないので、行数そのものは関係ない気がしています
>>665
autoconfまかせだったので、-O2の最適化がかかってました。
テストコードだし、-O0にしてみます
0669デフォルトの名無しさん
2008/12/21(日) 20:40:14ヘッダファイルの部分を除いた行はどのくらい?
あと、マクロは常に1行に展開されるので、
単に行数だけ見るより、バイト数見た方がいいかもしんない。
0670デフォルトの名無しさん
2008/12/21(日) 21:24:47システムタイム大きすぎ!ほとんどI/Oだろ。
-vでcc1の引数見て、テンポリファイルの中見てみ。
超巨大になっているに違いない。
もしかしてtemplate引数に正定数の荒しで特殊化爆発?
0671デフォルトの名無しさん
2008/12/22(月) 00:29:25I/Oで時間喰ってるんじゃない?コンパイル中にメモリとスワップがどうなってるか見てもいいかも。
今時のマシンでcc1plusに80秒以上とか・・・。gccのinsn-*.cのコンパイルはそのくらいかかってたけど。
0672デフォルトの名無しさん
2008/12/22(月) 08:34:32struct foo;
struct foo { ... };
と構造体の前方宣言があると、先に見つけた定義を見てしまって構造体の中身を
print でダンプできず <incomplete type> になってしまうのだけど、結局
これって解決不能なの?
毎回同じ構造の別名構造体をダミーで仕込んで、変数ごとにキャストして
アクセスとかって超面倒なんだけど。
0673670
2008/12/22(月) 09:53:030674デフォルトの名無しさん
2008/12/22(月) 15:45:05反応遅れましたが、前にも書いているとおりテンプレート一切使ってないんです。
(boost::scoped_ptrは使ってますが、それはほかの異常ない部分でも一緒なので)
特定のどこかが遅いということではなく、調子のってマクロを使いすぎて
ソースの量が爆発しているような気配です。
地道にマクロを削って最適化を抑止して頑張ってます。
0675デフォルトの名無しさん
2008/12/22(月) 23:50:26ちょっと簡単な例でやってみたら別に問題ない。 具体的なサンプルコードよろ。
0676デフォルトの名無しさん
2008/12/23(火) 00:02:54ファイルのはじめの方に書きなと書いてあって笑った記憶があるが…
0677デフォルトの名無しさん
2008/12/23(火) 00:10:56具体的なコードはちょっと出すの難しい。Linuxの動作を
gdb -c /proc/kcoreで追いかけてたら途中で<incomplete type>になる構造体が
出てきたという経緯で、自分のコードじゃないから。
- http://stackoverflow.com/questions/232744/how-to-print-incomplete-type-variable-in-gdb
- http://sourceware.org/ml/gdb/1998/msg00116.html
あたりがソースかな。gdb struct incomplete type でググると同様の話がゾロゾロ出てくる。
0678デフォルトの名無しさん
2008/12/23(火) 01:16:19- http://sourceware.org/ml/gdb/1998/msg00116.html
1998年? お前バカか? そんな古い断片の情報で>>672みたいな結論出すなよ。
その状況は今のgcc/ldでは起こらない問題。 >>675というのはカーネルモジュールとか
特殊なリンク環境で起こるんじゃないか? あと、
- http://stackoverflow.com/questions/232744/how-to-print-incomplete-type-variable-in-gdb
は前方参照のことは何も書いてないぞ。 本当に>>677で見たコードには前方参照があったのか?
単にopaqueな参照だったんでは?
0679デフォルトの名無しさん
2008/12/23(火) 11:23:39古い記事を出してしまったのはすまない。
最近(2006年あたり)でも類似の話があるので出してしまったのだけど、
ちょっと込み入った話なので質問撤回します。お騒がせしてすみません。
0680デフォルトの名無しさん
2009/01/18(日) 15:18:11"-ansi"オプションを指定しても、なぜかC99の機能が使えて困っています。
具体的には、配列の動的確保がなぜかできます。(↓のような機能)
int i = 10;
int array[i];
他のC99の機能(新しいコメント分の書式やfor文での変数初期化)は無効になっていますので
これはバグなんでしょうか?
ちなみにgccのバージョンは、「gcc (GCC) 3.4.5 (mingw-vista special r3)」です。
0681デフォルトの名無しさん
2009/01/18(日) 15:34:24-std=c89
0682デフォルトの名無しさん
2009/01/18(日) 16:04:32むしろこっちの方がバグなんじゃ
0683デフォルトの名無しさん
2009/01/18(日) 16:07:37C89+GCC拡張なんじゃね
0684デフォルトの名無しさん
2009/01/18(日) 16:11:42やはり -pedantic-errors -Wall をつけないとダメなのか。
0685デフォルトの名無しさん
2009/01/18(日) 16:19:34できました!!ありがとうございます!
0686デフォルトの名無しさん
2009/01/18(日) 16:27:040687デフォルトの名無しさん
2009/01/18(日) 16:33:500688680
2009/01/18(日) 16:38:49できたと思ったのですが、またもや可能になってしまいました。
どうやらMinGWではなく、Eclipseのプラグインにバグがある気がします。
お騒がせいたしました。
0689デフォルトの名無しさん
2009/01/18(日) 16:40:100690デフォルトの名無しさん
2009/01/18(日) 16:46:42-std=c89 -pedantic-errors -Wall
0692デフォルトの名無しさん
2009/01/18(日) 17:02:140693デフォルトの名無しさん
2009/01/18(日) 17:21:140694デフォルトの名無しさん
2009/01/25(日) 11:07:080695デフォルトの名無しさん
2009/02/01(日) 04:57:11間違えて、prefix=/usrにしてしまっていたのですが、
一度、アンインストールしたいのですが、
どうすればいいでしょうか?
0696デフォルトの名無しさん
2009/02/01(日) 05:52:470697デフォルトの名無しさん
2009/02/01(日) 17:56:31GCCにあったかどうか記憶してないけど
make uninstall
が効くかもしれない
0698デフォルトの名無しさん
2009/02/01(日) 18:29:08もう一回make installして、何をinstallしたかファイルに保存
↓
手作業
cppに依存しているものも結構あるから、
普及する前にrebootしない方がいい。
0699デフォルトの名無しさん
2009/02/01(日) 20:48:450700デフォルトの名無しさん
2009/02/01(日) 21:13:35まあ結局、目でチェックする必要あるから。
0701デフォルトの名無しさん
2009/02/01(日) 22:26:381) インストールされたファイル/ディレクトリの一覧を作る。
2) 標準のパッケージでインストールされるファイル/ディレクトリの一覧を作る。
3) 標準のパッケージを再インストール。
4) (1)に有って(2)に無いファイル/ディレクトリを消す。
これくらいやる必要あるんじゃない?
0702デフォルトの名無しさん
2009/02/01(日) 23:04:32C++もインストールした場合のlibstdc++くらいじゃないかな。
システムのクリティカルなところに使われてる可能性あるのは。
ld, libcは入ってないし、crt関係はsoじゃないし。
0703デフォルトの名無しさん
2009/02/06(金) 07:01:03ちなみにGCCのmake uninstallは効かない。それとprefix=/usrだったらまずディストリ標準の/usr/bin/gcc同じくg++,c++や
cppやgcjなどが完全に上書きされてる。フォートランは違う名前かもしれん。
一番問題は多分/usr/libのlibstdc++が上書きされてる点かな。下手するとgcc4.3入れたその前後にmakeしたアプリなどが
動かなくなるかも。てか運が悪いと既にそこへ入れた時点でlibstdc++の関連で動かなくなるアプリとか出るときあるお。
結果から言うと自分で手作業で探して削除した後、再度デフォルトで入ってたgcc系とlibstdc++のパッケージを再インスコ。
ぶっちゃけ手作業で削除しなくても多分gcc系とlibstdc++の再インスコで上書きされるから平気だと思うよ。
ただしgcc系ってのはgcc,c++,cpp,gcj,fortlanあとなんかあったような気がするけど忘れたw まあその辺全部再インスコね。
そうすれば手作業で消さなくても問題無い位復旧できるはず。
まあ違うバージョンのgccは/optとかにインスコしといた方が無難。/optにおいてもldがちゃんと機能してればlib関連は
/opt/gcc***/libを見に行くはずだから。
0704デフォルトの名無しさん
2009/02/06(金) 07:52:500705デフォルトの名無しさん
2009/02/06(金) 14:10:12パッケージからgcc関連入れ直して/usr/include/c++/4.3.3、
/usr/lib/gcc/$target/4.3.3、/usr/libexec/gcc/$target/4.3.3を消せば大丈夫。
0706デフォルトの名無しさん
2009/02/07(土) 05:26:51325>>理由教えて。
0707デフォルトの名無しさん
2009/02/07(土) 08:58:49向こう見に行くの面倒だから、聞きたいポイントを整理して書け。
0708デフォルトの名無しさん
2009/02/07(土) 12:22:48double func(double a, double b){double c; return (a+b);}
でreturn (a+b);
とc=a+b;return c;の違いは何?
0709デフォルトの名無しさん
2009/02/07(土) 13:12:02浮動小数点な数値のプロセッサ内での保持方法の差だっけ。
どっかのブログでSunの科学計算の手引きみたいなページが紹介されてた。
0710デフォルトの名無しさん
2009/02/07(土) 13:30:28> gcc
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8828.c
を、これで修正したら動いた理由が知りたいのですが。
http://pc11.2ch.net/test/read.cgi/tech/1232029287/350
0711デフォルトの名無しさん
2009/02/07(土) 14:17:01gcc version 3.4.4 (gcc Win/on Win2000)
では、戻り値がdoubleの関数は、return 文の所で
演算していはいけない。必ずglobalかlocalの変数に結果を入れてから、
return 変数名;
としないと、いけないようだ。
0712デフォルトの名無しさん
2009/02/07(土) 15:03:28無問題。
0713デフォルトの名無しさん
2009/02/07(土) 15:13:020714712
2009/02/07(土) 15:14:010715713
2009/02/07(土) 15:29:08exeか、逆アセンブル結果でも、掲示板に張って送ります?
-O3 無し
=7>=====
00401050 push ebp
00401051 mov ebp, esp
00401053 fld qword ptr [ebp+10h]
00401056 fadd qword ptr [ebp+18h]
00401059 fadd qword ptr [ebp+20h]
0040105C pop ebp
0040105D ret
0716712
2009/02/07(土) 15:53:53--8228.s:total()
_total:
pushl %ebp
movl %esp, %ebp
fldl 16(%ebp)
faddl 24(%ebp)
faddl 32(%ebp)
popl %ebp
ret
--
確かに-O3つけたらインライン展開されるから関数自体見えなくはなるけど。
0717713
2009/02/07(土) 16:01:34fadd の次はpopなので、結果の値が消えるのでは。
0718デフォルトの名無しさん
2009/02/07(土) 16:03:100719デフォルトの名無しさん
2009/02/07(土) 16:04:29・pop ebpは何をどこに戻すか
・doubleの戻り値はどこに格納されるか
少し勉強してこい。
0720713
2009/02/07(土) 16:28:54それで、問題はfunction側に有るのでは無くて、call側です。
戻ってきた直後で、ストアじゃなくてロードすると、以前の内容が
レジスタから消えます。
-O3 無し
00401400 call 00401050h
00401405 fld qword ptr [ebp-10h]
0721デフォルトの名無しさん
2009/02/07(土) 16:35:220722デフォルトの名無しさん
2009/02/07(土) 16:59:47数多の天才が気付かずに使っているコンパイラのバグを、浅学無能非才のあんたに見つけられるというのか?
思慮が足りないにも程があるぞ。
0723デフォルトの名無しさん
2009/02/07(土) 17:07:29http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8840.zip
cygwin1.dll version 1005.25.0.0 (0.156 2008-06-12 19:34)
0724デフォルトの名無しさん
2009/02/07(土) 17:18:270725723
2009/02/07(土) 17:23:24http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8841.zip
0726デフォルトの名無しさん
2009/02/07(土) 17:47:35デバッグだったら一人で勝手にやってろよ。
勿論、その場合はスレ違いだ。
0727デフォルトの名無しさん
2009/02/07(土) 17:51:490728デフォルトの名無しさん
2009/02/07(土) 17:53:05質問の意図は? >723の言っていることなら只の世迷言だから無視しておけ。
0729デフォルトの名無しさん
2009/02/07(土) 17:57:190730711
2009/02/07(土) 19:05:310731デフォルトの名無しさん
2009/02/07(土) 19:47:180732711
2009/02/07(土) 19:57:07354 :325 :2009/02/07(土) 04:54:11
>>326
double a;
do{
while((a=total(st[pl])) > x) pl++;
while((a=total(st[pr])) < x) pr--;
355 :325 :2009/02/07(土) 05:01:10
>>326
double a;
do{
pc = (pl + pr) / 2;
if((a=total(st[pc])) == key)
return pc;
else if((a=total(st[pc])) > key)
0733デフォルトの名無しさん
2009/02/07(土) 19:58:54http://0xcc.net/blog/archives/000164.html
これかな…?
0734デフォルトの名無しさん
2009/02/07(土) 20:08:490735デフォルトの名無しさん
2009/02/07(土) 20:40:060736デフォルトの名無しさん
2009/02/07(土) 21:19:060737デフォルトの名無しさん
2009/02/07(土) 21:47:30いいえ、FPUレジスタ渡しです。
0738デフォルトの名無しさん
2009/02/07(土) 21:50:460739デフォルトの名無しさん
2009/02/07(土) 22:30:25スタック上に利用するようになっている。だからfldを繰り返したら複数のレジスタに順に格納されるわけ。
0740713
2009/02/07(土) 22:36:24double total(){return (st.ascore + st.bscore + st.cscore);}
=7>=====
00401050 push ebp
00401051 mov ebp, esp
00401053 fld qword ptr [ebp+10h]
00401056 fadd qword ptr [ebp+18h]
00401059 fadd qword ptr [ebp+20h] ;;結果はFPUスタックに置く(80bit値)
0040105C pop ebp
0040105D ret
if(st[pc].number == key)
00401153 call 00401050h
00401158 fld qword ptr [ebp+10h] ;;keyメモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
0040115B fxch st(1)
0040115D fucompp ;;数値比較(80bit値 : 64bit値)
double a;
if((a=st[pc].number) == key)
00401153 call 00401050h
00401158 fstp qword ptr [ebp-18h] ;;メモリ内容をFPUスタックから出す(sp=sp-1)(64bit値)
0040115B fld qword ptr [ebp-18h] ;;メモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
0040115E fld qword ptr [ebp+10h] ;;keyメモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
00401161 fxch st(1)
00401163 fucompp ;;数値比較(64bit値 : 64bit値)
0741デフォルトの名無しさん
2009/02/07(土) 23:22:43と
double a = (st.ascore + st.bscore + st.cscore);
return a;
では、吐く汗のコードに違いがあるのですが、何が違うのでしょうか?
0742デフォルトの名無しさん
2009/02/07(土) 23:30:28結果の戻り値の数値が80bit表現
double a = (st.ascore + st.bscore + st.cscore);
return a;
結果の戻り値の数値が64bit表現
0743デフォルトの名無しさん
2009/02/07(土) 23:34:100744デフォルトの名無しさん
2009/02/08(日) 00:03:320745706
2009/02/08(日) 02:51:15ソフト板 http://pc11.2ch.net/software/
0746デフォルトの名無しさん
2009/02/08(日) 04:22:490747デフォルトの名無しさん
2009/02/14(土) 06:48:19オプションってありますか?
0748デフォルトの名無しさん
2009/02/14(土) 07:44:240749デフォルトの名無しさん
2009/02/14(土) 08:43:07ありがとうございます
0750デフォルトの名無しさん
2009/03/05(木) 23:15:00とするとAT&T Syntaxで*.sができますが、Intel Syntaxで出すことはできますか?
0751デフォルトの名無しさん
2009/03/06(金) 02:40:48間違った命令を吐いてしまうという噂を聞いたことがある。
最近の状況はわからん。
0752デフォルトの名無しさん
2009/03/06(金) 11:18:140754デフォルトの名無しさん
2009/03/07(土) 00:03:18欲しい方のシンタックスでダンプさせるのはどう?
■ このスレッドは過去ログ倉庫に格納されています