GCCについて part3

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
単発質問から始まったGCC(GNU Compiler Collection)について語るスレ。
あまり勢いはないが地味に逝こう。

GNU本家のGCCページ
http://gcc.gnu.org/

前スレ
・GCCについて part2
http://pc2.2ch.net/test/read.cgi/tech/1046179115/
・GCCについて(過去ログ倉庫)
http://pc2.2ch.net/tech/kako/1007/10077/1007731543.html

関連スレ
・cygwin + mingwn + gcc 相談室
http://pc2.2ch.net/test/read.cgi/tech/1058134693/
・gcjって使ってる人います?
http://pc2.2ch.net/test/read.cgi/tech/1046627795/
2デフォルトの名無しさん:03/12/27 09:24
2ゲット
乙かれー >>1
4デフォルトの名無しさん:03/12/27 11:39
m9( `Д´)
5982:03/12/27 15:22
5ゲット
6nokai:03/12/27 15:26
http://www.nokai.ne.jp/
君たちのような頭の悪すぎる人たちはここへ来なさい
他スレの話で知ったんだけど、
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12435
これって、「バグ」ですよね?

だってせっかく型にアラインメント指定したのに、
配列に入れたらインスタンスのアライメントが保証されないとか困るっしょ。
その型のポインタ受け取る関数に配列の要素渡してあぼーんとか泣くっしょ。
>>7
先頭要素だけアラインメント指定を遵守して、ポインタ演算はアラインメント指定を
無視してくれてる模様。
9ヽ(´ー`)ノ:03/12/28 20:13
>>1
前スレの 998-1000 わろた。
GCCステータス・アップデート
ttp://japan.linux.com/desktop/03/12/29/1419225.shtml

3.4以降から採用の新しいC++パーサとPCHの話題が載ってる。
11デフォルトの名無しさん:04/01/02 11:04
今年はプリコンパイラが導入されますように。
海外掲示板用オフラインリーダーを作るスレ
http://pc2.2ch.net/test/read.cgi/tech/1072883528/

海外でよく使われていうる掲示板スクリプト
専用のオフラインリーダー作って下さい。

必要な条件はID、PASSを管理できること、
OpenJaneみたいな三面型の見た目。
簡単にローカライズできるように言語ファイルを採用
ここを紹介されて来ました。マルチポストですみません。
gcc-3.3.1なのですが、ソースをコンパイルするとき-I./includeを付けると、
ソース中でインクルードしているpthread.hの内部で未定義エラーが
でます。実際に-I./includeが必要であってもなくても、付けるだけでエラーが
出ます。もちろん、付けなければコンパイルは通ります。

エラーの原因はデフォルトの検索パスが無視されているため起こるようなの
ですが、これを回避する方法はないでしょうか。
#問題の簡略化のため、このディレクトリは使用しないでいますが、本当は
#必要なヘッダファイルがあるので使いたいのです。

$ gcc test.c -I./include -c
In file included from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/include/pthread.h:664,
from test.c:6:
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/include/bits/sigthread.h:41: error: 構文解析エラー before '*' token
14デフォルトの名無しさん:04/01/04 21:12
たのむよ、まだこっちを使えよ。新しくスレたてんなよ!!
http://pc2.2ch.net/test/read.cgi/tech/1071613279/
>>13
includeのディレクトリがbinの中にあるの?
>>13
> エラーの原因はデフォルトの検索パスが無視されているため
../include にシステム標準のヘッダファイルと重複する名前のファイルが
置いてないか? あるいはファイル名は違っても、インクルードガードが
一致しているとか。
1713:04/01/04 22:13
>>13 まさかね。gccは自分でソースからインスコしたものです。
ちなみに、TL8WSなので、元からあるgcc-2.96でも同じ現象が出ます。
>>16 レスサンクス。重複するファイルはありません。
ただ気付いたことといえば、crypt()なんかを使う場合、__USE_XOPENとか
unistd.hをインクルードする直前にdefineしなければ、undefされてしまう
ような、面倒くさい事象があるのには気付きました。(-Wallとか-Wシリーズ
のオプションを幾つも付けた場合に警告されるので分かる)

元々はこっちにポストしてました。
http://pc2.2ch.net/test/read.cgi/tech/1072212403/658-659
>>17
とりあえず gcc -v して結果貼り付け。
1913:04/01/04 22:28
>>17 リンク先見てもらえればそのまま張ってあります。659のほうをドゾー。
>>19
ちゃうちゃう。

% gcc test.c -I./include -c -v

ここまでつけて。そうすると include パスとかずらずら出てくるはずだから。
2113:04/01/04 22:46
>>20 レスありがとうございます。
あー失礼しました。テストしたいのですが出先からのアクセスですので
レスは長く後になります。(TT

ヒントをありがとうございます。チェックしてみます。
で、どうなったんだろう・・・・
レス先間違えまくっているあたり注意力に問題がありそうだけど。
>>7
struct {
  char c;
  achar a;
} b;

 printf("sizeof(achar):%u\n",sizeof(achar));
 printf("&b: %p\n", &b);
 printf("&b.a: %p\n", &b.a);

__aligned__は指定された型/変数が割り付けられるときに、
その先頭のalignmentを指定するだけ。
achar自体はあくまでもchar。
じゃなきゃ通常のchar*を受け取る関数が全く使えなくなる。
247:04/01/07 21:48
>>23
現状での挙動は分かってます。

でも、現状の挙動では>>7で書いたような問題が防げません。
aligned指定でsizeofも変わりうる挙動をしていれば、>>7の問題も、解決しますし、
配列の先頭だけにalignmentを指定したければ、配列に対して指定すればよい話です。

ですが、alignedの挙動を変更すると、char*にachar*を渡しているような
現状動いているコードが壊れてしまいます。

sizeofも変わりうるaligned指定を別名で作り、
sizeofが変わってしまった場合はポインタが互換しないようにする、
というのは、どうでしょうか?

ちなみに、bugzilla の id=12435 は Andrew Pinski によって 12/28 に
「バグじゃない」ってことで終了されてしまっています。
>>24
> aligned指定でsizeofも変わりうる挙動をしていれば、>>7の問題も、解決しますし、
> 配列の先頭だけにalignmentを指定したければ、配列に対して指定すればよい話です。
本当に、それで他の部分に影響でないの?

個人的には配列にたたき込みたいなら構造体にして、padding 自分で詰めれば良いと思うが。
267:04/01/07 23:10
>>25
> 本当に、それで他の部分に影響でないの?

「それ」とは、
「aligned指定でsizeofも変わりうる挙動」をすることですか?
「配列の先頭だけにalignmentを指定したければ、配列に対して指定」することですか?

> 個人的には配列にたたき込みたいなら構造体にして、padding 自分で詰めれば良いと思うが。

アラインメントを指定したいときに、aligned属性があるのなら、
それを使って行うのが自然だと思います。
正しくpaddingを詰めるためには、必要な情報もどうにかしてひねり出さないといけないですし、
構造体にしてしまって、意味薄いフィールド名を考えるのも使うのも面倒です。
27デフォルトの名無しさん:04/01/07 23:17
GCCが卵に見えるからだろうね
ちょっと考えても問題出るな。
>>26
> 「それ」とは、
どっちでも良いけど。

アライメントの問題を解決したが、他の部分で既存のコードが動かなくなるような致命的な
問題が出たら意味ないわけで。現状の gcc の設計と矛盾しないなら、パッチ作って送れば
対応してくれると思うぞ。
30ヽ(´ー`)ノ:04/01/08 05:31
というか id=12435 は俺はバグじゃないと思う。>>24 の解決策の方が相当不味いと思われ。
納得できないのなら ML や Pinski 氏に質問してみたら?それか >>29 が言うように
パッチ書いてみるかだな。
317:04/01/08 08:58
>>30
今あるalignedの挙動を変えてしまうと不味いのはわかったのですが、
アライメント指定に伴ってsizeofも変わること自体が「相当不味い」のでしょうか?

挙動が変わるので、新しい別の属性キーワードを作る必要があるとおもいます。
そしてその属性をつけた型および値を指すポインタは
オリジナルの型と互換しない(int*とchar*の関係になる)ようにする必要がありそうです。

この方針で問題なければ、パッチを書いてみよう
・・・かなぁ、と思います。
ほかにも不味いところが残っていれば指摘して欲しいです。
>>31
まずすぎるというか、
それじゃ結局別の型を作るだけだろ?
>>25のいうようにalignof使って構造体作れ。
どうしてもバグにしたい人がいるようだ
347:04/01/08 21:50
>>32
> それじゃ結局別の型を作るだけだろ?
そうです。いま欲しがってる属性を xxx_aligned とすると、
 typedef int more_aligned_int __attribute__ ((xxx_aligned (8)));
この宣言でmore_aligned_int型の値はすべて8バイト境界に割り当てられます。
 void f( more_aligned_int* p );
この宣言で、f()は8バイトアラインが保証されている整数型へのポインタを受け取ります。
無理なキャストをはさまない限り、
この関数に不正なアライメントの値を渡すコードはコンパイルできなくなります。

現状のalignedの挙動では、上記のような宣言をしても、
f()の定義側で引数pが正しくアラインされていることを期待できません。

今回の件を知らなければ、こんな関数を作って不可解なバグに悩まされていたかもしれません。

ドキュメントに"force the compiler to insure (as far as it can) that ..."とあったので、
やっぱりバグではなく、こういう仕様のようです。
パッチ書くより、「この"as far as it can"をもっと具体的に書いとけ」と突っ込むのが良いように思います。
(´-`).。oO(いったい何がしたいんだろう?)
>>34
typedef は型に「別名」をつけるだけで、型を作成するものじゃないが。typedef したものが
別の型ってことになると、C/C++ の従来の typedef と意味が違ってしまうから、影響でか
すぎだと思うぞ。

矛盾しない形で gcc のソースコード改修できるのなら、パッチを作る事は止めないが。
別の型には変わりないが、完全に互換性がある。
>>36
typedef int const cint;
typedef int volatile vint;
typedef int iarray[2];
こんなのと同じ感じじゃないの?
39デフォルトの名無しさん:04/01/09 01:15
more_aligned_int* p

p++はどんなうごきすんねん
407:04/01/09 01:21
>>39
(more_aligned_int*)((char*)p + sizeof(more_aligned_int))
得られたポインタはmore_aligned_intのアラインメント要求を満たす。
sizeof(more_aligned_int)は、sizeof(int)以上で最小の8の倍数になる。

more_aligned_int*からint*への変換はエラーにしないといけない。
41デフォルトの名無しさん:04/01/09 01:30
うざってー
構造体&paddingでなぜ不満? 却下である!
本7うざい死ね
>>34
> パッチ書くより、「この"as far as it can"をもっと具体的に書いとけ」と突っ込むのが良いように思います。
だったら今すぐそうすればいいだろが、誰も止めないぞ。
オープンソースである以上、必要だと思った人間が手を動かす。
今までもこれからもそうやって成り立っていくんだよ。
文句は言わないけど自分は手を動かさないってんじゃ話にならんわ。
独り言なら日記にでも書きたまえ。
パッチ書いてもいいけど、ばらまかないでね。
迷惑だから。
>>34
> 今回の件を知らなければ、こんな関数を作って不可解なバグに悩まされていたかもしれません。

それはGCCのせいじゃなくて、そんなおかしな設計したお前に責任がある。
s/した/する/
align関連はGCCの独自仕様なのだから、君が思った仕様と食い違っていても、
その仕様はくつがえらないし、もちろんバグではない。
問題視して欲しければ、GCCの仕様のままで通常使用したときに、致命的な
問題が発生することを示すか、他の仕様と論理的不整合が存在することを
示す必要がある。
それができなければ、ローカルパッチを作って、思う存分使えばいい。
ttp://gcc.gnu.org/ml/gcc/2004-01/msg00504.html

GCCにPL/Iのフロントエンドをつけてる人が。

……今更使う人いるのかなぁ
ちょっと使ってみたかったりして<PL/I
大昔バイトで使って以来書く事もなかたので。
PL/1はいいぞー

Fortranもいい。 なんていうか、そそるものがあるんだよ
>>50
魅力が全然分からん。
小一時間愛を語ってはくれんかね?
名前指定ループ多段ブレイク
gotoとどう違うんですか?
>>51
使い手にナイスミドルのおじさまが多い。
>>53
goto みいにどこにでも飛べるわけじゃなく、ループから抜けると言う意図がはっきり伝わる。(=読みやすい)

C/C++ にも欲しいよ。
56デフォルトの名無しさん:04/01/10 22:33
ラベル名を工夫すればはっきりと伝わると思うが。
5755:04/01/10 23:05
まあ、goto 文使ったってわかりやすいプログラムは作ることができるからね。
でも、「ラベル名を工夫すれば」と言う労力がかかるし、それができない奴もたくさんいるから。

(今見たら、>>55 日本語変だな。goto みいに → goto みたいに)
> それができない奴もたくさんいるから。
L1,L2,・・・・,Lnとつけている俺のことか?
>>58
アセンブラかよ !!
>>55
そんなあなたにPerl

だいたい>>52程度でPL/Iへの愛を騙(ry
>>57
break でも、それなりの名前つけないとダメだろう。
>>55
ポインタ使えば?
>>60
名前指定ループ多段ブレイク があれば何でもいいわけじゃないぞ。

>>61
どんな名前でも、「ループを抜ける」と言う意図は伝わるぞ。
どんなループなのかわからんと言うのはまた別の話だし。

>>62
ハァ ?
具体的に書いてみてくれ。
>>63
邪悪な提案を1つ。

#define break_loop goto
65デフォルトの名無しさん:04/01/11 03:10
>>40

>more_aligned_int*からint*への変換はエラーにしないといけない。
C的には Warning で。

一時変数(ただの配列だけど)に aligned アトリビュート効かなくて
面倒な思いをした事は何度かあるけど、

>(more_aligned_int*)((char*)p + sizeof(more_aligned_int))
>得られたポインタはmore_aligned_intのアラインメント要求を満たす。
>sizeof(more_aligned_int)は、sizeof(int)以上で最小の8の倍数になる。

それなら当然一時変数も対応?ちょっとしたパッチじゃ済まんよ。
挙動がわるいぞ?





今日どうしたんだろう…
>>64
行き先ラベルの定義はどうやるんだ ?

C/C++ のマクロはここら辺が作りにくい。

昔さわった汎用機の PL/I のマクロは、substr() なんかの文字列操作は当たり前、FOR, WHILE 等の制御構文に加えて手続き/関数定義までできた。
ほとんどフルセットのインタープリタだったよ。
(使い出すと面白くて病みつきになるけど、はっきり言って や ・ り ・ す ・ ぎ。)
C/C++のcppが貧弱すぎるという方が正しい物の見方だと思うぞ。
C++はtemplateやらinlineやらというマクロ構文のおかげでわりとましになったが、
もともとの育ちの悪さからくる使い勝手の悪さはついて回る。
cppとtemplateとかが連携していないから、デバッグ版のnew/deleteを作ろうと
すると行番号などを渡すのが難しかったりとかするし。

まあそこまでは望まないにしても、どうしてm4くらいにしなかったのかねえ。
条件分岐とか任意個の引数それぞれについて展開文を生成するくらいはやって欲しいと
時々思う。
>>68
> まあそこまでは望まないにしても、どうしてm4くらいにしなかったのかねえ。
そりゃあ UNIX V6 書いた時代に m4 なかったからだよ。
ああ、そりゃそうだな。確かに。
http://www.tldp.org/HOWTO/GCC-Frontend-HOWTO

web crawl していて発見。
gcc のフロントエンド書いてる人なんているのかしらん。
>>71
Wide Stadio
gccソース配布にはTreelangというフロントエンド実装例示用言語のレクサとパーザとあれこれが付属.
GNU VHDLがGCCのフロントエンドとして書かれていたと思った.フランスの教育機関の中の人.
74デフォルトの名無しさん:04/01/12 23:48
gccのソースをチェックアウトしようと思って、cygwin bash shell から
 $ cvs -d :ext:[email protected]:/cvsroot/gcc co -P gcc
ってしてみたんですが、
 > savannah.gnu.org:接続がタイムアウトしました
 rsh.exe: can't establish connection
 cvs [checkout aborted]: end of file from server (consult above messages if any)
と表示されて取ってこれませんでした。
ここ2日ほど試してるんですけど、同じメッセージが出ます。
何が悪いんでしょうか?
>>75
ありがとうございます。
 $ CVS_RSH='ssh' cvs -d :ext:[email protected]:/cvsroot/gcc co -P gcc
これでいけました。
77デフォルトの名無しさん:04/01/13 22:18
-Wmissing-prototypes が、Cではちゃんと警告出すのに、C++だと動作しないみたいなんですが、
bugzillaに情報があるかどうか調べるにはどうしたらいいのでしょうか?
つーかそもそもC++だとprototypeないとダメだろ。
-Wmissing-prototypesは、グローバルな関数の定義に対して、
先にプロトタイプ宣言が無いことを警告するものです。
呼び出し側でエラーになるのとは別です。
gcc開発してる人達ってこれが本職なの?
RedHatやSuSEが金出して雇ってるのかな。
SuSEは買収されたYO
みんなRedHatのことを悪くいうけど、
GCCの開発者の多くはRedHatだよな。
ああいう会社は大事にしないといけない。
オプソ注はガキだから、独占商売してる!
とかうるさいけど。だったらお前がGCC作れ、と。
>>80
どっちも金出してる。
勤め人が片手間でこなせる作業量じゃないし。

>>82
Cygnusから流れただけやん。
金にならんからクビって事がないことを願おう。
流れたっつーか買収されたっつーか。
でもRedHat Linuxやってる連中と旧Cygnusの連中の間には溝がある
ような気がしないでもない。何年か前、リリース版じゃないgcc 2.96を
RHに載せて出荷しちまったとかでgccチームが抗議文出してたしな。
85デフォルトの名無しさん:04/01/24 19:23
gccint.texiをHTMLで読もうと思って、gccのソースディレクトリ(以下では GCC )から、
 $ makeinfo -Igcc/doc -Igcc/doc/include --html -ogcc/doc/HTML/internal gcc/doc/gccint.texi
としてみました。
でも以下のようなメッセージが表示されて、index.htmlが生成されません。
 GCC/gcc/doc/HTML/internal/index.html: TOC should be here, but it was not found
 GCC/gcc/doc/HTML/internal/index.html: TOC should be here, but it was not found
 makeinfo: Removing output file `GCC/gcc/doc/HTML/internal/index.html' due to errors; use --force to preserve.

texiのことは良く分からないですが、テキストエディタでgccint.texiのなかを覗いてみたところ、
メニューっぽいものは書いてあるようです。
index.htmlをきちんと(--force使わずに)生成するには、どうしたらいいんでしょうか?
>>85
gcc-3.3.2/gcc/docディレクトリに移動して、
$ makeinfo -Iinclude --html gccint.texi
だけで問題無くできたけど、ちなみに
makeinfo (GNU texinfo) 4.6です。
>>86
レスありがとうございます。
こちらの環境はcygwinで、makeinfoのバージョンは(GNU texinfo) 4.2でした。
バージョンの古さが原因の問題なのかもしれません。

で、望むものはgccのサイトに置いてあるのに気付いたので、
そちらを使わせてもらうことで解決しました。
age
C#のフロントエンドやMSILを出力するバックエンドを
作るような話はあるんでしょうか?3.5以降になるのかもしれませんが。
90デフォルトの名無しさん:04/02/12 16:14
makedepend が g++ に対応していなくて cstddef や cstdio が探せない
どうしたらいい?
g++ -M
9290:04/02/13 02:11
>>91
makefileのDO NOT DELETE This line以降を書き換えるようにできないでしょうか?
> makefileのDO NOT DELETE This line
なんですかそれは?
sed '/DO NOT DELETE This line/q' Makefile > Makefile.tmp
g++ -MM $(SRCS) >> Makefile.tmp
mv -f Makefile.tmp Makefile
95ヽ(´ー`)ノ:04/02/13 10:40
俺なら include するかなぁ。

Makefile.dep: $(SRCS)
g++ -MM $(SRCS) > Makefile.dep

# dependencies
.include Makefile.dep

構文これであってたっけ?(;´Д`)>
最近は専ら automake/autoconf だから自分で Makefile 書かなくなったな。
>>95
> Makefile.dep: $(SRCS)
> g++ -MM $(SRCS) > Makefile.dep
追記じゃなければ -MMF Makefile.dep でもいい。

> .include Makefile.dep
BSD make?
たしかBSD makeは.dependってのを自動的にincludeしてくれると聞いたような
気がするので、こうするとGNU makeとBSD makeでは共通にできる。

# Makefile
.depend: $(SRCS)
        g++ -MMF $@ $(SRCS)

# GNUmakefile
include Makefile
include .depend
97ヽ(´ー`)ノ:04/02/13 11:26
> 追記じゃなければ -MMF Makefile.dep でもいい。
10ヘー(・∀・)⊇


> BSD make?
あぁ、先頭に . がいるのは BSD make だったか。
間違えますた、スマソ。
ttp://make.paulandlesley.org/autodep.html
ここなんかどよ。(gcc -Mの項)
99 :04/02/20 07:02
gcc -laaa -lbbb main.o →リンク失敗
gcc -laaa main.o /usr/lib/libbbb.a →リンク成功

/usr/lib/ には libaaa.a も libbbb.a もあるし、
libaaa.a は正常にリンクされているのに。
なぜでしょうか?
100デフォルトの名無しさん:04/02/20 07:07
朝から釣りか。
エラーメッセージ見りゃ見当つくだろ。

gcc main.o -laaa -lbbb
いじょ
3.3.3は話題にもならない?
g++のtemplateもかなり良くできてきたし満腹状態。
g++拡張でtypedef templateが付いたら教えてねん。
g++のコンパイル速度って、こんなもん?
体感できるほどPCHで劇的に変わるんでしょうか。
>>105
3.4は普通に使えるから、自分で試してレポートよろしこ
FTP://ftp.iij.ad.jp/pub/gcc/snapshots/3.4-20040218/gcc-3.4-20040218.tar.bz2
107デフォルトの名無しさん:04/02/22 12:47
適当に age とこうか.

>>103
そもそもリリースのアナウンスって流れたっけ ?
ftp mirror に行きわたるのを待ってると言ったっきりのような.
108105:04/02/22 19:47
>>106
サンクス。g++自体のコンパイルに時間がかかりそうだけど、
おわったら試してレポートします。
>>107
> そもそもリリースのアナウンスって流れたっけ ?
まだだけど。でも ttp://gcc.gnu.org/releases.html では
とっくに出たことになってるんだよなぁ・・・。

ftp.gnu.org にないから気づかなかったけど、ミラーによってはもうあるぽ。

# 普通ミラーに行き渡るのに一週間もかからないよなぁ・・・。
110105:04/02/22 22:12
やってみました。cygwin上の
gcc version 3.4.0 20040218 (prerelease)
なg++です。比較の対象にしたのは、3.3.1です。

結果としては、コンパイルの速度はあまり変わらなかったけど、
吐かれたバイナリの実行速度が結構速くなってました。
ってこれじゃPCHと関係ないですよね。
俺がやり方間違えたかな…参考にならないレポートですんません。
PCHてなにもしなくても効果するん?
設定ファイルとか、オプションとか必要ないん?
今見たら ftp.gnu.org にも 3.3.3 置いてあったよ.

3.3.4のはなしもあるみたい。
>>110
最適化が上がったけどコンパイル時間が増えなかった。
と考えると効果あり?
PCHを使うにはオプションが必要だった気がしたけど
116デフォルトの名無しさん:04/02/23 16:29
>>96
サブディレクトリを$(SRCS)に含んでいるとうまくいかないのですが何か方法ありますか?

SRCS := ${SRCS} misc.cpp
SRCS := ${SRCS} foo.cpp
SRCS := ${SRCS} subdir/window.cpp

てな状態の時の出力が

misc.cpp: misc.h
foo.cpp: foo.h
window.cpp: subdir/window.h # subdir/window.cpp : subdir/window.h になって欲しいのに!!

のようになってしまうのでつ。
生成ルールのターゲットになるのは *.cppじゃなくて *.o だろ?

-oオプションで指定しない限り,コンパイルしたオブジェクトファイルは
カレントディレクトリに作られるので
window.o: subdir/window.cpp subdir.window.h
となって当然だと思う。

infoを見ると、-MT target というオプションをつけると変更できるようなので、
どうしてもというなら、${SRCS}についてループを回せばできるんじゃないかな。

118116:04/02/23 21:27
>>117
>生成ルールのターゲットになるのは *.cppじゃなくて *.o だろ?
いっけね、うっかりしてましたです。

>infoを見ると、-MT target というオプションをつけると変更できるようなので、
>どうしてもというなら、${SRCS}についてループを回せばできるんじゃないかな。

-MT はうまくいきましたです。ありがとうございます。
ループを回すっていうのは↓みたいな感じでしょうか?GNUのmake専用になっちゃうんすかね?
もう少し賢いやり方あったら教えてもらえると嬉しいです。

depend:
$(RM) Makefile.dep
$(foreach src, $(SRCS), g++ -MM -MT $(src:.cpp=.o) $(src) >> Makefile.dep;)
depend:
  for s in $(SRCS); do g++ -MM -MT `echo $$s | sed 's/\.cpp$$/.o/'` $$s; done > Makefile.dep
でいいんじゃないの? (非GNU make依存)
120デフォルトの名無しさん:04/02/25 06:15
3.3.3 あなうんすきたーage
tree-ssaのfrozeきてたー
gcc/ssa-*をさっそく調べないと。
122デフォルトの名無しさん:04/02/29 15:46
ソースからライブラリを指定したいのですが、
VCの
#pragma comment (lib, "***.lib")
に相当するものはGCCにあるのでしょうか?
>>115
試したのがしばらく前なので、状況変わってるかも知れんが。俺が試したとき
には、ヘッダファイルを事前にコンパイルしておく必要があった。

% gcc foo.h

これで #include "foo.h" しているファイルをコンパイルすると、勝手に
プリコンパイル済みヘッダが使われた。

あと VC の stdafx.h のように「よく使うヘッダファイルを全部 #include する
だけのヘッダ」を用意して、そいつをプリコンパイルしておくと良いみたい。
多数のヘッダを個別にプリコンパイルしても、あまり速くならなかったよ。
おれもPCH使ってみたけど、遅いのはインクルードファイル処理じゃ無いから全然
速くならなかった。
Cで巨大ファイルインクルードしてないと意味ないんじゃないか?
またはC++で巨大汎用テンプレートをインクルードするけどほとんど
インスタンス化しない場合とか。

致命的なのはmakeファイル作り替えないといけない点。
>>124
つまり boost::* 用ってことでFA?
>>121
英語は全っ然読んでないんだけど、
http://gcc.gnu.org/projects/tree-ssa/#ssa
から察するに「もう一段かませてもっと最適化」って事? 何が新しいの?
Static Single Assignment使ってるから、
部分冗長性の検出とか定数伝搬がより賢くなる可能性があるんでしょ。
言語に依存しないレベルで、かつ、RTLや生成コードよりもう少し抽象度の高いところで。
128デフォルトの名無しさん:04/02/29 17:40
>>122
俺も知りたい
便利なんだよな
setjmpの関数アドレス取得しようとして数十分はまった。

>XXXX.c:77: `setjmp' undeclared (first use in this function)
>XXXX.c:77: (Each undeclared identifier is reported only once
>XXXX.c:77: for each function it appears in.)

で、結局

setjmp.h
>#definesetjmp(x)_setjmp(x)

これが原因かよ
おいおい関数マクロたのむよ

mingwだけど。
>>129
#include <setjmp.h> 忘れただけだろ ?
131デフォルトの名無しさん:04/02/29 18:28
>>130
ちーがーうー
setjmpが関数マクロだったから、
setjmpの名前だけ書くと未定義エラーになるわけ。
関数マクロは後ろの括弧が必須なの。
mingwのinclude/setjmp.h見りゃわかる。
ただのマクロでいいものを関数マクロにする開発者もアホだが、setjmpのアドレスを得ようとする129もアホ。
133デフォルトの名無しさん:04/02/29 18:32
だからそれに気づいて
#ifdef __GNUC___
add_func(_setjmp);
add_func(_longjmp);
#else //その他
add_func(setjmp);
add_func(longjmp);
#endif
みたいにした。

んで、これには続きがあって、よく見たら対になるlongjmpは
関数マクロじゃない。
これに気づかずになんでだろーなんでだろーと
延々コンパイルを繰り返したさ。

#ifdef __GNUC___
add_func(_setjmp);
add_func(longjmp);
#else //その他
add_func(setjmp);
add_func(longjmp);
#endif
結局これが正解。

馬鹿野郎。
134132:04/02/29 18:33
つーかマクロって決まっているんじゃねーか
アホなのは129だけに決定
http://www.bohyoh.com/CandCPP/C/Library/setjmp.html
135デフォルトの名無しさん:04/02/29 18:33
>>132
スクリプト言語の実装で必要なんだよアホ
136デフォルトの名無しさん:04/02/29 18:34
>>134

はあ?どこに「マクロ」なんて書いてあるんだよアホ!
137デフォルトの名無しさん:04/02/29 18:35
あああ
>setjmpマクロ

アホはおれだけかよ!

悪かったな>>132
>>127
というと相当広範囲な最適化が望めるって事ですね。そりゃ、スバラシイ。
(でも処理系専門外な自分は多分その素晴らしさの一割も理解できてない…)
139デフォルトの名無しさん:04/02/29 18:36
つーかね、わざわざ関数マクロにしてトラップ作る必要ねーだろ
ざけんな!>mingw
140132:04/02/29 18:38
>>137
俺も勉強になった。
マクロと決まっているのはassertだけじゃなかったのか。
>>137
俺も知らなかった…K&RにもC99にもそう書いてあるわ。
あとマクロと決まってるのはva_*くらい?
std{in,out,err}が「マクロ」なのは、glibcのhackで有名、かな。
# Linuxな人は今すぐ grep stdin /usr/include/stdio.h
マクロか疑似関数じゃないとsetjmp()は実装しにくいでしょ。
ほとんど全てのregisterを保存しないといけないわけだから。
関数で実装するとstackのrewindして(から)保存しないといけないからね。

C99でもgetcなんかもマクロなんじゃないの?
143132:04/02/29 19:20
そうだ。va_argとかもマクロだ(^_^;)
va_argは型名を受けるから関数として実装するのは不可能だもんな。
>>142
そんなことないよ
mingwはmsvcrt.dll借用してるよ
なことないって言われても…
Windowsは1CPU, 1プラットフォームでしょ。
なんかトン沈下んな奴がいるな
145のことだが。
>>142
getc・putc共に、C99でも「マクロ『かも』しれない」です。
これはC89から変わってないですよね。
# C99持ってない方、C99相当のJISがPDFで手に入ります。
# ttp://www.jisc.go.jp/ →JIS検索→JIS X3010 でどうぞ。
>>142
別に関数で普通に実装できますがなにか ?
例えば、FreeBSD 4.8R/i386 + GCC 2.95 は関数で実装されてるよ。
>>148
手元のi386なglibc-2.2.4でも、cygwinで使ってるnewlib-1.12.0でも、
setjmp()は関数です。もちろんソースは「.S」。
# マクロじゃなきゃ規格非準拠だ! って怒られたら、
# glibcのstdinみたく「Make them happy.」にすればいいって事なんだろう
俺俺に聞け→勉強するぞ から流れてきました。ちょいと教えとくれ。
#include <stdio.h>
/* #define GLOBAL */
#ifdef GLOBAL
const int DragonKiller=15000,AngelRobe=3000,DragonShield=3500;
struct _item{ char *name; int price;
}ItemList[]={
{"ドラゴンキラー", DragonKiller},
{"天使のローブ", AngelRobe},
{"ドラゴンシールド",DragonShield},
};
#endif

int main(void)
{
#ifndef GLOBAL
const int DragonKiller=15000,AngelRobe=3000,DragonShield=3500;
struct _item{ char *name; int price;
}ItemList[]={
{"ドラゴンキラー", DragonKiller},
{"天使のローブ", AngelRobe},
{"ドラゴンシールド",DragonShield},
};
#endif

return 0;
}
GCC 3.3.1 で、GLOBAL無効だとOKなんだけど、
GLOBAL有効だとコンパイルエラーになるんだ。なんで?
const qualifierのついた変数は定数ではない。
ローカル変数とグローバル変数とでの違いが気になります
グローバル変数は定数でしか初期化できない。
ローカル変数は初期化時点で決まっている値ならOK。
つーかどこがGCC依存な話題なんだ??
それ、VCだと通ったりするんじゃない?
そんなケースが前あった。
156150:04/03/02 00:13
>154
例えば ボーランドのbcc32とかだとローカルだろうがグローバルだろーが
"不正な初期化"となるのです
>>156
ボーランドのはC99に準拠してなんでしょ。
http://gcc.gnu.org/onlinedocs/gcc-3.3.3/gcc/Initializers.html#Initializers
→してないんでしょ
159150:04/03/02 00:23
了解です。分かりました。
160105:04/03/02 21:48
すんません。PCHの話題の言いだしっぺです。
110で一度レポートしたのですが、冷静に色々やってみるとPCHが有効になっていなかったみたいです。

GCC(3.4.0 20040218 (prerelease))は/usr/local/以下にインストールしました。
自分がコンパイルを試したソースでは
#include <iostream>
#include <string>
...
などとなっていたので、/usr/local/include/c++/3.4.0の中で
g++ -x c++-header -c iostream
g++ -x c++-header -c string
...
とやって*.gchを作りました。その後でコンパイルをしたのですが、
g++ -H (...) 2>usedheaders
とやっても、usedheadersの中に*.gchが出てきません。infoが正しければ、「...!」と出てくるはずなんですが…。
何が足りないんでしょうか。
ここで聞いていいのか分からないんですけど……。

libfoo.so や libfoo.a があったとして、その中から特定のシンボルだけ
削除したい場合ってどうすればいいですか?ソースはありません。
>>161
やり方は知らないけど、なんでそんなことするの?
関係ないけど、binutilsにELFの形式をチェックするような
ツールってある?
>>161
.aはar使えばいいじゃん。ar知らずにどうやって.a作ったのさ。
.soは知らん。
>>163
objdump -xじゃ不満かい?
gcc3.3.3の標準ライブラリのソースを見たいのですが、
どのディレクトリにあるのでしょうか?
標準ライブラリって、Cの?
それは普通言語処理系じゃなくてOSが持つ。
169167:04/03/05 00:01
レスどうもです。
説明不足ですみません。
Cのprintf, scanfなどのANSI標準ライブラリ関数のソースのことです。
gccのソースコードから抜き出したいと考えてたのですが…
抜き出してどうすんのん? ライセンスあるよん。
glibcの中にあるの。
171167:04/03/05 00:18
なるほどglibcにあったのですね。
Cの勉強をしていて、あるライブラリ関数がどのように実装されているのか
興味があって、探し求めていたんです。
どうもありがとうございました。
gccが使う標準Cライブラリはglibc以外にもいろいろあるわけだが、
173デフォルトの名無しさん:04/03/12 14:00
コンパイルしたプログラムに
どのバージョンでコンパイルしたか埋め込める#define とか 関数ってあるの?

int main(){
printf("thist complile by%s",#GCC_COMPILE_VERSION);
}

という風にしたいんだけど
>>173
__GNUC__ と __GNUC_MINOR__ で何とかならないか。
大抵のコンパイラは自身を識別する定義済マクロを用意していて、
(メジャー)バージョン番号がその値になっていることが多い。

gccなら
__GNUC__ と __GNUC_MINOR__ (それぞれ整数)。
__VERSION__ もある (こちらは文字列)。
176173:04/03/12 15:27
>>174 >>175
ありがとう
__atribute__
>>176
gcc -vも覚えれ
gccの解説本で良いのありますか?
>>179
infoはだめか?
info以上の情報があるなら俺も知りたい。
うーん。
2chってこんなに低レベルだったの?

# って嘆いてみるテスト
特に若い人に、調べる能力の低いのが多いね。
2chにレベルもクソもないと思うが
コンピューティングが低年齢の人に解放されたってことで喜んでいいんじゃない?
といってもこんな所でクダ巻いてる奴なんて小学校の頃から触ってるか

低レベルすぎる質問は無料コンパイラとして初心者の入門用にと
宣伝されてるから仕方ないと思われ
低レベル云々の煽りは馬鹿の証し
>>181って逆切れ厨でしょ。文句あるなら自分で調べろよ。
187デフォルトの名無しさん:04/03/21 14:55
gccってどうやってインストールするんですか?
>>187
./configure --prefix=/usr/local
make bootstrap
make install

確かこんな感じ。インストール先ディレクトリは./configureに--prefixオプションで指定する。
configure && make all && make install
190187:04/03/21 15:18
すいません、初心者なんで何をどうすればいいかも
分からないんです。
参考になるページか何か知っていませんか?
自分でも調べたけどわかんなくて、、、、
もっと質問の仕方ってものがあるだろうし、
'初心者'は免罪符でもなんでもない
とりあえずOS環境を書けよ
まあ答えは出てるけどさ
おまいら釣りにひっかかってあげるやさしい奴
>>191
すいません。
今度から気をつけます。
>>192
ありがとうございます。
>>193
釣りではありません。
それでもOS環境をかかない頑固な194。
いきなり自動車免許を取ろうとせずに歩行者・三輪車・自転車……と
段階的にすすめてみてはどうだろう。

歩行者です
gccってどうやって使うんですか?
先行者です
キャノンってどうやって使うんですか?
あなたには使えません
お前ら面白すぎ
3.4branchが切られてメインラインがいつのまにか3.5になってまつね。
奇数バージョンは安定しないんだっけ?
major>minorのうちは危ないというが、
奇数・偶数の区別はない。
205デフォルトの名無しさん:04/03/22 19:30
>>204
じゃあ3.3以上ならいいの?
>>204
了解。

>>205
そういうジンクスがあるってだけで、
実際その通りってわけじゃないよ。
207デフォルトの名無しさん:04/03/22 20:50
printfの%pにint *等を渡すと警告が出る(要-ansi -pedantic)。
最初バグかと思った。void *じゃないと警告が出るのね。
さすがpedantic。マゾ向けですな。
>>207
>void *じゃないと警告が出るのね。

理由は何?
>>209
なんだろう?
可変個引数ゆえにtype *がvoid *に変換されずにそのまま渡されるからかな?
そこまで文句をつけるかー!?って思うけど(だからこそpedanticなのかな)

3.3.2や3.3.3では出るけど、2.95.3では出ないね。
| 7.19.6.1 The fprintf function
| 8
| p   The argument shall be a pointer to void. The value of the pointer is
|     converted to a sequence of printing characters, in an implementation-defined
|     manner.

と、void へのポインタって書いてあって、かつ、
>可変個引数ゆえにtype *がvoid *に変換されずにそのまま渡されるからかな?
かと思われ。
さすが pedantic だ
-ansi -pedanticだけじゃ警告出ないな。-Wall付けると出る。
CFLAGS=-std=c99 -Wall -pedantic

だなぁ。みんな、-Wall だけなの?
3.4はスケジュール通りだせるんでつかね。
Mitchellタソ、ブチ切れぎみですが・・・
GCCの開発は、いろいろ踏まえなくてはならないことが
多すぎてなかなか大変だとは思いますががんがってください。
応援しております。
>>215
向こうで言ったれよ
俺もそうおもた
gc#出ないの?
219デフォルトの名無しさん:04/03/25 08:59
俺もそうおもた
220デフォルトの名無しさん:04/03/29 11:44
修正

単発質問から始まったGCC(GNU Compiler Collection)について語るスレ。
あまり勢いはないが地味に逝こう。

GNU本家のGCCページ
http://gcc.gnu.org/

前スレ
・GCCについて part2
http://pc5.2ch.net/test/read.cgi/tech/1046179115/
・GCCについて(過去ログ倉庫)
http://pc5.2ch.net/tech/kako/1007/10077/1007731543.html

関連スレ
・cygwin + mingwn + gcc 相談室
http://pc5.2ch.net/test/read.cgi/tech/1058134693/
・gcjって使ってる人います?
http://pc5.2ch.net/test/read.cgi/tech/1046627795/
更に勢いの無いスレ

祝・GCC 3.0リリース
http://pc3.2ch.net/test/read.cgi/unix/992942337/
glibcコンパイル時は-fomit-frame-pointerを付けてはいけないのか。
くそー、俺の二時間を返せ。
プリコンパイルヘッダ対応マダー?
>>223
自分でビルドすればいいじゃん。
>>224
ハァ?
227225:04/03/31 01:39
>>224
スマソ
>>226
サンクス
Appleのgccは独自のプリコンパイルヘッダ対応付いてるよ。
cpp-precompってやつ。
conio.hをインクルードするには、
コンパイルするときにどのようなオプションをつければいいんですか?
インクルードするのにオプションは必要ない
いや、そのconio.hがサーチパスに入っていない場合は、-I<そのパス>が必要か
232229:04/04/20 10:13
>>231
stdio.hと同じディレクトリに入ってるんですが。
では、>>229が抱えているのは別の問題。
234デフォルトの名無しさん:04/04/20 11:15
gcc3.4.0をインストールしてプリコンパイル済みヘッダを使おうとしたら
test.cc:1: sorry, unimplemented: had to relocate PCH
というメッセージが出ました。ホントに実装されてないんですか?
それとも私が何かおかしなことをしているんでしょうか。
実行した手順は以下のとおりです。

1.インストール
 ftp.dti.ad.jp から
   gcc-core-3.4.0-20040416.tar.gz と gcc-g++-3.4.0-20040416.tar.gz
 をコピー
 
 3つのディレクトリ /srcdir /builddir /usr/local/xp
 を作成して上記2つの .tar.gz ファイルを/srcdirに展開
 
 cd /builddir
 /srcdir/gcc-3.4.0-20040416/configure --prefix=/usr/local/xp --enable-language=c++
 make bootstrap
 make install
 
 /usr/local/xp/bin にパスを通す

2.使ってみる 
 /usr/local/xp/bin/g++ test.hh
 /usr/local/xp/bin/g++ test.cc
 ---- test.hhの中身 ----
#include <iostream>

 ---- test.ccの中身 ----
#include "test.hh"
int main() { std::cout << "hoge" << std::endl; return 0; }
235デフォルトの名無しさん:04/04/20 19:06
GCC 3.4.0 リリースage
ftp;//ftp.gnu.org/gnu/gcc/gcc-3.4.0/
アナウンスはまだ出てない?
ChangeLog
ttp://gcc.gnu.org/gcc-3.4/changes.html
237236:04/04/20 19:52
あ、ChangeLogじゃないか。
変更点一覧だ。
>>236
出てないけど、前もそうだったし、まぁいいかな、と。
アナウンスがない以上はバイナリの差し替えもありうるということですよね。
3.3.3を上書きしちゃったから確認はしてないけど、プリコンパイルヘッダ無
しでも3.3.3よりC++のコンパイルが速くなった気がするなぁ。パーザを書き変
えた効果がこんな所にも出てるのかな。
> GCC 3.4 automatically places zero-initialized variables in the .bss section on some operating systems.
> Versions of GNU Emacs up to (and including) 21.3 will not work correctly when using this optimization;
> you can use -fno-zero-initialized-in-bss to disable it.

うれしいな〜
>>239
ある程度ミラーされるまでアナウンスしない方針だったような。
今週中には出ると思うが。


>>241
2行目以降も引用して「うれしいな〜」と言っているところを見ると…アンチEmacs? (w
vivavi
-pedantic を愛用してる俺はダメ人間ですか?
246234:04/04/21 16:13
リリース版入れたけどダメだ orn
cygwin未対応なのかな
gccがC#に対応するなんてことあるの?
Unix上でC#使ってみたいんだけど・・・
monoじゃだめなの?
>>246
それ以前にウチのCygwinでコンパイル通んないんすけど・・・。
250247:04/04/21 17:13
>>248
ありがと。既にもうあったんだ・・・調べてみます。
251デフォルトの名無しさん:04/04/21 23:59
>>222
そうなの?
gcc 3.4:
* The C, C++, and Objective-C compilers can now handle source files
written in any character encoding supported by the host C library. The
default input character set is taken from the current locale, and may be
overridden with the -finput-charset command line option. In the future
we will add support for inline encoding markers.

MinGWのランタイムとかCygwinって日本語ロケールはサポートしてるのかな?
それ iconv 必須
iconvがあればいいの? じゃあ話は簡単だね。
>>252
とりあえず cygwin について。
ttp://www.okisoft.co.jp/esc/cygwin-5.html#5.3
とりあえずだめぽ?
256Richard Stallman:04/04/23 14:17
GCC & GNU Toolchain Developers' Summit
June 2-4th, 2004, Ottawa Congress Centre, Ottawa, Canada
ttp://www.gccsummit.org/2004/

みんな逝くのだ!
>>256
チョトだけ遠いな
GNUのネ申が言うんだからしかたない漏れも逝くか。
>>256に逝かない奴は、GPL違反
gcc3.4のC99規格対応表
ttp://gcc.gnu.org/gcc-3.4/c99status.html
なんでcomplex (and imaginary) support in <complex.h>がBrokenなんだろ
ちゃんと理由書いてあるやん。
ぐはぁっ。ほんとですね。イッテキマス…
264デフォルトの名無しさん:04/04/24 13:13
GCCは3.0からC++ISO準拠したと聞きましたが
ISO以外の形式はコンパイルできないのですか?
>>264
ISO以外の形式とはなんだ。
誰かの脳内にある俺様C++をGCCの中の人がわかるわけないだろ。
266デフォルトの名無しさん:04/04/24 20:22
>>265
例えば
cout << "文章" << x << "文章2" << endl;
(xは変数)
でコンパイルすると「stray '\33' in program」「文字の終端を欠いています」
と出てコンパイルできません。

cout << "文章" << x;
cout << "文章2" << endl;
とするとうまくいくのですが
foo.cc:
#include <iostream>
using namespace std;
int main() { int x = 10; cout << "文章" << x << "文章2" << endl; }
% g++ foo.cc
% ./a.out
文章10文章2

うまくいくけど?
268デフォルトの名無しさん:04/04/24 20:43
>>266
SJISか?
269デフォルトの名無しさん:04/04/24 20:45
解決しました。
文字コードの問題だったようです。
エディタを変えたら無事コンパイルできました。
270いやーん:04/04/25 00:23
>>266
> cout << "文章" << x << "文章2" << endl;
> (xは変数)

これがISO C++に適合したプログラム断片じゃないと思ったわけだ…
271GCCer:04/04/25 15:59
これ知ってたか?
-fpreprocessed
272デフォルトの名無しさん:04/04/25 17:10
>>270
全ては方法的懐疑に基づく訳ですな
それでgcc3.4はどうよ? > 使用してる奴
以下を実行すると..
gcc -###
275デフォルトの名無しさん:04/04/26 02:21
RH9付属のgcc-3.2.2でgcc-3.4をmakeできた人いる?xgccができたあたりでICEしちゃうんだけど..
gcc -finput-charset=sjis -fexec-charset=sjis testsjis.c -o testsjis
内部で\がすべて2バイトコードに変換されてしまいます。
libiconvのsjis->utf-8がよろしくないようで
277デフォルトの名無しさん:04/04/26 13:11
もろ環境依存の話ですが,
どこに書けばいいのかわからないので,ここに書かせてください.
(もし,適切な場所があれば誘導をお願いします.)
MacOSXのg++(3.1 20020420)で(gccではなく)isnanを使いたいのですが,うまくいきません.
#include <cmath>
int main () {double d (NAN); std::isnan (d); return 0;}
なるコードをg++ test.cppすると,
`isnan' undeclared in namespace `std'
とエラーがでてしまいます.
stdを取っても同じエラーが出ます.
ヘッダをチラッと読んでみると,__isnanみたいな関数が途中あったので,
こちらを呼ぶと,とりあえずはビルドできるんですが,
これは正常な使い方とは思えません.
どうやって使ったらよいものかご存知の方いらっしゃいますでしょうか?
278デフォルトの名無しさん:04/04/26 13:22
>>277
解決方法ではないんだが、
ISO/IEC 9899:1999 (C99規格) の§7.12.3.4 によると、isnanはマクロとなっているね。だからとりあえずstd::は不要だ。
>>276
長らくバックスラッシュを \ で代用していたことの弊害が本格的に出てきたヨカーン。
スレ違いだけど、本質的な解決策ないよね。gcc 的にはアドホックな解決でいいんだろうけど。
280277:04/04/26 13:51
>>278
> 解決方法ではないんだが、
> ISO/IEC 9899:1999 (C99規格) の§7.12.3.4 によると、isnanはマクロとなっているね。だからとりあえずstd::は不要だ。

レスありがとうございます.
std::取っちゃうと,
`isnan' undeclared (first use this function)
とのエラーがでちゃうんですよ.
ちなみにgccで(#include math.h>して)は,コンパイルは正常に行えます.

(ただし,別件になりますが,リンカで,
ld: Undefined symbols:
___gxx_personality_v0
のように出てしまいます.-lmはしてみたんですけど,
こちらは何をリンクすればいいんでしょうか?)
281デフォルトの名無しさん:04/04/26 14:03
だからマクロだっての。
>>280
#include <cmath>
int main () {double d (NAN); isnan (d); return 0;}
283277:04/04/26 14:44
>>281
> だからマクロだっての。
すみません.
リンカの話,忘れてください.(エラーでなくなった.)
284277:04/04/26 14:45
>>282
test1.cpp: In function `int main()':
test1.cpp:2: `isnan' undeclared (first use this function)
test1.cpp:2: (Each undeclared identifier is reported only once for each
function it appears in.)
>>276,>>279
それってエディタが全角に変換してない。
>>277
gcc3.3.1はうまくいった
$ g++ test.cpp
$
287277:04/04/26 14:57
>>286
> gcc3.3.1はうまくいった
これ,Mac OS X上のgccでしょうか?
288デフォルトの名無しさん:04/04/26 14:58
>>285
んな話じゃない。Shift-JISはISO646IRVではなくてJIS X 0201(のLeftHalf)を仮定してるって話だよ。
ゲラゲラ
必死だなw
290286:04/04/26 15:16
>>287
Linux
>>285
>それってエディタが全角に変換してない。
iconvのソース(shift_jisx0213.h)より
/* Plain ISO646-JP character. */
if (c == 0x5c)
*pwc = (ucs4_t) 0x00a5;
else if (c == 0x7e)
*pwc = (ucs4_t) 0x203e;
else
*pwc = (ucs4_t) c;

>>288
euc-jpだと\(0x5c)を元に戻してくれるみたい。なぜ?
292277:04/04/26 15:28
>>290
> Linux
ああ,やっぱそうですか.
私の所も,Linux(gcc 3.3.3)ではうまく行くんですよね.
う〜ん.OS Xの人はどうしてるんだろう?
Panther (10.3.3) 使ってるけど同じエラー出た。
$ gcc isnan.cpp -o isnan
isnan.cpp: In function `int main()':
isnan.cpp:2: error: `isnan' undeclared (first use this function)
isnan.cpp:2: error: (Each undeclared identifier is reported only once for each
function it appears in.)
$ gcc -v
Reading specs from /usr/libexec/gcc/darwin/ppc/3.3/specs
Thread model: posix
gcc version 3.3 20030304 (Apple Computer, Inc. build 1495)
294デフォルトの名無しさん:04/04/26 15:38
> >>288
> euc-jpだと\(0x5c)を元に戻してくれるみたい。なぜ?

EUC-JPは、規格上は0x5cがバックスラッシュ(ISO646IRV)なんだよ。実際にどう表示されるかは
実装の問題で。
295277:04/04/26 15:43
>>293
> Panther (10.3.3) 使ってるけど同じエラー出た。
あっ,ども.
やっぱりそうですか.
とりあえず,__isnanでも使って凌いどくか.
で、何が問題なのさ。>>288
297デフォルトの名無しさん:04/04/26 15:52
>>296
288に書いてあるままなんだがな・・・・
問題は、
>gcc -finput-charset=sjis -fexec-charset=sjis testsjis.c -o testsjis
>内部で\がすべて2バイトコードに変換されてしまいます。
>libiconvのsjis->utf-8がよろしくないようで
これがlibiconvのバグでもなんでもなくて、Shift-JISというエンコーディングの
仕様に従った動作だという点だな。
279もそう言っている。
288じゃないけど。
Shift_JIS の 0x5c は \ なんだけど、C / C++ のソース中ではバックスラッシュと同じ働きをするという
日本ローカルな慣例が i18n と馴染まないということが問題なのでは(←ローカルだから当然か・・・)?
要するに'¥'と'\'が同居できないって事?
300デフォルトの名無しさん:04/04/26 15:57
>>299
> 要するに'¥'と'\'が同居できないって事?
EUC-JP, Shift-JIS, ISO-2022-JPで日本語を書く限りは同居できない。
直接UTF-8で書けば同居できる。
>>295
これか?
http://www.vallis.org/blogspace/osxtricks
> There is a bug in /usr/include/gcc/darwin/3.1/g++-v3/cmath that will
> undo the definition of isnan. To fix it, comment out the line #undef isnan.
> Update: in Panther, the file to change is /usr/include/gcc/darwin/3.3/c++/cmath.

他人が使うモノだと書き換えるわけにいかんだろうから、mymath.hpp でも作って
そっちで isnan() マクロを定義する必要がありそうだね。
>>300
>直接UTF-8で書けば同居できる。
問題は解決しました。
>>302
ウム。
ちょっとまてよ、同居する必要ってそもそもあるの?
コンバージョンをしないなら問題ないはずだが。
ウム。
>>304
毛唐はなんでもUTF-8に正規化したがるものさ。
>>297-298
日本では歴史的に EUC と SJIS 間での変換の際 0x00〜0x7f はそのままに
してきたし、UTF への変換でもそうなったところで誰も困らないのに、
GNU libiconv では規格バカが譲歩してくれない。

sjis ではなく cp932 を使えばとりあえず回避できるけどね。
ちなみに、自前で漢字コードコンバータを持ってる Perl 5.8 では
http://www.perldoc.com/perl5.8.0/lib/Encode/JP.html#BUGS
こんな感じで不要な変換を行わないことになってる。
309277:04/04/26 16:25
>>301
> http://www.vallis.org/blogspace/osxtricks
> > There is a bug in /usr/include/gcc/darwin/3.1/g++-v3/cmath that will
> > undo the definition of isnan. To fix it, comment out the line #undef isnan.
> > Update: in Panther, the file to change is /usr/include/gcc/darwin/3.3/c++/cmath.

ああ,これっすね.

> 他人が使うモノだと書き換えるわけにいかんだろうから、mymath.hpp でも作って
> そっちで isnan() マクロを定義する必要がありそうだね。

/usr/include/architecture/ppc/math.hから,

#define isnan( x ) ( ( sizeof ( x ) == sizeof(double) ) ? \
__isnand ( x ) : \
( sizeof ( x ) == sizeof( float) ) ? \
__isnanf ( x ) : \
__isnan ( x ) )
これ使うことにします.
>>307
"sjis->utf-8"の場合のlibiconvの処理を変更して(゚д゚)ウマー
ではだめ?
>>307
いやしかし gcc 的にはどうであれ、世間的には圧倒的に \ は円記号として使われてるわけで・・・
UTF-8 にしたらバックスラッシュで表示されますた、ではまずいような。
\(゚听)イラネ
>>312
\オレニクレ
そこで trigraph ですよ。
main() { printf("表示??/n"); }
% gcc -trigraphs -finput-charset=sjis -fexec-charset=sjis sjis.c
% ./a.out
表示
315デフォルトの名無しさん:04/04/26 20:38
そこで trigraph ですよ。
main() { printf("表示??/n"); }
% gcc -trigraphs -finput-charset=sjis -fexec-charset=sjis sjis.c
% ./a.out
表示
うにこーどの円マーク: ¥
バックスラッシュ: \
universal character names(\u)じゃダメ?
318276:04/04/27 01:06
>>307
cp932を指定したら'\'を0x5cで処理してくれました。
>>307
> GNU libiconv では規格バカが譲歩してくれない。
>>311
> いやしかし gcc 的にはどうであれ、
> 世間的には圧倒的に \ は円記号として使われてるわけで・・・

そうではないぞ。>>288>>294>>297の言う通り。

これだけじゃ理解できない人は、
http://euc.jp/i18n/ucsnote.ja.htmlの
"6. ASCIIとJIS X 0201ローマ文字"を読むといい。

プログラムを書いている時でさえ、
YEN SIGN → REVERSE SOLIDUSと固定的に変換するとまずいのだ。(嗚呼神様)
ある時はYEN SIGN, ある時はREVERSE SOLIDUS。
それがShift_JISの0x5cの今までの使われ方。
規格ではYEN SIGNなのに。

納得のいかない話であるがこれが真実。
杓子定規に行くと>>314が正解。(ぐすん)
>>318
それはUnicode.orgのmappingを利用しているからだと思います。
ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT
http://www.asahi-net.or.jp/~ez3k-msym/charsets/jis2ucs.htm

iconvがこのmappingを固定的に使ってくれると、使い分けられていいですね。
本来>>319に書いたようにYEN SIGNのままでいて欲しいところもあるわけですが…
>>319
規格は規格として、現実的には
Windows: CP932 の 0x00〜0x7f を u+0000〜u+007f にマップ
Java: CP932 だけでなく Shift_JIS も 0x00〜0x7f を u+0000〜u+007f にマップ
Perl: Shift_JIS の 0x00〜0x7f を u+0000〜u+007f にマップ
と、ASCII のように変換する動作がデファクトスタンダードになっている。

http://mail.nl.linux.org/linux-utf8/2002-05/msg00076.html
からのスレも参照。
圧倒的シェアを誇っている Windows の CP932 が、0x5C を「見た目は円マーク」なのに「ファイル名、
パス等として使われる場合には ASCII のバックスラッシュと同じ」って扱いにしてるんだよね。
C / C++ その他昔ながらの応用ではみんなそうか。

今後どうなるべきなの?
UTF-8 対応のエディタ使って、0x5C はバックスラッシュで入力(表示もバックスラッシュ)、
円マークはえーとコード分からないけど Unicode の円マークで入力(表示も円マーク)となるべき?

素直に EUC 使って\は2バイトで書くほうがいいような気が・・・
微妙に話題がスレ違いになっているのは気のせいですか?
っていうか文字コード関連のスレのほうがよいと思われ。
【UTF8】文字コード変換【SJIS】
http://pc5.2ch.net/test/read.cgi/tech/1063177450/l50
やっとcygwinでPCHでけた。
234のソースを使用
3.3.1
$ time g++ test.cc
real 0m8.416s
user 0m1.211s
sys 0m1.201s

3.4.0
$ time /usr/local/xp/bin/g++ test.hh
real 0m2.160s
user 0m1.702s
sys 0m0.470s

$ time /usr/local/xp/bin/g++ test.cc
real 0m1.593s
user 0m1.011s
sys 0m0.560s
>>324
pch(・∀・)イイ!!
>>324
うーむ、やはり速くなってるな
327234:04/04/29 04:46
>>324
どうすればできるようになるんですか?
>>234
cygwinではggc-common.cの中のmmapでoffset指定があるところが問題

ggc-common.cの中では
#undef HAVE_MMAP_FILE
する。
なぜか、mmapが使えなくてもいい様にコーディングしてあるのに
その中の処理が全くないので処理を追加する。
追加する場所はhooks.cの中の
hook_void_void   ここで適当な大きさのメモリを確保 実行時に2回呼ばれるので注意
hook_voidp_size_t_null 確保したメモリのアドレスを返す
hook_bool_voidp_size_t_false 確保したメモリのアドレスと同じかと大きさを確認する。

ggc-common.cのneeds_readの判定後の処理がおかしいので
if (needs_read)
{
if (fseek (f, mmi.offset, SEEK_SET) != 0
/*|| fread (&mmi, mmi.size, 1, f) != 1*/)
fatal_error ("can't read PCH file: %m");
fread(addr,mmi.size,1,f);
}
上のように書き換える。

以上
 
329234:04/04/29 05:56
>>328
レスありがとうございます。
早速やってみます。
結果報告はのちほど。
330234:04/04/29 16:16
>>328
hooks.cは>>331のようにしてみましたが
  g++: 内部エラー: Segmentation fault (プログラム cc1plus)
  完全なバグレポートを送ってください。
と言われてしまいました。

ひたすら fprintf() をはさんで調べたところ、
どうやら ggc-page.c の clear_marks() の内側のループの
  size_t num_objects = OBJECTS_IN_PAGE(p);
でこけているようです。

どこが間違っているんでしょうか?
331234:04/04/29 16:16
void *buffer_used_for_PCH_on_cygwin = NULL;
#define BUFFSIZE_FOR_PCH_ON_CYGWIN (1<<24)

void
hook_void_void (void)
{
if (buffer_used_for_PCH_on_cygwin == NULL)
buffer_used_for_PCH_on_cygwin = xmalloc(sizeof(BUFFSIZE_FOR_PCH_ON_CYGWIN));
}

void *
hook_voidp_size_t_null (size_t a ATTRIBUTE_UNUSED)
{
return buffer_used_for_PCH_on_cygwin;
}

bool
hook_bool_voidp_size_t_false (void * a ATTRIBUTE_UNUSED, size_t b ATTRIBUTE_UNUSED)
{
if (buffer_used_for_PCH_on_cygwin != a && a != NULL) {
fprintf(stderr, "OTL\nbuf: %p\na: %p\n", buffer_used_for_PCH_on_cygwin, a);
exit(1);
}
if (BUFFSIZE_FOR_PCH_ON_CYGWIN <= b) {
fprintf(stderr, "orz\nb: %d\n", b);
exit(1);
}
return true;
}
#undef BUFFSIZE_FOR_PCH_ON_CYGWIN
>>330
ggc-common.cで
#undef HAVE_MMAP_FILE
を入れてる場所がよくないような?

includeがすべて終わった後にundefしてみて
333234:04/04/29 18:06
>>332
そうしてるんですけどダメです。#undefする場所をいろいろ試してみたんですが、
#include "config.h"
#include "system.h"
...
#include "hosthooks.h"

// ******** ここに入れたり ********
#ifdef HAVE_SYS_RESOURCE_H
# include <sys/resource.h>
#endif

// ******** ここに入れたり ********
#ifdef HAVE_MMAP_FILE
# include <sys/mman.h>
# ifdef HAVE_MINCORE
/* This is on Solaris. */
# include <sys/types.h>
# endif
#endif
...
#ifdef ENABLE_VALGRIND_CHECKING
...
#endif
// ******** ここに入れたり ********

やはり状況は変わらずです。只今ほんのり自棄になってconfigureの
#define HAVE_MMAP_FILE 1
を消して configure → make bootstrap 中です。
>>333
hooks.cの追加した処理があってることと

#undef HAVE_MMAP_FILE
が有効になっていれば

if (needs_read)
{
if (fseek (f, mmi.offset, SEEK_SET) != 0
/*|| fread (&mmi, mmi.size, 1, f) != 1*/) <−−−コメントするのを忘れるとOUT
fatal_error ("can't read PCH file: %m");
fread(addr,mmi.size,1,f);          <−−−ここを通過するはず
}


335234:04/04/29 18:51
>>334
そこは通過するんですけど、その後の ggc_pch_read() で
Segmentation Falte
なんです。
>>336
gccをmakeし直したらヘッダーファイルを再度PCHしないとだめだよ。
hook_void_voidで確保したアドレスが違うとエラーになる可能性がある。
gccのオプションで構造体のメンバ間をpaddingさせないようにする
オプションは何ですか?
338234:04/04/29 19:53
>>336
それもやってるんですけど...OTL
>>337
attributeで可能だったような気がする。info読め。
>>337
struct foo {
chara;
shortb;
intc;
} __attribute__((__packed__))
>>339,>>340
タンクスでつ
configureが違うからか?
$ /usr/local/xp/bin/g++ -v
Reading specs from /usr/local/xp/lib/gcc/i686-pc-cygwin/3.4.0/specs
Configured with: ../gcc-3.4.0/configure --enable-languages=c,c++ --enable-libgcj
--enable-threads=posix --with-system-zlib --enable-nls --without-included-gette
xt --enable-interpreter --enable-sjlj-exceptions --disable-version-specific-runt
ime-libs --enable-shared --host=i686-pc-cygwin --target=i686-pc-cygwin --prefix=
/usr/local/xp
Thread model: posix
gcc version 3.4.0
343234:04/04/30 02:29
>>342
かもしれませんね。
それでやってみます。
344234:04/04/30 03:43
やり直してもダメでした。
変更したソース
ttp://up.atnifty.com/upload/file/20040430035201_.zip

gccのソースをオリジナルに戻して、やってみて

これで駄目なら、あきらめましょう。
346234:04/04/30 04:10
>>345
ありがとうございます。
ダウンロードさせていただきました。

報告は後ほど。
347234:04/04/30 05:00
>>328>>332>>334>>336>>342>>345
できました!
ほぼ丸一日お付き合いいただきありがとうございます。

でもなんで自分でいじったのはダメだったんだろう...
分かり次第報告させていただきます。(ウザイですか?)
わくわく
349234:04/04/30 06:14
あ、わくわくされてる。
報告はたぶん明日以降になると思います。
(きっとすごく単純なとこではまってたんだろうなぁ)
350234:04/04/30 07:18
Segmentation faultが起こった分かりました。
hook_void_void()の領域を確保するところ↓(>>331 から抜粋)で、

>#define BUFFSIZE_FOR_PCH_ON_CYGWIN (1<<24)
...
>if (buffer_used_for_PCH_on_cygwin == NULL)
>  buffer_used_for_PCH_on_cygwin = xmalloc(sizeof(BUFFSIZE_FOR_PCH_ON_CYGWIN));

xmalloc(BUFFSIZE_FOR_PCH_ON_CYGWIN)
としてたつもりが
xmalloc(sizeof(BUFFSIZE_FOR_PCH_ON_CYGWIN)) // ** なぜかsizeof使ってた
としていたために充分な領域が確保されてませんでした。

"malloc()といえばsizeof"っていう癖がついてたんでしょうね、きっと。
激しくアフォでごめんなさい。
↓何事も無かったようにどうぞ
皮はシャッキリシコシコ
噛むと美味しいおつゆがピュッ
353デフォルトの名無しさん:04/04/30 13:11
-finline と -finline-functions って同じ意味でしたっけ?

355353:04/04/30 15:49
>>354
マニュアル類には-finlineについて記述がないんですが、指定しても
エラーにならんのですよね。
gcc -v --help
>>356
サンスコ!
358デフォルトの名無しさん:04/04/30 18:42
gccのoptionてアホだよな
>>358
日本語書くときに促音を省略してしまうキミもね。
>>359
日本語を書くときに助詞を省略してしまうキミもね。
>>358
それを言うだけでageてるキミもね。
オマエモナーって死語?
最近はオマエガナーがナウいです
最近のヤングにはオマエガナーがとてもナウいんです。
ナウなヤングage
ほとんどビョーキなスレはここですか
tree-ssaはいつメインラインと統合されるんですかね
tree-ssaって何?
>>368
よくわかんない、詳細希望
>>371
ありがと、わかったようなわからないような感じです。
373371:04/05/02 01:37
>>372
コピペした者として、喜んでいいのかよくわからないレスをありがとう。
たれかC++相談室のネタに答えてやれ
C++相談室はVC++マンセーのようだがgccのコード品質ってどのくらい?
あの例、gcc-3.4 だともうちょい良くなったりしないもんかなー
tree-ssaとやらが組み込まれたgccでの結果も見たいもんだ
>>372
http://www.is.titech.ac.jp/~sassa/lab/papers-written/02M37130.pdf
とか?(関係あるのかないのかよくわからんのだけどw
FixedPoint f(1, 50); // 1.50
return f.i_;

だけのコードなら、gcc-3.4 で
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
subl $16, %esp
movl $1, %eax
leave
ret
にはなるね。%esp の操作が無意味だが…
掛け算入ったやつはダメダメ。

>>379
サンクスコ

> 掛け算入ったやつはダメダメ。
gcc-3.3以前よりもっと駄目??
方や世界で一番大きいソフト会社の製品、方や歴史はあるとは言えただの
ソフトだから当然と言えば当然。
でも、それがどの程度、普段書くコードの速度低下をもたらすかだけどね・・・
C++で数値計算やってる俺の場合、
インテルコンパイラが第一。わずかに劣ってgcc。めちゃくちゃ遅いVC7.1
ってところ。iccと同じオプションなのにVCは遅くて仕方がないんだけど
なんか使い方間違ってるんかな?
まぁWinなんてたまにしか使わないからgccだけでいいんだけどね。
gcc はオプションで結果が全然違うぜ!
自分の目的にあった適切なオプションを選択しろよ!
浮動小数点数値演算(複素sin/cos等あり)で速度 gcc3.0 << VC++6.0
-ffast-mathつけるとgcc3.0 ≧ VC++6.0
てなことがあった(もちろん最適化ありで)。
VC++6.0の浮動小数点は-ffast-math相当じゃないかと疑っている。
面倒くさいから試してないけど。
>>380
自分が試した範囲だと、gcc-3.4.0 だとオプションをどーやっても真面
目に掛け算するコードを吐いてました。

もちろん、一般的に gcc-3.4 のほうが最適化がダメ、ということでは
ないですけどね。gcc-3.3.x で __attribute__((always_inline)) を付
けないと展開されなかった関数オブジェクトが gcc-3.4.0 では指定な
しでも展開してくれるようになって、自分は嬉しい。

gcc使う奴はオプションを適切に設定していればいいわけで、
デフォルトで最適な状態はありえないと考えればいいのでは。
ひとつだけいえるのはintelもMSも他でさんざん儲けてるんだからコンパイラなんか無償配布しろって琴田
マジでそう思うのは俺だけ?
>>385
Intel も Microsoft もコンパイラは無償配布してますよ?
388387:04/05/03 04:09
みすった、>>386
インテル版はお試し期間中の無料配布はしてるがそれをただとはいわんだろ?
http://www.xlsoft.com/jp/products/intel/prices.html
ここわ、GCCすれです。
そこを考慮して、改めて>>391さんどうぞ。
インテルのGCCはないの?
お見苦しい発言を失礼しました。
では改めて>>392さんどうぞ。
→↓
↑←
iccのlinux版は無料だよ
確か。
このスレではgccマンセーのようですが、
件の最適化についてはgcc3.4でも改善されていないということでFA?
>>394
非商用限定だけどね
>>396 lic 要らないの?
FreeBSDでインストールしようとしたけど駄目だった。動いた人居る?
3.4も3.5もNetBSDで普通に使ってます
400デフォルトの名無しさん:04/05/03 14:55
>>395
> このスレではgccマンセーのようですが、
> 件の最適化についてはgcc3.4でも改善されていないということでFA?
gcc3.4のほうが悪化しているでFA.
>>399
コンソール画面からインストーラ起動するとログアウトする。
atermから起動するとaterm自体が落ちるんだけど。そんなことない?
402デフォルトの名無しさん:04/05/03 17:03
>>384
> >>380
> 自分が試した範囲だと、gcc-3.4.0 だとオプションをどーやっても真面
> 目に掛け算するコードを吐いてました。

$ rpm -qa|grep icc
intel-icc7-7.1-6

だと(最新版じゃないが)、mov $5, -4(%ebp) ひとつにコンパイルされました。
VC++と同じく問題なしですね。

403デフォルトの名無しさん:04/05/03 19:57
数日前にUNIX板で質問したのですが、回答いただけなかったのでこちらでも質問させてください。
2度目の皆様すみません。

nmしたときやg++ -Sしたときに、コンストラクタやデストラクタに
Foo::Foo[in-charge]() のように[なんちゃら]と注釈が入っている場合がありますけど、
これって何ですか?どこかに解説ありませんか?

in-charge, not-in-charge, in-charge deleting などがあるようで...
真面目に掛けてほしい状況の方がふつーのプログラムでは多いんじゃないの?
プリプロセッサだけでも計算できる定数じゃなくて変数をセットしたときの実動作では
ほとんどネグれる程度だったり。そのコンパイラの苦手なソースにたまたま出くわしたという
ことじゃないの?
>>403
libiberty/cp-demangle.c

/* Demangles and emits a <ctor-dtor-name>.

<ctor-dtor-name>
::= C1 # complete object (in-charge) ctor
::= C2 # base object (not-in-charge) ctor
::= C3 # complete object (in-charge) allocating ctor
::= D0 # deleting (in-charge) dtor
::= D1 # complete object (in-charge) dtor
::= D2 # base object (not-in-charge) dtor */
>>405
ありがとうございます。
なるほど…
>>404
クロスコンパイルも視野にいれると、
定数のコンパイル時計算は意外と面倒で、
最適化(定数伝搬&ループ外移動)のことを考えるとあまり効果がない。

昔のgccは結構強引なことをやった時期もあって、
(doubleの交換律による定数まとめなど)
ずいぶんと批判されてましたね。
俺の場合、gccはVCより明らかに高速なことが多い。
でもiccには負ける。
CPU設計するときに少なくともCコンパイラは同時に開発するだろうから、
インテルが出すコンパイラが他メーカより遅いのは逆に問題ある罠。
gdbで実クロック数のカウント表示ってできないのかな?
今時のCPUはICEでも無理。
それはマルチスレッドの場合でパイプラインが深いだけならカウントできるだろ?
>>411
キャッシュヒットとか page fault もあるし、単一スレッドのプログラムでも
裏でクロック割り込みとか I/O まわりの割り込みが発生してるから。
>>410 君ICE触ったことないね。ICEじゃ無理だよ。直接CPUが載ってるわけだから。
HWで動いてるCPUのクロックをどうやってカウントするんだ?ロジアナもってくりゃできるけどな。
クロック数カウントするのはイン・サーキット・エミュレータじゃなくてボントのシミュレータじゃないと駄目。
むしろgdbの target sim に含まれて無いほうがおかしい。
スーパースカラ、内部コア命令翻訳、パイプラインハザード考えても、
今時のCPUで外部からクロックカウントは無理。

CPUのモデルごとにプロファイルを持って、
CPUの内部を完全にエミュレートしないと。

こんなやつ
http://www-cs-faculty.stanford.edu/~knuth/mmix.html
http://www-cs-faculty.stanford.edu/~knuth/mmix-news.html
>>413
Z80くらい昔のCPUのICEは出来たよ。
>>414
あのねメーカから出てるシミュレータ/デバッガでは当然できる機能なんだよ。
できなきゃ組み込みソフトなんて製品にならんぜ。
gdbがやってないのはそれはgdbの都合
>>416
当たり前でしょ。gdbの話してんのよ。アフォ?
>>415
ICE(エミュレータ) っていうのはハードウェアが載ってることは知ってるよね。
それをカウントしようとすると相当手間なのよ。
そんなことしなくても実効命令のクロックを順番に加算していけば算出できるんだよ。
だからシミュレータなら当然できる機能ってこと。
実際俺が使ってるSHやDSP(54X)デバッガにはその機能があるし。
>>417
クロック数のカウントの話をしてんのにハードウェアエミュレータの話をするところが間抜けだいってるんだよ
わからんのかね。馬鹿かお前。
>>418
> そんなことしなくても実効命令のクロックを順番に加算していけば算出できるんだよ。
そんな時代もあったなぁ…・・・
まともなシミュレータも知らん奴は紛らわしからコメントするな。
電波はコメントするな
さぁ、盛り下がってまいりました。
ICE?ナニソレおいしいの?
人間が作ったハードウェアのクロックも数えられないと思ってる時点でも一回勉強しなおしたほうがいいんじゃないか->421
それが評価できない時点でCPUの設計はできんだろうが。
>>421
君のCPUの設計はクロックすら不確定性関係が成立してて評価不能なようだな。
マルチCPUで複数クロックで動いてる場合はともかく単一クロックで動作してる場合
評価できない方がおかしい。できないと思ってる奴は手を抜いてる(抜かれてる)ことに
気づかないおめでたい奴。
>>427
単一クロックの元で動作してるという仮定の下でクロック数をカウントするってことだな。
>>427
> 単一クロックで動作してる場合評価できない方がおかしい
環境による。

プリエンプティブマルチタスク OS だとまず不可能だが、優先度順で実行タイミングを
完全に制御できるリアルタイム OS で、かつキャッシュヒットも完全に制御下における
なら見積もれる。

ただ正確な評価を行うためには CPU の外部仕様ではなく、内部仕様に関する詳細な
知識が必須だから gdb に期待するのはアレだ。
>>425=426=427
まぁ餅憑け
(・∀・)ニヤニヤ
>>429 
ヲイヲイ。デバッガでOSの仕様を考慮してるものがあれば、教えてくれよ。
デバッガは通信機能はOS/モニタを意識してる。それをいうならソフトウェアシミュレータだな。
OSというのはあくまでオーバーヘッドがないことを前提としてる。というか時間計測するん
じゃなくてクロック数で評価するんだから当然可能なはず初期キャッシュは当然ヒットなしが前提だろ。
(・∀・)ニヤニヤ
結局話についていけなくて笑っているしかございません。
当然すぎ
で、結局 >>409
はどういう環境で開発してて、なんで実クロック数のカウントを
とりたいと思ったんだ?
gdbの sim は HDLシミュレータでいうところの機能シミュレータなんだな。
実時間シミュレータ対応でない。
modelsimぐらいの機能は持ってくれるとうれしいんだが、
当然CPUメーカにはデバイス情報も開示して欲しいな。
>>436
それは当然必要だろ?それによって必要なリソースの条件が変わってくる。
例えばあるタスクを10mxで完了したい。そのとき何MHzのクロックを突っ込めば
よいかが設計段階で算出できる。ちなみに消費電流はクロックに対してリニアに
変化する。シビアなモバイル関係のエンジニアならだれもが経験してること。
10mA変われば製品に対する市場評価が変わる。
現状のgdbではその評価ができないってことだな。
×10mx -> ○10ms
>>438
CPUの命令数まで確定しているのに設計段階とはこれ如何に。
>>438
はぁ?君まともな製品開発したことないね?命令が確定して初めて、突っ込むクロックが決まるんだよ。
ちなみにロジックデバイスの周波数っていうのはMAXが決まってるだけで最低周波数に関しては
かなりの幅があるんだよ。PLLがなければ下限がないものもある。どれだけ低いクロックで済ませ
られるかが設計の腕の見せ所じゃねぇか。
442デフォルトの名無しさん:04/05/04 18:00
(・∀・)ニヤニヤ
>>436
CPUぐらい固定してくれないと話進まないよね。

>>418
> そんなことしなくても実効命令のクロックを順番に加算していけば算出できるんだよ。

安いCPUばっかり相手にしているんですね。
どかーん!
(⌒⌒⌒)
 ||

/ ̄ ̄ ̄ ̄ ̄\
| ・ U      |
| |ι         |つ
U||  ̄ ̄ ||
   ̄      ̄
もうおこったぞう
>>444
> 安いCPUばっかり相手にしているんですね。
それはそれで辛い仕事のような気がする。
>>444
なーんも知らんようだが、メモリのアドレスデコーダも外付け、
ユーザが直接触れるのは古典的なx86ベースのPentiumプロセッサを
使って設計することがどれほど面倒か、わかってるか?
ちなみにPentiumを搭載したPC以外の製品がどういう状況にあるか
わかって言ってるんだろうな?->学生ちゃんよ
実際Intelが一般に公開してる資料だけで、
gdb(じゃなくてもいいけど)に正確にクロック数える機能付けたせるのか?
無理だろ。
できるなら作ってくれよ。頭下げて使わせてもらうから。
>>447
だから、環境を先に特定しようよ

x86 で Win32 なのか、z80 で OS どころかモニタもない環境なのかで話がぜんぜん
違うんだからさ。
>>448 現状のGDBではファンクションシミュレーションしか出来ず、
実クロックシミュレーションに対応してない仕様であるということだけ。
CPUのクロックを"カウントできない"ってこととはまったく意味が違う。
>>449 だから、シミュレータのクロック数のカウントはOSには依存しないんだよ。
逆にOSのオーバーヘッドを考慮したシミュレータがあるなら教えてくれよ。
>>450
そもそも発端の >>414 からして、無条件で「CPUのクロックを"カウントできない」とは
書いてないようだが。

>>414
> CPUのモデルごとにプロファイルを持って、
> CPUの内部を完全にエミュレートしないと。
CPU ベンダ以外がクロックを正確にカウントするのは無理だ、gdb にそれを期待するな
と言ってるだけでしょ?
>>451
Win32 みたいな環境で「クロック数」をカウントするのは意味ないからやめとけ、
という話だって。

ラウンドロビンではなく優先度順でスレッドを実行する環境でも、ハードウェア
アーキテクチャによっては意味ないし。俺が最近触ってるのは、メインメモリと
DMA コントローラが同一のバスを共有していて、しかも大量の DMA 転送を
行うのが前提のハードなんだけど、こういう状況だとメモリアクセスに要する
時間が予期できないから、厳密にクロック数を割り出すより実際のデータを
流しながらパフォーマンス測定せざるをえない。

で話が戻るが >>409 は何でクロック数をカウントしたいんだ?
>>452

410、412、414、429 あたりの馬鹿のコメントをよく読め。出来ないとアフォがほざいてるだろ。
出来ないのは現状のgdbの仕様ってとだけ。
>>447=>>454アフォ決定。
以下、心ある人は無視するように。
>>454
410 は ICE の話だし、412 は OS やモニタが介在する場合には正確にカウントできないと
条件をつけてるだけでしょ。残り二つも、一般に公開されている情報だけではカウントでき
ないから gdb では無理だと言ってるに過ぎない。

>>414
> CPUのモデルごとにプロファイルを持って、
> CPUの内部を完全にエミュレートしないと。

>>429
> ただ正確な評価を行うためには CPU の外部仕様ではなく、内部仕様に関する詳細な
> 知識が必須だから

Z80 とかならともかく、命令をいったん非公開のμop に展開してたり、分岐予測を行ってる
最近の CPU だと、そのメーカー以外は正確なクロック数は出せんでしょ。
457456:04/05/04 18:53
>>455
了解。
>>445 ガキはスッコンでな。

>>453
 シミュレータでもたとえば割り込みまでシミュレートできるものがあるが、
そんな機能を多用するより実物持ってきてポートたたいてロジアナでモニタしたほうが
手っ取り早いってことは経験上わかりきってるだろ。それでもクロック数がカウントできれば
アルゴリムの優劣や、コンパイラのコード品質を知る上でプロファイラなんかを動かすよりは
るかに正確な評価が出来るってことよ。ロジック設計手がけたことあるならわかると思うが、
ファンクションシミュレートだけではきわめていい加減な評価でしかできない。フリーのHDL
コンパイラ/シミュレータが普及しないのもこのせい。
キャッシュヒットミスの見積もりに、
OSというかソフトウェアが影響する例だと、MIPSのR2000,R3000辺り。
ミスした時のハンドラはソフトウェアで記述だから。
>>458
誰も読まない長文お疲れさんです。
どうでもいいが
この話題はスレ違いじゃないのか?
>>458
その辺もプラットホームによりけりなんだよな。

小さいながらも命令キャッシュを持ってる CPU だと、コードから静的に算出される
見かけのクロック数より、関数の配置の方が効いたりする。パフォーマンスカウンタ
で命令キャッシュミスを集計しながら、手作業で関数を並び替えたヤな思い出が。
>>456
例えばXilinxははメンターにディバイスの遅延情報を公開してるし、
一般ユーザでもそれの情報を入手できる。クロックだけでなくクロックに
対する遅延評価もできる。逆にそれが出来なきゃ設計は出来ない。
技術敵に出来ないことと、仕様としてやってないことを正確に分けろってことよ。


>>460 お前には言ってることの1割もわからんだろうからごみコメント入れるな。
gdbってクロック精度まであるシミュレータの組み込みって出来ないんだっけ?
>>456
gdbではH8もサポートしてるんだが。
このスレではマルチスレッドCPUに対応した gcc しか相手にしません。
マルチスレッドCPU
>>464
できる。
デバッガ部分とシミュレータ部分は結構疎遠。
(・∀・)ニヤニヤ
>>(・∀・)ニヤニヤ
そういう意味ありげな言い方せずにはっきり指摘すればどうよ。というか的確な指摘できないんだろ。
>>471
スレ違いな話題はよそでやれってことじゃ?


>>471 gcc - gdb の話は決してすれ違いじゃないよ
「マルチスレッドCPU」とやらの話はスレ違いだろ
マルチスレッドを効率よく機能させるのにコンパイラが対応しないでどうするんだ?
>>463
> 例えばXilinxは

話の流れが理解できてないのか ?
それとも、単に知識を披露したいだけ ?
gccの最適化はIntelのやVC++よりもショボいという結論でいいよね。
しょぼいというか最適化処理そのものにバグがあるから使えない
>>476
>>463の書いてる程度のことを知識のひけらかしと思う時点でお前がエンジニアとしての常識なさ杉
>>479
唐突に「Xilinxはは」なんて書かれても、うざいだけだよ。
知らないことを書かれてしまって何もまともなコメントできずにウザイと捨て台詞吐くしかないわな。
>>477
407読め。Visual C++なんて7.1になってようやくまともになっただけ。

>>478
-O2でLinuxカーネルもFreeBSD全システムもコンパイルして大丈夫
>>482
i386しか使ったことない犬厨か。
他のarchで-O2してみろよ。バグバグだから。
>>483
そういうのを最適化そのものにbugがあると言うのか?
君は言うんだろうな。あーこりゃこりゃ
>>481
ププッ、逆切れ ?

で、なんで Intel じゃなくて、Xilinx の話を唐突に出すの ?
>>483
H8で-O2つけて問題なく使ってるよ。
>>483
それは特定のアーキテクチャ向け最適化でバグがあるだけじゃないの?
そのアーキテクチャの仕事する人は災難だが、一般化するほどのことでもない。
>>483
て言うか、どのアーキテクチャでどういうバグが書けない時点で、単なる煽りにしか見えないぞ。
日本で最初に製品にXilinxを採用した俺から言わせれば
>>463はまるでスレの流れを理解できていない勘違い野郎
>>日本で最初に製品にXilinxを採用した俺から言わせれば
当時のFPGA採用するような製品だから試作か実験機のたぐいだな。おーっとそれ製品にして金とってたって?
そりゃぼったくりでしょ。レベルの低いESレベルの製品世に出してることを公表して恥さらすなって!
>>483
gccってi386より前に68kでの実績があったことすら知らないみたいだね。
492>>489 じゃないけど。:04/05/09 00:22
>>490
別にすべての製品が常に量産品というわけじゃないだろ。
俺の所でも、公的機関や親会社が使う試作品を設計/製造することもあるよ。
買う方から見れば試作品なんだろうけど、売る方としては一応製品だからね。
そういうのはころころ仕様が変わったりするし、納期とかもシビアだからある意味ぼったくるのは当然。
だってリスクがあるからね。
悔しかったらあんたもそういう仕事見つけて、ぼったくれるようになれよな。(藁
>>490
大量生産しか知らんのか?
たった1台しか生産しない製品なんてのもめずらしくないし
そうゆう業界での話。
まぁぼったくってるのには間違いないな。
ああ>>492に先を越されてたorz
じゃ、言わせてもうおう。

>公的機関

多分NTTあたりのことを言ってるのかな?

君が試作までしか手がけてないからそれで終わりと思ってるかもしれないが、それを使って規格作るための実験したり
最終的にはメーカにおいて量産までこぎつけてそれで利益を上げられるからこそボッタくり価格でも君のところに発注してるわけよ。
まぁ、量産する前には必ず試作フェーズがあるし、試作でシビアな実装も考えずにFPGAをいじってるのはそれは非常に
楽しいが電気屋として一番醍醐味あるのはやっぱりASIC起こすことだよ。RFの実装屋とかは違うこと言うだろうけどね。

>悔しかったらあんたもそういう仕事見つけて、ぼったくれるようになれよな。(藁
自営でもやってるの?そりゃ大金手にできるだろうし、俺も大金は欲しいが経営の才能なんてないもんでな、
あくまでもサラリーマンとして一定の給料定年までもらう方でやってくよ。それでも開発設計のダイナミズムを楽しんでるよ。
↑大手のリーマンでつか?
>>495
492じゃないからNTTとか自営とかわからないが・・・

489の製品とは、”ある物”の製造装置で、携帯装置のようなシビアな実装などは不要な世界。
納品先に納めた段階では試作品のような物だが、現場で最終調整をしてそれがそのまま製品となってしまう。
そんな造り方なんでフィールドでのリコンフィギャブル性に目を付けたわけだよ。
10年以上経つけどいまだに大手メーカーで稼動してます。

スレ違いにつきこれにて終了
498デフォルトの名無しさん:04/05/09 02:05
g++3とgdbで、例外が送出されたらbreakするにはどうすればいいんでしょうか?
catch throw はサポートされていないようなんですが。

>>498 __cxa_throw あたりにブレークポイント
>当時のFPGA
電気スペックはともかくよく割れたな。
割れるというより、パッケージの背着が不十分ではがれるもの多数でびっくらこいた。Maid in Korea なんてこんなもんと思ってたらこの有様・・・鬱
>>499
できました。ありがとうございます。
catchされたらbreakは可能でしょうか?
GCC関するスレでスレ違いのframe warになってるスレはここでつか?
503デフォルトの名無しさん:04/05/09 02:57
frame workの話をしているんでつ。
>>503
ワロタ
>>501
__cxa_begin_catchじゃねーか?

egrep get_identifier $(GCC)/gcc/cp/except.cしてみ。
他にも、__cxa_call_unexpected, __cxa_end_catch, __cxa_rethrow,
__cxa_allocate_exception, __cxa_free_exception こんなん出てきます。
506デフォルトの名無しさん:04/05/09 18:24
gcc.gnu.orgdj?
>>506
つか、実体のsources.redhat.comがdj
508デフォルトの名無しさん:04/05/10 03:30
-O[0-3]それぞれで、どの-f...フラグが有効になるのかを調べる方法はありますか?
3.4.0で-O3を使うと、いたるところでInternalCompileErrorが発生するので、
その原因となる最適化フラグだけ無効にしたいのです。
man gcc
$(GCC)/gcc/toplev.cの
parse_options_and_default_flags()
>>508
-fverbose-asm でコンパイルして.sの先頭のコメントを見るってのはどうよ?
ミス。
-fverbose-asm -S だ
Globalっていうソフト見てて思ったんだけど、
なんでGCCのパースしたデータを活用しないの?
なんでGCCのアドインみたいな形で作らないの?

VC++ユーザとしてはその辺り不可思議
ようやく使えるようになったVCユーザとして不思議なんだよな。
515508:04/05/10 14:15
みなさん、ありがとうございます。
-fverbose-asm -Sで見る方法が手軽で解りやすかったです。
>>513
作者が別だから。。。
と言うかgccのパース結果(正確にはcc1等の出力)は
プリプロセッサの処理結果を元にしているから
Globalの様にソースコードの原型が必要な場合には適さない

これでいいか?
>と言うかgccのパース結果(正確にはcc1等の出力)は
>プリプロセッサの処理結果を元にしているから
>Globalの様にソースコードの原型が必要な場合には適さない

なるほど
Globalの#if〜の扱いは結構凄いぞ。
>>324
パッチ投げてあげて〜
520324:04/05/10 20:25
>>519
?
521翻訳器:04/05/10 21:31
パッチうpして〜!
522519:04/05/10 21:43
>>520
Cygwin か MinGW のメーリングリストにぽいっと
>>522が教えてあげてよ。

本家の3.5.0でmmapに依存しない場合にも対応しようとしているみたいなので
それが出るまで待って見るのもいいかも?

MinGW用にはcygwin用にでっちあげたパッチだけじゃ不十分で
fopenを"w+"でファイルアクセスしているところでこけてます。
"w+b"に変更して、fcloseする手前でエラーになっているところを
コメントアウトすると一応PCH出来るようになりますよ。
assert 関数自作して、その中でコールスタックを表示したいのですが、
コールスタックを自作するとなるとかなり面倒な事になります。
(関数の始まりと終わりと return を全部いじる必要があるので)

GCC 3.3.2 使ってるんですけど、何かいい関数とか用意されてませんかね?
素直にデバッガ使いなさい
UNIXなら、
sprintf(buf, "gdb -x scriptfile %d", getpid());
system(buf);
じゃダメかねえ。(scriptfileにはwhere)
debuggerでいいならabort()してcore dumpする。
>>525
__builtin_return_address(LEVEL)じゃダメなの?
530525:04/05/14 12:40
>>529
おおっ! リターンアドレスが取得できますね。
あとはそのアドレスがどの関数内にあるのかが分かればいいのですが...。

>>526-528
gdb の使い方よく知らないもんで...。
やっぱ勉強した方がいいですかね?
531デフォルトの名無しさん:04/05/14 14:23
527に書いてあるじゃん
>>530
nlist()
フリーのGUI,devcppが最強すぎる・・・
Dev-C++ 4.9.8.9、クラスブラウザで例外出まくりじゃね?
4.9.8.9入れてない。
早速ホムペ行ってくる
537デフォルトの名無しさん:04/05/16 17:47
>>532
> nlist()
/usr/include/linux/a.out.h:struct nlist {
これですか?なにするもの?
なんで、man nlist とかやってみようと思わないんだろうか... ?
539デフォルトの名無しさん:04/05/16 18:07
>>538
どういう意味ですか?
>>539
BSD使えってことなんだろう
> なんで、man nlist とかやってみようと思わないんだろうか... ?
犬酎なんでmanしてもみつからず。
>>541
Debianだけど、libelfg0-devを入れたら/usr/include/libelf/nlist.hがあった。
> Debianだけど、libelfg0-devを入れたら/usr/include/libelf/nlist.hがあった。
んで、なにしるものだった?
ナニゲに親切なDQN発見
nlist()じゃコールスタックは見れないと思いマスがね;-)
>525
gdbなんてコマンドいくつか覚えれば使えると思うけど。
覚えようとしないで、わざわざ手間掛かる方法を独自に
試すの事はあなたの人生に潤いを与えますか?
>>547
常にgdb上で動かせるケースばかりとは限らんだろが

アタッチもできないのか?
>>547
お肌に潤いを与えます。
>>548
Win?
>>551
マカ
>>546
こっちだろ。

>>530
> あとはそのアドレスがどの関数内にあるのかが分かればいいのですが...。
アスペクトC++でも使えよ
555デフォルトの名無しさん:04/05/16 21:32
>>554
OpenC++でも使えよ
557デフォルトの名無しさん:04/05/16 22:15
>>554
アスベストC++?
健康に悪そうだな、おい。

まあ、プログラミングよりましかも知れんが。
559978:04/05/17 00:07
>>フリーのGUI,devcppが最強すぎる・・・

どこが最強なんだか・・・
あんなの使いもんにならんよ
>>978
C言語なら俺に聞け!の次スレ立てて
むつかしい
562デフォルトの名無しさん:04/05/17 05:56
>>560
ちょっと待っていろ
563559:04/05/17 06:02
>>562
はい、待っています
>>978
>C言語なら俺に聞け!の次スレ立てて
それすらもできないようでは、C言語も(ry
>>559
コンパイラはMingwだし、何か問題でも?
ソースはフォントとかカスタマイズすれば割といける
フリーのGUI,Eclipseが最強すぎる・・・
567デフォルトの名無しさん:04/05/18 03:44
>>525
CCMALLOCというメモリーデバッガのパッケージがあって
そのなかにコールスタックを記録する機能がある。

ttp://www2.inf.ethz.ch/personal/biere/projects/ccmalloc/

このなかのcallchain.cというファイルにbacktrace()という
関数があってそれがまさにその実装。 #ifdefで中身は
x86依存バージョンと、gccの__builtin_return_addressを
使用した実装に分かれてる。 
Cygwin+gccで、バイナリーデータのみのピュアなファイルを作成したいのですが、どうしたらよいのでしょうか。

例えば、
struct SAMPLETYPE {
int a;
int b;
};
SAMPLETYPE hoge[] = { { 1,2 }, { 3,4 }, { 5,6 }, { 7,8 } };
のような、構造体の配列データ【のみ】のソースから、配列サイズと【全く同じ大きさ】のデータファイルを作りたいと思っています。

gcc ??? ??? sample.cpp
のように、コマンドラインのみでファイルを作成することはできるのでしょうか。
#include "sample.cpp"
(略)
 n = fwrite(hoge, sizeof(struct SAMPLETYPE),
 sizeof(hoge)/sizeof(struct SAMPLETYPE), f);
>>568
データファイルを作成する c プログラムを作って実行する。
571568:04/05/18 19:10
>>569
すみません、書き忘れていたのですが、
「コンパイル環境はあるが、実行環境がない」という
特殊な状況のため、fwriteが使えないのです。
ですので、コマンドラインのみでどうにかならないかなーと思いまして。
intのsize, structのpadding, byte orderが合っていれば、
ローカルの環境でやってしまえばいいでしょう。
また、違っていてもプログラムで何とでもなりますし。
573568:04/05/18 19:54
具体的な話になりますが、
1つのソース(配列データが書かれたもの)から、エンディアンが違う2種類のバイナリーデータを
つくりたいと考えています。
異なるプラットフォーム(MacとWinとか)でも、基本的にプログラムのソースコードは共通化したいので、
プログラムでエンディアンを解決するというのはやりたくないのです。

1)共通プログラムソース→それぞれのプラットフォーム用にコンパイル→それぞれのプラットフォーム用実行バイナリ
2)共通データソース→それぞれのプラットフォーム用にコンパイル→それぞれのプラットフォーム用データ

ということができればいいと考えているのですが。



>>573
>プログラムでエンディアンを解決するというのはやりたくない
じゃあ変換ICとかでも作れば?
データファイルを作成するプログラムで

> intのsize, structのpadding, byte order

に対処すればいいだろ。

というか、これgcc関係ないよ。C言語初心者スレ行きだな。
577568:04/05/18 20:08
>>575
プログラムでは解決したくないんです。
じゃあ、諦めな。
>>573
「それぞれのプラットフォーム用にコンパイル」のところで、gcc しか使えないの?
make とか perl とかは? perl でやれば?
580568:04/05/18 21:40
>>577 は私ではないですが、まあ、いっか。

構造体のサイズがかなり大きく、かつ、各メンバの構成が複雑だったり、
アラインメントなど、コンパイラ依存な部分も多いかと思ったので、
プログラムで解決することはしたくなかったのです。

また、プログラムが、ファイルから読み込んだメモリをそのまま構造体データとして
使う仕様だったので、プログラムソースと同じ結果を吐くコンパイラでバイナリデータを
作成する必要があると思い、質問しました。

とりあえず、
gcc -c test.cpp -o test.o
objcopy -O binary test.o test.bin
のように、objcopyを使うことでなんとかなりそうです。

いろいろありがとうございました。
>>580
それポインタどうするの?
変数定義が複数あっても大丈夫?
>>581
> それポインタどうするの?

典型的なのが、
char *strs[] = { "This", "is", "a", "test", };
ですね。

char strs[][5] = { "This", "is", "a", "test", };
なら、なんとかなりますが。
583568:04/05/19 01:36
>>581
>それポインタどうするの?
ポインタやリンカ解決が必要なデータは含まれない仕様なので、大丈夫でした。
構造体自体は複雑なのですが、内容はすべて数値、かつ、変数定義が1つなので、
先頭からのオフセットさえ正しければOKだったので。
では。
GCCの生成するコードの、ABI資料はありません?
ABIの何が知りたいの?
何のABIが知りたいの?

例: i386 の関数呼び出しのABI、C++ の例外ハンドリングのABI
588584:04/05/20 20:00
>>585,586
そのものズバリです、i386の関数呼出ABIです
>>587
おお!素晴らしい!読んでみますです

C関数コール時にに各レジスタの内容を、アセンブルコード側
で保証しなくてはならないのか、GCCの吐くコード側で保証
されるのか知りたかったのです。それとEBP(フレームポインタ)の扱いも~
(gcc -S foo.c で出力されるコードでは、(E)AX以外の内容も保証されていませんでしたが
VCの吐いたPEコードを逆アセンブルした時は、呼出先で保証していた気が...)

アセンブルするのは不慣れなんで、ABI仕様を読めば、
その辺りの規定が書いてあるんじゃないかと考えた次第です
どうもDebian上のGCC3.3.3 で -Os -O3 を付けた場合、
書いたコードの挙動が怪しくて...
最適化に左右されないCコードの呼出を行うには、
関数呼出規定を熟知しておこうと...
まとまった文章は読んだことないけど、i386 だと
eax, ecx, edx が関数内で壊していいレジスタ、
ebx, esi, edi が関数内で変えちゃいけないレジスタ。
これは、Windows でも *BSD でも Linux でも同じはず。

gcc-3.3.x のソースだと、gcc/config/i386/i386.h の
CALL_USED_REGISTERS の値かね。

こういうのって、Intel が決めたのかなあ?
>>589
ふつうCPUメーカが決める。大抵CPUのマニュアルに書いてあるよ。
>>589
なんてコッタ、EAX,ECX,EDXって保証する必要無いんですね..
Intelアーキテクチャマニュアル上巻見直します...

>>gcc-3.3.x のソースだと、gcc/config/i386/i386.h の
>>CALL_USED_REGISTERS の値かね。

gcc -S -fcall-saevd-ecx -fcall-saved-edx -fcall-saved-ebx foo.c

で、 指定レジスタ使用時にpush/popされるのを確認しました
-fcall-used-reg で破壊可能レジスタとなるそうです。
アセンブル時に、保護したいレジスタはスタックフレーム
にセーブしなくてはならないってことですね
まずはマニュアルを見直します
位置独立コードってなんでしょうか?(-fPIC)
いまいち意味がわかりません。
>592
その名の通り、メモリ上のどのアドレスにロードされても問題ないような
コード。通常実行効率が微妙に悪くなるが、代わりに同一のバイナリ
イメージを複数のプロセスで共有できるようになる。

DLL とか共有ライブラリを作るときに使う。
594592:04/05/23 12:54
>>593
>その名の通り、メモリ上のどのアドレスにロードされても問題ないような
>コード。通常実行効率が微妙に悪くなるが、代わりに同一のバイナリ
>イメージを複数のプロセスで共有できるようになる。
>DLL とか共有ライブラリを作るときに使う。
Thanx.
もし仮りに、共有ライブラリ生成時に-fPICしなかった場合は、
そのライブラリを使用した時に落ちてしまうんでしょうか?
.oにrelocatableって書いてないと、ldが怒るから.soは作れない。
596592:04/05/23 13:21
>>595
なるほど、ようやくわかりました。
Thanx
597592:04/05/24 00:43
現在、オーバレイ技術に関する勉強している者です。
オーバレイ技術って仮想メモリ全盛の今となっては、
もはや使用されないのですか、あるいは必要ないのですか?
それと、コンピュータの階層上(レイヤ)では、オーバーレイは
どのレイヤで実行されるのですか?
まずはあんたの言ってる「オーバーレイ技術」とは何?
GCCスレで聞くからには、LDのOVERLAY指定のこと?

使用例や必要性を知らずに勉強してるの?想像しにくい状況だな。
さしあたってあんた本人が必要としてるわけじゃないのか?

どのレイヤと聞くからには、あんたの考えてるレイヤを列挙してもらわないと。
しかし、どんなレイヤがあるかは、マシン、システム、ソフトごとで様々なはずだ。
599デフォルトの名無しさん:04/05/24 01:33
どなたか、-fasynchronous-unwind-tables って何するものだか教えてくださいませんか?
601592:04/05/24 02:09
>>598
>まずはあんたの言ってる「オーバーレイ技術」とは何?
>GCCスレで聞くからには、LDのOVERLAY指定のこと?
そのとおりです。

>使用例や必要性を知らずに勉強してるの?想像しにくい状況だな。
わからないからこそ調べてるんです。

>さしあたってあんた本人が必要としてるわけじゃないのか?
さしあたって必要ではないです。でも、さしあたらないとだめなんでしょうか?

>どのレイヤと聞くからには、あんたの考えてるレイヤを列挙してもらわないと。
>しかし、どんなレイヤがあるかは、マシン、システム、ソフトごとで様々なはずだ。
様々なレイヤで存在することすらわからなかったものですから。
マシンとシステムの区別がよく分からないんですが。
レイヤがソフトであるなら、やはりローダがオーバレイ作業をするのが一般的なんですか?
>597
オーバーレイが有効に使えるのは、

1 主記憶が狭い
2 仮想記憶がない
3 主記憶と比べて大きな二次記憶がある (これは read only のことが多い)

という場面。小さな RAM と、それより大きめの ROM で構成されてるシステムだと
使い道があるが(ゲーム機とか)、最近はハードウェア資源が豊富になってきて
るから、使う場面は少なくなってきてるんじゃないかなぁ。

メモリが増える割合に比して、コード量の増加って緩やかだから。あと、オーバーレイ
で解決せずに実行時リンク (Win32 だと DLL, UNIX なら *.so) で対応する方法も
ある。こっちの方が柔軟。
603592:04/05/24 02:51
>>602
ありがとうございます。

>1 主記憶が狭い
>2 仮想記憶がない
>3 主記憶と比べて大きな二次記憶がある (これは read only のことが多い)
なるほど。
これを見てて思いついたのは、組み込み系で使われる可能性がありますね。

>メモリが増える割合に比して、コード量の増加って緩やかだから。あと、オーバーレイ
>で解決せずに実行時リンク (Win32 だと DLL, UNIX なら *.so) で対応する方法も
>ある。こっちの方が柔軟。
オーバーレイで解決せずに実行時リンク?動的ライブラリのことですかね。

そもそもgcc環境では、オーバーレイor実行時リンクの作業はカーネルがするって事?
オーバーレイの言葉の定義をしてくれー
605592:04/05/24 03:57
>>604
>オーバーレイの言葉の定義をしてくれー
自分がいろいろ調べて見てわかっているオーバーレイの定義は、
「少ないメモリ上で、ある関数をコールする度にオーバレイマネージャ等が
実行ファイル等から読み込み、メモリに再配置して効率的にメモリ割り当てを扱う事」
という認識でいます。間違ってますでしょうか?
>>603
> そもそもgcc環境では、オーバーレイor実行時リンクの作業はカーネルがするって事?

gccは中立です。
>605
> 「少ないメモリ上で、ある関数をコールする度にオーバレイマネージャ等が
それは GNU LD で実現してるオーバーレイとは違うぞ。

関数呼び出しの度に自動的にファイルを読み込むのではなく(それは遅すぎ)、
手作業で

 これから foo(), bar() を読み込むから、foo(), bar() を含むコードを
 メモリ上に読み込み

 完了後に foo(), bar() をコール

とする。

オーバーレイを有効に使うためには、プログラムを同じタイミングで呼ばれる
可能性がある複数の部分に *手作業で* 分割し、さらに読み込みタイミングを
自分で制御する必要がある。

メモリ上に読み込んでない関数をコールすると、プログラムが実行時に
吹っ飛ぶか、もしくはメモリ上に展開されている別のコードを実行して、
謎の挙動を示すことになる。
>>605
> ある関数をコールする度にオーバレイマネージャ等が
> 実行ファイル等から読み込み、

これはある実装の機構であって、オーバーレイの定義ではないのでは?

> メモリに再配置して

ほとんどの場合、実行時に再配置もしないのでは?
再配置できるくらいなら"OVERLAY"する必要がないからね。

メモリ上のある領域をモジュール同士で共有して、排他的に利用するのが、
(たぶんあなたの言っている)オーバーレイだと思います。

オーバーレイをgccで行う方法の話じゃないんならば、
くだ質にいった方がいいんじゃない?
609592:04/05/24 18:21
>> 「少ないメモリ上で、ある関数をコールする度にオーバレイマネージャ等が
>それは GNU LD で実現してるオーバーレイとは違うぞ。
え、そうなんですか。もう一度GNU LDのオーバーレイを調べてみます。

>オーバーレイを有効に使うためには、プログラムを同じタイミングで呼ばれる
>可能性がある複数の部分に *手作業で* 分割し、さらに読み込みタイミングを
>自分で制御する必要がある。
これは、そのプログラム作成者がその作業をするってことですか?

>これはある実装の機構であって、オーバーレイの定義ではないのでは?
すいません。オーバーレイの定義についてまだあやふやでした。

>メモリ上のある領域をモジュール同士で共有して、排他的に利用するのが、
>(たぶんあなたの言っている)オーバーレイだと思います。
その通りです。

>オーバーレイをgccで行う方法の話じゃないんならば、
>くだ質にいった方がいいんじゃない?
そうですね。もう一度調べなおします。

Thanxでした。>>607,>>608
> >>605
> > ある関数をコールする度にオーバレイマネージャ等が
> > 実行ファイル等から読み込み、
>
> これはある実装の機構であって、オーバーレイの定義ではないのでは?

昔アセンブラで書いたプログラムを自動的に↑とするリンカ使ったことある。
L80の互換リンカで、P?L80って名前…
LINK86互換のもあったはず。
>>608
> オーバーレイをgccで行う方法の話じゃないんならば、
> くだ質にいった方がいいんじゃない?

って書いたけど、
Linker && Loader
http://pc5.2ch.net/test/read.cgi/tech/1033403294/
ってスレがあるね。過疎スレだけどね。
612!599:04/05/24 19:30
>>600
>http://gcc.gnu.org/ml/gcc-patches/2001-10/msg00800.html
↑をざっと読んだけど-fasynchronous-unwind-tablesの説明がないような気がする。
613592:04/05/24 19:43
>>611
実はこの本を読みながら↓質問してました。
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06437-9
リンカ&ローダって難しい....使って天国、作って地獄って奴ですか。
関連ドキュメントが少なすぎるぅぅぅ(泣
615612:04/05/24 19:58
>>614
サンク
616592:04/05/24 20:27
>>611
ここ↓見たけど途中から誤爆スレみたいなんですけど..sigh
Linker && Loader
http://pc5.2ch.net/test/read.cgi/tech/1033403294/
>>613
この本はベストセラーだね。いい本だ。翻訳は良くできてるのかな?
この本を読んで全部理解するにはかなりの基礎知識を必要とするよ。
>>616
あっち移ったら、あっちでお付き合いするけど
こっちはスレ違いだからね。
>>613
>関連ドキュメントが少なすぎるぅぅぅ(泣
確かに少ないな。特に日本語のドキュメントで探すのは皆無に近い。
欧米では関連ドキュメントを探すとちゃんと見つけ出せるけど日本特有の現象なのかわからんが、
ある技術(例えばLinker & Loader)を使っているなら、その概念や動作や設計とかの資料があってもいいはずなのに、
「車輪の再発明なんかやるんじゃない」的な考えで、その関連資料を作成すること自体しなくなるのは
とてもよくない現象だと思う。
長々とスマソ。
GCCは(・∀・)イイ!
ヽ(゚∀゚)ノGCCバンザイ!!!!
最近、typeofが手放せなくなりつつあるんだが、
これなんとか標準C++の範囲で実現する方法はないの?
ちょっとすれ違いか。
あの、すいません
gccのコンパイルオプションを紹介しているサイトを
教えていただけませんか?
>622
info 読め
>>622
googleでgcc infoを検索すれば、gccのinfoの日本語訳が見付かることだろう。
>>614も読めよー
隠しオプション

-fno-gates

MSVC用のpragmaを発見するとそのソースファイルを削除する
-fno-stallman
GPL/LGPLライセンスのソースファイルを(ry
しばらくは3.3をずっと使い続けるかな
昔のgccでpragma使うとゲームを起動するって本当だろうか……。
hack -> rogue -> ハノイの塔
ってやつか。
オレも気になる。
今gcc-1.42落としてみたらcccp.cに例のコードがあったよ。
execってオーバーレイみたいなもんだよね??
でもinfoの説明と食い違ってるoptionあったりするしな。>gcc
info読んでも変だと思ったらsource読んで確認するのを勧める。
>632
なにをもって「みたい」とするかに依るが。内部実装は天と地ほど違う。
>>631
マジなんだ……。さんきゅ。俺も落としてみるか。
>>635
俺も思わず確認してしまった。
1.42の頃はstallmanがガンガンいじってたのねぇ。
あるソースを見てたら以下のコードがありました。
これってどういう意味ですか?
"!!"って使用できましたっけ?

if (!!var1 == !!var2)
 return 0;
>>637
C言語くだ質スレが適当だと思うが一応。

!e → (e) ? 0 : 1
!!e → (e) ? 1 : 0

つまり!!は、0(false), それ以外(true)の0, 1への正規化。
その使い方だと、var1とvar2の(C言語的)真偽が同じならです。

flag | (!!(式) << 4)

なんてのは良く使います。
>>637
素直にこう書いた方が判りやすいと思うのだが・・・

if(var1 && var2)
 return 0;

>>639
それだと
var1 が 0 かつ var2 が 0 の場合に動作が異なる。
>>639
本当にプログラマですか? (w
if (!var1 == !var2)
return 0;
これでいいような気がする。
違うのかな?
>>642
本当にプログラマですか? (w
>>643
プログラマじゃないけど本当に分からない。
違い教えて。
>>644
じゃあプログラマになれるよう、勉強しようね(w
>>645
いいから教えろ
>>645
おれも分らない。int型みたいな0(false)とそれ以外(true)の
{0,1}への正規化なら、>>642でいいように思うんだけど。
>>642 はあってるぞ。
自身を持て。
>>647
真偽が逆転するので、正規化目的なら!!だろう。
ただ、件の場合は比較しているだけなので、真偽逆でも問題なし。
>>645
早く教えてください

if (!var1 == !var2)
if (!!var1 == !!var2)

この違いを教えてください。漏れには真偽が逆になっていて
見難いから、!!としているだけにしか見えません。
ああ、正規化、という意図を表現したいなら!!がいいね
でもそれならマクロか何かにしてほしい
>>651
単にあなたが見慣れてないだけじゃない?
!!というのは特徴的だし昔から使われているから、
イディオムとして受け入れる方が変なマクロ定義するよりいいと思うけど。

俺は (var?1:0) をするイディオムとして !!var を認識しているので、
if (!var1 == !var2)
よりは
if (!!var1 == !!var2)
の方が素直に読める。
>!!というのは特徴的だし昔から使われているから、

はつみみです:-)
652みたいなのがロートルって呼ばれるようになるんだろうナァ
655211:04/05/28 18:44
gcc-3.4.0 で、 gcc ディレクトリで grep -n '!!' * とかやった結果、

c-decl.c:3634: constp = !! (specbits & 1 << (int) RID_CONST) + TYPE_READONLY (element_type);
c-decl.c:3636: = !! (specbits & 1 << (int) RID_RESTRICT) + TYPE_RESTRICT (element_type);
c-decl.c:3638: = !! (specbits & 1 << (int) RID_VOLATILE) + TYPE_VOLATILE (element_type);
c-decl.c:3639: inlinep = !! (specbits & (1 << (int) RID_INLINE));
c-parse.c:1854:#define YYRECOVERING() (!!yyerrstatus)
collect2.c:824: no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
cppexp.c:320: result.unsignedp = !!(type & CPP_N_UNSIGNED);
cppexp.c:407: overflow = !!(num.high >> (PART_PRECISION - shift));
cppexp.c:593: result.unsignedp = !!unsignedp;
cppfiles.c:629: if (CPP_OPTION (pfile, deps.style) > !!sysp && !file->stack_count)
cppfiles.c:742: bool print_dep = CPP_OPTION (pfile, deps.style) > !!sysp;
cppspec.c:169: + !!o_here + !!lang_c_here + !!lang_S_here;
cpptrad.c:714: bool recursing = !!(node->flags & NODE_DISABLED);
expr.c:7398: return !!(the_word & bitmask); */
gcov.c:818: arc->on_tree = !!(flags & GCOV_ARC_ON_TREE);
gcov.c:819: arc->fake = !!(flags & GCOV_ARC_FAKE);
gcov.c:820: arc->fall_through = !!(flags & GCOV_ARC_FALLTHROUGH);
gengtype-yacc.c:429:#define YYRECOVERING() (!!yyerrstatus)
hard-reg-set.h:95: (!!((SET) & (HARD_CONST (1) << (BIT))))
hard-reg-set.h:125: (!!((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT]\
ra.c:431: something_spilled = !!WEBS(SPILLED);
real.c:3043: encode_ieee_extended (fmt, buf+!!FLOAT_WORDS_BIG_ENDIAN, r);
real.c:3138: decode_ieee_extended (fmt, r, buf+!!FLOAT_WORDS_BIG_ENDIAN);
一部、みやすいように、削りましたが、ほんとにろーとるなんでしょうか???
たったそんだけ?
もちつけ

ロートル呼ばわりされかねないのは、
「昔から使われているから、イディオムとして受け入れろ」
という下りのところだろ。
ロートルって何だと思ったら
中国語で老人の事なんだ(;´Д`)
!!x って、 x != 0 と全く同じ(xが整数型の場合)でしょ?
正規化する場合でも、x != 0 が使われる場合の方が多いんじゃないかな。
少なくとも、俺はそうしてる。
俺はその方が読み易い(理解しやすい)し。
君は、ね。
一般的に目的がはっきりしている方が読み易いと言える

目的が0との比較なのか正規化なのかよく考えて使い分けるべし
662637:04/05/29 11:37
>>638-660
また一つ賢くなりました。ありがとうございました。
663デフォルトの名無しさん:04/05/29 14:26
D言語ってサポートされるの?
外国人と仕事するようになって どっちも英語が出来ないので
仕方なくコードで会話するんだが 相手に意図を伝えられるコードを
意識して書くようになると それだけでバグって減るモンなんだね
>>663 来週あたりにはサポートされます
#define fuck head
667:04/05/29 14:38
ダミアソ
fuck head って、どじなやつという訳なんだな。
669652:04/05/29 21:33
うーん、ロートルと言われればロートルなのかも。
Cとは12のころからかれこれ15年くらいつきあってるからなあ。
670ロートル2号:04/05/29 23:14
>>655
そう言えば、!!を始めて見たのはgccだった。
gcc-1.2くらいだったか?
!!についての話題は直接gccに関係ないので、他のスレでやってくだされ。
!!うるせーぼけ!!
まだ、夏休みじゃないよな。
674俺も含めてな。:04/06/02 18:40
最近は、常時夏休みみたいな奴がいるからな。
675デフォルトの名無しさん:04/06/02 23:50
MinGWとこれの配布元が提供しているbinutil、gccのソースコードと
レッドハットのnewlibのソースコードをターゲットM68000でコンパイル
して、クロスコンパイル環境構築できますか?
(やったことのある人がいれば教えてください)

H8のクロスコンパイル環境の情報は多いんですが、M68000の
情報がほとんどないもので。

よろしくお願いします。
ttp://www.pcs.usp.br/~jkinoshi/bs/b030722.html

--target=m68k-coff か --target=m68k-elf を指定すれば
できるじゃねえの?
>MinGWとこれの配布元が提供しているbinutil、gccのソースコードと
Win32上でbuildしてる奴ほとんどいねぇと思う。
オレがやってみた感想。
だってあそこのbison使い物にならんし、
素直にコンパイル通すだけでもツール類自力でmakeしないといかんし。
678675:04/06/03 00:19
>>676

情報サンキューさんです。
多分これと同じ要領でコンパイルできそうですね。

MinGWというのが気になっているんですが、実際にやってみれば
どうなのかわかるかな?
679675:04/06/03 00:21
>>677

そうですか。クロスコンパイル環境を整えるにはやっぱり
UNIXやLinuxつかったほうがいいんですかね...。
>>679
cygwin でもいけるんじゃない?
bison1.8が改悪なんだなぁ。Win32上でのmake失敗の原因はこれだし。
スケルトンファイルをsendmail.cf化しようなんて何考えてんだか。
設計を改めず拡張してどんどこ改悪していくのはGNUの悪い癖。
682どんどこ:04/06/03 12:51
どんどこ
>>675
聞くばっかりじゃなくて、実際にやって見れば
痛い目にあった方がスキルが上がる気がするけど
>>681
>bison1.8が改悪なんだなぁ。Win32上でのmake失敗の原因はこれだし。
「最初からWinなんて眼中無かった。」に500000カノッサ
685675:04/06/04 00:28
>>683

そうですね。実際にやってみたほうがいいですね。
週末になれば時間が確保できるのと、試せる環境が
つかえるようになるのでやってみようと思います。

MinGWでだめだったらCygwin、それでもだめだったら
最後の手段でLinux...といきたいところですが、色々な
都合でそんなに時間がかけられないかもしれないです。

本当は市販のコンパイラを買ってもいいんですが、
gccを使うのはスキルアップも目的です。本当は
少し時間をかけてチャレンジしたいんですけどね。
漏れも最近MinGW相手にクロスコンパイラ編成しますた。
ぶっちゃけ、イバラの道ですた。
Cygwinと比べてコミュニティの規模が小さいせいか、自前で解決しなきゃ
ならんネタが多いんですよ。
MinGWのダウンロードページから落とせるtar玉には大抵MinGW用のパッチが
あたってるので、迂闊にGNUのページとかから落としてくるより楽なんだけど、
それでもビルドできないシチュとかが結構ある。
特にクロスコンパイル編成だと、configureが混乱するのか、時々わけのわからん
ヘッダを持ってこようとしたりして、激しく混乱が加速するです。
ビルド済みパッケージには、大抵ポーティングリスト(元のパッケージから
何を変えたか)が添付されてるので、使わなくても落としてくるのが吉。
/usr/doc以下にドキュメント追加されます。
gdbがシリアル接続受け付けなかったり、明らかに消しちゃいかん機能を
消して無理矢理ビルド通してたりするので、いまいち信用ならないけど。

漏れ的に困ったのは、gccがfork等posixの関数を要求してくるところとか。
collect2とかが引っかかるので、Makefileから外してしまうので一応解決するます。
687675:04/06/04 01:21
>>686

本家MinGWのメーリングリストでも
「collect2でひっかかるけどどうすんの?」
「collect2はMinGWのパッケージには公式に入ってないよ。
これをどうするかどうかは過去に何回か議論しているからログ読め」
というやりとりがあったようですね。

あの、ついでにmakefileの修正箇所なぞを大雑把に
晒してもらえると大変助かるんですが。
だめですかね?
688675:04/06/04 01:40
ああ、英語の意味がやっといまわかりました。
過去ログ読めってことか。

うっかり、collect2が公式パッケージに入っていない
理由について述べられているんだと勘違いしてしま
いました。
まったく関係ないが、C++ の場合、
bool operator!() const をクラスに定義して、
if( !!obj ) と使うことがある。

>>689
メンバ関数ポインタを使う手もある。これだと整数型への暗黙の型変換が
できないから、ケアレスミスを防げるし。

class foo
{
  void dummy();
public:
  typedef void (foo::*unspecified_bool_type)();
  operator unspecified_bool_type() const {
    return xxx ? &foo::dummy : NULL;
  }
};
>>690
ところでなんでC++ってNULLを予約後にしなかったんだろう。
>>691
×予約後
◯予約語
null(NULLではない)を予約語にする動きはまだある。
694デフォルトの名無しさん:04/06/05 12:17
gccのオプション-fomit-frame-pointerについて質問です.
gccのマニュアルを見ると
(例えば,http://gcc.gnu.org/onlinedocs/gcc-3.3.3/gcc/Optimize-Options.html#Optimize%20Optionsなど)
最適化オプション-Oを指定すると,-fomit-frame-pointerは自動的に指定されるように思われます.
しかしながら,世のgcc向けのソースを見ると,
最適化オプション(-O,-O2,中には-O6なんてのもある.効いているのか?)と-fomit-frame-pointer
を併せて指定している例を多々見掛けます.(例えば,Linuxカーネルのソースなど.)
これは,一体どういうことなんでしょう?
プログラマの勘違いなんでしょうか.
あるいは,昔は-Oが-fomit-frame-pointerを自動的に指定していなかった時期とかあるんでしょうかね?
ご存知の方いらっしゃいますでしょうか?
環境依存でそうだった
696695:04/06/05 12:47
>>694
つーか,お前さんの示してるgcc-3.3.3のマニュアルでも,まだ,環境依存じゃん(w
>on machines where doing so does not interfere with debugging
ダマサレター
697694:04/06/05 12:50
>>695
x86では,-fomit-frame-pointerを有効にするのに
-Oと別に,明示的に指定する必要があるのでしょうか?
>>694
> 最適化オプション-Oを指定すると,-fomit-frame-pointerは自動的に指定されるように思われます.

??? 英語力がないのか ?
だったら http://www.excite.co.jp/world/english/ とか使えよ。

英) -O also turns on -fomit-frame-pointer on machines where doing so does not interfere with debugging.
日) -Oは、さらにそうすることがデバッギングに邪魔をしない機械上で―fomit構造ポインターをつけます。
>>697
オプションの指定を最適化したいのか ?

フレームポインタ付けたくないなら指定すればいいと思うが。
700694:04/06/05 13:09
>>698
あぁ,すみません.
上の方にはそう書いてありますね.
もっと下の-fomit-frame-pointerの項目の
> Enabled at levels -O, -O2, -O3, -Os.
ばっかり見てました.
697の質問については,多分,
-Oと-fomit-frame-pointerを併記するソースが多いということが
その答えを物語ってるんでしょうね.
701694:04/06/05 13:18
>>699
> オプションの指定を最適化したいのか ?
はい.
CPUはPentium3で,今んとこ,
-O3 -march=pentium3 -msse -mfpmath=sse -fforce-addr -funroll-loops -fomit-frame-pointer
を付けてコンパイルしています.
やっているのは浮動小数点演算中心の計算です.
他にお勧めとかあったら,是非お教えて下さい.
>>701
厳密なエラー処理が必要ない場合は -ffast-math も利く。
703694:04/06/05 19:31
>>702
-ffast-mathはなんとなく恐くて敬遠してましたがこの際理解しようと思います.
-ffast-mathで設定されるオプションのうち,いくつかが良く分かりません.
オプションによって結果が変わる短い例を示してもらえないでしょうか?
以下はだいたい分かります.
-fno-math-errno: errnoが設定されなくなる.
(e.g.)
$ cat test.cpp
#include <iostream>
#include <cmath>
#include <errno.h>
using namespace std;
int main () {
double d0 (-1);
cout << sqrt (d0) << " " << flush;
perror (NULL);
return 0;
}
$ g++ -O test.cpp; ./a.out
nan Numerical argument out of domain
$ g++ -O -ffast-math test.cpp; ./a.out
nan Success

-funsafe-math-optimizations: 計算精度がユーザからはコントロール不能な最適化が行なわれる.

以下がいまいちよく分かりません.
-fno-trapping-math
-ffinite-math-only
-fno-signaling-nans
(因みに私の環境はg++ 3.3.3 on Linux 2.4.26)
>>703
-fno-trapping-math
IEEE 754 では、演算結果が非数 (0/0 とかの場合) や無限大など「ふつー
じゃない数」になった場合に割り込みを発生させ、事前に登録した割り込み
ハンドラに制御を移すことが可能になっている。

この割り込み処理がないことを前提にして最適化を行う。

-ffinit-math-only
演算結果が非数や無限大にならないことを前提にして最適化を行う。

-fno-signaling-nans
これは -fno-trapping-math のサブセットで、非数の場合に割り込みが
発生しないことを前提とする。無限大などでは割り込み発生させても OK。
705694:04/06/05 21:21
>>704
丁寧なレスをどうもありがとうございます.
> -fno-trapping-math
> -fno-signaling-nans
これ,UNIXだとシグナルで通知されるんですよね.たぶん.SIGFPEだと思い,
#include <iostream>
#include <signal.h>
using namespace std;
void func (int number) {cout << "SIGFPE occured " << number << endl;}
int main ()
{
if (signal (SIGFPE, func) == SIG_ERR) exit (1);
double d0 (0), d1 (0);
cout << (d0 / d1) << endl;
for (;;)
pause ();
return 0;
}
ってなコードを書いてみましたがfuncが呼ばれません.
まぁ,いずれにしても事前に割り込みハンドラを登録したプログラムでない限り,
-fno-trapping-mathの有無で動作が変わることはないということですよね.

> -ffinit-math-only
> 演算結果が非数や無限大にならないことを前提にして最適化を行う。
これがまだ分かりません.
結果が変わってくるような例ってないですか?
706694:04/06/05 21:26
>>705がなんか変なコードになっている.
for (;;)は抜いて下さいまし.
>>705
> まぁ,いずれにしても事前に割り込みハンドラを登録したプログラムでない限り,
> -fno-trapping-mathの有無で動作が変わることはないということですよね.
確か OS によりけりだった気がするけど、694 の環境ではその理解で問題ない
かと。あとシグナルハンドラ中で呼べる関数には厳しい制約があるので、stream
とか操作すると不味いです。念のため。

> 結果が変わってくるような例ってないですか?
b = a + 1.0 - 1.0;

a が極めて大きな数の場合 a + 1.0 の段階で +Inf になってしまい、
結果的に b = Inf ( != a) ってケースがありえる。無限大にならない
と仮定すれば a = b; と最適化しちゃって OK。
708675:04/06/06 16:15
みなさんのアドバイスのおかげで無事、M68Kクロスコンパイル
環境が構築できました。ありがとうございました。

どうやらcollect2問題はMinGWで配布されている3.4系には
パッチがあたっているようです。

その他にも色々問題はありましたが、基本的にMinGWの
メーリングリストとgoogleで解決しました。

bisonやflex、gettextやlibiconvといったものは、
http://sourceforge.net/project/showfiles.php?group_id=23617
からダウンロードしました。
(これらをインストールするときはインストール先のパスにスペースが
入っていると駄目なのにはまりましたが)

709694:04/06/06 16:28
707様,レスをどうもありがとうございます.
>>704
> IEEE 754 では、演算結果が非数 (0/0 とかの場合) や無限大など「ふつー
> じゃない数」になった場合に割り込みを発生させ、事前に登録した割り込み
> ハンドラに制御を移すことが可能になっている。
環境依存の話になってくるかも知れませんが(もし,他に適切なスレがあれば誘導をお願いします.),
このような数学的例外が起こった場合に実行する割り込みハンドラって
どうやって登録するのでしょうか? ご存知の方いらっしゃいますでしょうか?
ぐぐってみたらmatherrってのがそれっぽい感じがするのですが,使い方が分かりません.
man feenableexcept
C99 floating point rounding and exception handling
711694:04/06/06 16:42
>>707
> b = a + 1.0 - 1.0;
> a が極めて大きな数の場合 a + 1.0 の段階で +Inf になってしまい、
> 結果的に b = Inf ( != a) ってケースがありえる。無限大にならない
> と仮定すれば a = b; と最適化しちゃって OK。
ん〜,どんな類の最適化が起こりうるか,雰囲気は伝わってきたんですが,この例ですと,
「a が極めて大きな数の場合 a + 1.0 の段階で +Inf になってしまい」
これがそもそも「無限大にならないと仮定」するしないに関わらず,
浮動小数点数では起こり得ないのではないでしょうか?
aが極めて大きな数の場合に,a+1.0は丸められてしまうので上記仮定に関わらず常にb != Inf ( == a)
になると思います.試しに,以下のようなものを書きました.冒頭のoutput_as_bitsはビットダンプする関数です.
#include <iostream>
#include <bitset>
template <class T> std::ostream & output_as_bits (std::ostream &p_os, const T &p, bool ascending_order = true) {
bitset <sizeof (T) * 8> p_bit; const char *pp (reinterpret_cast <const char *> (&p)); char byte_digit (1);
for (size_t i (0); i < p_bit.size (); ++ i) {
p_bit.set (i, static_cast <bool> (*pp & byte_digit));
if ((i + 1) % 8) byte_digit <<= 1;
else {byte_digit = 1; ++ pp;}
}
if (ascending_order) {
p_os << "L"; size_t i (0);
while (i != p_bit.size ()) {p_os << p_bit.test (i); ++ i;} p_os << "H";
} else {
p_os << "H"; size_t i (p_bit.size ());
do {-- i; p_os << p_bit.test (i);} while (i != 0); p_os << "L";
}
return p_os;
}
(続く)
712694:04/06/06 16:43
(711の続き)
int main () {
double d0 (1);
while (true) {
d0 *= 2; if (d0 == (d0 + 1)) break;
}
output_as_bits (std::cout, d0) << " " << d0 << std::endl;
output_as_bits (std::cout, d0 + 1) << " " << (d0 + 1) << std::endl;
return 0;
}
結果:
L0000000000000000000000000000000000000000000000000000111111000010H 1.84467e+19
L0000000000000000000000000000000000000000000000000000111111000010H 1.84467e+19
>>711
確かに。+1.0 ではなく + FLT_MAX / 2 ぐらいにしたほうが現実的だったかも。
714694:04/06/06 17:13
本当はこれで結果に差が出てくれば,納得するんですが....
$ cat test.cpp
#include <iostream>
#include <bitset>
#include <cmath>
using namespace std;
typedef double Type;
template <class T> std::ostream & output_as_bits (std::ostream &p_os, const T &p, bool ascending_order = true);
const Type limit (numeric_limits <Type>::max ());
const Type half_of_limit (limit / 2);
template <typename T> T func1 (T p) {return p + half_of_limit;}
template <typename T> T func2 (T p) {return p + half_of_limit - half_of_limit;}
int main () {
Type d0 (limit); Type d1 (func1 (d0)); Type d2 (func2 (d0));
output_as_bits (cout, d0) << " " << isinf (d0) << " " << d0 << endl;
output_as_bits (cout, d1) << " " << isinf (d1) << " " << d1 << endl;
output_as_bits (cout, d2) << " " << isinf (d2) << " " << d2 << endl;
return 0;
}
$ g++ -O2 test.cpp; ./a.out
L1111111111111111111111111111111111111111111111111111011111111110H 0 1.79769e+308
L0000000000000000000000000000000000000000000000000000111111111110H 1 inf
L1111111111111111111111111111111111111111111111111111011111111110H 0 1.79769e+308
$ g++ -O2 -ffinite-math-only test.cpp; ./a.out
L1111111111111111111111111111111111111111111111111111011111111110H 0 1.79769e+308
L0000000000000000000000000000000000000000000000000000111111111110H 1 inf
L1111111111111111111111111111111111111111111111111111011111111110H 0 1.79769e+308
う〜む.同じだ.最初の実行結果の3行目がinfであって欲しいんですが.

>>710
ありがとう御座います.学ぶ足掛かりができました.
>>714
x87 だと FPU は 80bit あるののに double は 64bit だから、マジメに
計算しても FPU 内部ではオーバーフローしないような気がする。
FPU を 64bit モードにするか拡張精度浮動小数点数 (long double)
で試してみては?

あと gcc はマニュアルに書いてあることが完全に実装できてないことも
あるので、これで動作に疑問があるようなら gcc のソースを読んだ方が
良いかも。
716694:04/06/06 17:40
>>715
> 拡張精度浮動小数点数 (long double)で試してみては?
714の冒頭のtypedef double Typeをtypedef long double Typeにしてやってみました.
$ g++ -O2 test.cpp; ./a.out
L111111111111111111111111111111111111111111111111111111111111111101111111111111100000000000000000H 0 1.18973e+4932
L000000000000000000000000000000000000000000000000000000000000000111111111111111101111111111111101H 1 inf
L000000000000000000000000000000000000000000000000000000000000000111111111111111101111111111111101H 1 inf
$ g++ -O2 -ffinite-math-only test.cpp; ./a.out
L111111111111111111111111111111111111111111111111111111111111111101111111111111100000000000000000H 0 1.18973e+4932
L000000000000000000000000000000000000000000000000000000000000000111111111111111101111111111111101H 1 inf
L000000000000000000000000000000000000000000000000000000000000000111111111111111101111111111111101H 1 inf
今度は,両方とも溢れちゃいました.
どうやらこの例では-ffinite-math-onlyによる,演算順序の変更は行なわないようです.
まぁ,でも-ffinite-math-onlyが何をする可能性があるかは理解できました.ありがとう御座いました.
(良い例が思い付いたらお教え下さいね.)

> これで動作に疑問があるようなら gcc のソースを読んだ方が
> 良いかも。
そうですね.
717デフォルトの名無しさん:04/06/09 05:34
サンクスコ
719デフォルトの名無しさん:04/06/11 00:03
gccの最適化オプションで-march=pentium4としたら-mmmx、-msse、-msse2も自動的にONになるんですか?
それはさすがにならんだろ
cmovとかは使うだろうけど
なる
722デフォルトの名無しさん:04/06/11 00:55
>>720-721
どちらが正しいのですか?
-fverbose-asm
gcc-3.3.1
gcc/config/i386/i386.c
{"pentium4", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2 |
PTA_MMX | PTA_PREFETCH_SSE},

バージョンによっては違うかもしれないので
ttp://gcc.gnu.org/cvs.html
で確認してみては?
725719:04/06/11 19:20
>>722-724
なるほど、ソースコード読んでみるという手がもっとも確実ですね。
ありがとうございます。
>>721 「なる」ってなるほどのことかと思ったよ。
なる
で、結局の所どーだったのよ。
「バージョンによって違うかもしれない」
その日の天気による
晴れの日はコンパイルしよう
732デフォルトの名無しさん:04/06/12 22:05
WindowsXPのコマンドプロンプトから
c:\cygwin\bin\g++ ../test.cpp
(c:\cygwin\bin\g++ ..\test.cpp)
(c:\cygwin\bin\g++ ..\\test.cpp)
としても
cc1plus: ../test.cpp Not Such File or Directory
とでてコンパイルできないのですが、何がいけないのでしょうか?
以前はこれでできていたはずなのですが...。
733694:04/06/12 22:11
>>732
c:\cygwin\bin\ls ..
は?
734732:04/06/12 22:41
>>733
動きました。
実行しているディレクトリ名に日本語が含まれていたのが
原因だったみたいです。
>>734
今の最新版だとそうなる。1.5.9-1までならOK。
736735:04/06/12 23:54
おっと。cygwinのバージョン、な。
737732:04/06/13 01:29
>>735
>>733,735さん ありがとうございます。
なるほどそういうことでしたか。

もうバージョンあげちゃったんで
次期バージョンでは直っててホスィ
構造体の配列がグローバル変数で定義されているとして、別のソースファイル中で
その配列を参照する場合には、まずそのファイル中で配列をextern宣言しますよね。
このとき、extern struct foo[3]と配列の個数を明示してやらないと、
参照した時点でSIGSEGVを食らいます。(少なくともgcc-3.2.2の場合)

単にextern struct *fooでも良いと思ってたんですが、これってgcc-3.2.2のバグ
ですか、それともCの仕様ですか? 少なくともextern struct *fooでもコンパイル
オプションに-Wallとか付けても問題なく通ります。
>>738 ここにもポインタ変数と配列を混同している人が。。。
>>738 頭の悪い脊髄反射レスは要らない。
extern struct foo[]としても、SIGSEGVを食らう。
なぜ、構造体のアドレスが正常に渡されないかが問題なのだ。

例えば、配列中の構造体の大きさが、実際に宣言されるまで不定で
あるような場合(構造体内部にchar *のような文字列のポインタを含む場合)、
コンパイラは間違ったポインタを渡してしまう可能性が考えられる、
とかそういうふうな答えを期待した。
C言語スレに池
答える知識がないなら黙ってればいいのに。
>>740
煽るんなら、アンカーぐらいちゃんとしないと、自分で自分が「頭の悪い脊髄反射」とカミングアウトしてることになってるぞ。(藁

それはそれとして、

extern struct foo[3];
extern struct *foo;
extern struct foo[];

でコンパイルエラーにならない、GCC のバージョンを教えてくれ。

手元の、2.95.4 は全部シンタックスエラーにしやがるからな。(藁
>>743
gcc-3.2.2と書いてあるが…。
745sage:04/06/13 23:26
>>743
君も配列とポインタ変数を混同していないかい?
gccにはバージョン3以降で構造体(あるいはそのメンバ)のアドレス計算を間違うバグがあったんだがね。
それを知っていれば、配列とポインタ変数をどうこうなんてレスは返さないと思われ。

例えばfoo[2].bar.len++とすると、関係ないメモリをインクリメントしようとしていた
事がある。これをfoo[2].bar.len += 1と書くとなぜか回避できた。

答えられないなら、黙ってていいよ。
>>744
こりゃ失礼。
って言うか、そういう問題じゃないんだけどね。

>>745
そういう問題じゃなくて、一体 foo の型って何 ? って言う話なんだけどな。
(わざわざ「シンタックスエラー」とまで書いてあるのにわからんかな...。)

>>746
そういう個別のバグ ? の話までするんであれば、問題のソースと -S の結果を貼った方が早いと思うが。
>>746
はぁ?
配列を外部参照しにいくにもかかわらず、extern struct *fooと
書いてることが問題であって、アドレス計算は関係ないと思うのだが?
>>746
「答えられないなら、黙ってていいよ」
こんな台詞吐くやつは大概厨房と決まってるんだがな。
GCCのアドレシングのバグなぞを持ち出してきているが、それ以前の問題だ。
char c_ary[10] の型は char* ではないということだよ。
実際のソースは長いので、要約するとこんな感じ。

-- c.h --
typedef struct {
 int len;
 char *str;
} lascii;
-- sample1.c --
#include "c.h"
lascii foo[3] = {
 {3, "abc"},
 {4, "defg"},
 {5, "hijkl"}
};
extern int hoge();
main()
{
hoge();
}
-- sample2.c --
#include "c.h"
extern lascii foo[]; // ここでfoo[3]とすれば無問題

int hoge()
{
 printf("%s\n", foo[2].str);
}
配列中の構造体が全て同じ大きさであることが保証されているならば配列で
宣言することは無理もない事だけど、ある程度のメモリ容量が必要だったり
構造体の大きさがまちまちならば、ポインタで宣言しておいて、malloc()で
メモリを割り当てるだろうな。
>>750
少なくとも、そのソースは 2.95.4 なら問題はない。
他のまともなコンパイラでも問題はないはず。
お前の使ってるバージョン固有の問題、もしくはお前の環境の問題と思う。
もしこのソースでエラーになるなら、sample2.c の -S の結果を貼ってくれ。

>>751
> ある程度のメモリ容量が必要だったり

何が言いたいのかよくわからん。
日記なら、ご自分の日記帳にでも書いておけよ。
大量の配列を宣言するくらいなら、ポインタで変数を宣言してmalloc()でメモリを
割り当てるでしょうな。

「ポインタと配列は違…」とか叫ばれてもね。そんなことは聞いてないし、言わ
なくていい。それは今問題にしてない。問題かもしれないが。

構造体の配列をextern宣言する時に配列数を含めておかないと正しい参照が
出来ないのはどういうことなのか、を気にしているの。
コンパイル時にアドレスが不定で決定できないならば、エラーなりワーニングを
出せば済む事なのだが、-Wallなどを付けても問題なく通る。
>>753
>>751のソースは問題ない。それで動かないならコンパイラのバグ。
* fooで動かないのは当り前。それで動くと思うのはおまえの頭のバグ。
>>753
> コンパイル時にアドレスが不定で決定できないならば、エラーなりワーニングを
> 出せば済む事なのだが
リンク時の話だからコンパイラには何もできないでしょ。
>>750のソースと違うのかと>>754の耳に息を吹きかけながら囁いてみるテスト

なんでもいいが、>>753はそろそろ黙っとけ。
しかし>>738にextern struct *fooとはっきり書いてるし。

>>738
> 単にextern struct *fooでも良いと思ってたんですが、

配列の不完全型を理解してないんでしょうね。
言語を知らんヤツがコンパイラを語るってイタイよな。
ポレは、警告を「ワーニング」って呼ぶ奴を、「あぁ、ばかなんだな」と思うことにしてるんだが。
>>759
なぜ?
「ワーニング」ではなくて何と呼ぶんだ?
まさかとは思うが「ウォーニング」とか言うなよ。
放置でおながいします
762760:04/06/15 13:18
>>761
>放置でおながいします
当たったのかよ。藁
「わーん」の方がアップアップしてる感じが良いなぁ。
ワーンヽ(`Д´)ノing
ウォーヽ(`Д´)ノning
アハーンヽ(`Д´)ノping
>>766
>アハーンヽ(`Д´)ノping
ムシロ意味がわからん。
エロ画像
769デフォルトの名無しさん:04/06/15 19:51
gccとは直接関係ないのですが、お願いします。
clispというパッケージをコンパイルしていて以下のようなエラーが出ました。

gcc -W -Wswitch -Wcomment -Wpointer-arith -Wimplicit -Wreturn-type -Wno-sign-compare -O2 -fexpensive-optimizations -DUNICODE -DDYNAMIC_FFI -I. -I../../ -c linux.c
linux.c: In function `module__linux__init_function_2':
linux.c:434: error: `sigpause' undeclared (first use in this function)
linux.c:434: error: (Each undeclared identifier is reported only once
linux.c:434: error: for each function it appears in.)
make[1]: *** [linux.o] Error 1

ここで疑問なのですが、Makefileからコンパイラへ渡される変数の一覧は
どのように探したらいいのでしょうか?-DXXXというオプションがここでは
二つほど渡されていますが、他にどのような値があるのか知りたいと思います。
-E
プププ...Makefileから渡される変数など存在しない
make -n とかやって眺めるのが簡単じゃないの?
clispのlinux.cはこのようになっています。

#include <signal.h>
・・・
void module__linux__init_function_2 (module_t* module)
{
・・・
register_foreign_function((void*)&sigpause,"sigpause",1024);


つまりLibcの関数をあるテーブルに登録してると思われる処理です。
またclispのパッケージにはsignal.hというファイルは存在していません。
signal.hのsigpauseに関する場所はこのようになっています。
ここにコピペした場所以外にはsigpauseは記されていません。

/* The `sigpause' function has two different interfaces. The original
BSD definition defines the argument as a mask of the signal, while
the more modern interface in X/Open defines it as the signal
number. We go with the BSD version unless the user explicitly
selects the X/Open version.
This function is a cancellation point and therefore not marked with
__THROW. */
extern int __sigpause (int __sig_or_mask, int __is_sig);

#ifdef __FAVOR_BSD
/* Set the mask of blocked signals to MASK,
wait for a signal to arrive, and then restore the mask. */
extern int sigpause (int __mask) __THROW;
# define sigpause(mask) __sigpause ((mask), 0)
#else
# ifdef __USE_XOPEN
# ifdef __GNUC__
extern int sigpause (int __sig) __asm__ ("__xpg_sigpause");
# else
/* Remove a signal from the signal mask and suspend the process. */
# define sigpause(sig) __sigpause ((sig), 1)
# endif
# endif
#endif

ここで__FAVOR_BSD=FALSE,__USE_XOPEN=FALSEだったらエラーになりますよね。
>>773
770が言うように-Eしてみたら手掛かりになるのでは?
Glibc-2.3.2では上の__FAVOR_BSDのところが__USE_BSDになっています。
これってGlibc,GCCの環境設定,clispのどれが悪いと思われますか?
glibc-2.3.4,gcc-3.4とあたらしめのものなので、バグがあるのは当然です。

$gcc -E -I. -I../../ linux.cをしてみました。
sigpauseが含まれているのは以下の箇所だけ。

extern void psignal (int __sig, __const char *__s);
# 149 "/usr/include/signal.h" 3 4
extern int __sigpause (int __sig_or_mask, int __is_sig);
# 178 "/usr/include/signal.h" 3 4
extern int sigblock (int __mask) ;

register_foreign_function((void*)&sigpause,"sigpause",1024);

となると、上の/usr/include/signal.hと比べれば、やはりGlibcがおかしいっぽいですね。
どっちか define しないと sigpause が宣言されないんなら、clisp の
Makefile (or configure) が悪い、ってことになるかね。

なんにしても、gcc はまるで関係ない。

>>777
もしも、君の書き込みが
『ほら、やっぱりウォーニングじゃん!』
という意図ならば、相当痛いぞ。
clispの全てのヘッダーファイルの中から#undefしてるところを探しても、
__FAVOR_BSD,__USE_XOPEN,__GNUC__は一つもなし。通常はこれらの値は
Glibcでは/usr/include/features.hにてシステムの値として設定されるようです。
で/usr/include/features.hの該当箇所を見ると、以下のようになっています。

/* These are defined by the user (or the compiler)
to specify the desired environment:

__STRICT_ANSI__ISO Standard C.
_ISOC99_SOURCEExtensions to ISO C89 from ISO C99.
_POSIX_SOURCEIEEE Std 1003.1.
_POSIX_C_SOURCEIf ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
if >=199309L, add IEEE Std 1003.1b-1993;
if >=199506L, add IEEE Std 1003.1c-1995
_XOPEN_SOURCEIncludes POSIX and XPG things. Set to 500 if
Single Unix conformance is wanted, to 600 for the
upcoming sixth revision.
_XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions.
  ・・・
_BSD_SOURCEISO C, POSIX, and 4.3BSD things.
  ・・・

多分エラーの原因はclispのMakefileにて、glibc-2.3.4用に上記の値のBSD関連、
もしくはXOPEN関連のどちらかを設定する必要があるということだろうと思います。

質問はこれからです。"(or the compiler)"とあるコンパイラの設定とはGCCの
場合はどこを見ればいいのでしょうか?specsには
%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
という1行だけが含まれていましたが、他にもどこかにあるのでしょうか?
補足ですが、
gcc-3.3.3のspecsには以下のようなものも含まれていましたが、
%{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}
自分のところの3.4にはこれすらなくなっていました。
gccと関係ないって。だから犬厨しつこいって言われるんだよ。

森へお帰り
このスレはワーニング派が多いの?
ホントシツコイナ、答えはもう出てるだろ

These are defined by the user

お前は盲目か?ベンダ依存の制御マクロだろこれ
文句があるなら、GCCじゃなくてディストリビューターに言え
>>782
正直どっちでもいいの

日本人じゃちゃんと発音できないから
発音と日本語での書き方は別物。
warpをウォープとかwarrantyをウォーランティとか言う奴はアホ。
カタカナ語にいちいちつべこべ言う香具師は


            け い こ く


とでも言い直せよヴォケ
日本語の会話中に突然 warning って発音の単語が出てきたらふつー引くだろ?
787アルロビュー ポッキュ ヤングギゴッポム!!!:04/06/16 01:17
白人に劣等感丸出しの朝鮮人が一人紛れ込んでヲメくヌレはここでつか?

「マクドナルドは」「メッドゥネルドゥ」じゃないから
チォックバリドル英語下手ニダとかほざく連中と変わらんて




virus を「ヴァィラス」に近い発音されてきちっと理解できる奴どれくらいいるんだ?
しかも日本語の会話の文脈で
面接中にイオナズンとかもな
789759:04/06/16 01:30
こんなポレでも、cosは「コサイン」って読んじゃうけどな。
>>780
3.4では__GNUC__等はgcc内部で定義されてるよ。

よくわからんが
linux.cの先頭で
#define __USE_XOPEN
とすれば、エラーは無くなるんじゃない。

読み方なんてどうでもいいじゃん。
それよりも、gccのオプションを1つでも覚えれば。
おまいら -Werror がコンパイル通るまで帰しませんよ
>おまいら -Werror がコンパイル通るまで帰しませんよ
先生!通ったんで、もう帰っていいですか?
>>793
キャストの嵐かよ!!!
>>794
>キャストの嵐かよ!!!
ちがうよ。人聞きが悪いこと言うなぁ。
もともとのコードが良いからさ。
>>790 ありがとうございます。

linux.cにて
#define __USE_XOPEN 1
#include <signal.h>
としてみましたが、なぜか>>769と同じエラーが出ます。
/usr/include/*とclispのパッケージ全てのソースにおいて#undef __USE_XOPEN
しているところを探しても、features.hにて行われているのみ。
いろいろ試してみた結果、
$gcc -D_GNU_SOURCE -I. -I../../ -c linux.c
と_GNU_SOURCEをつけた時だけコンパイル成功。謎です。
この時はソース中に__USE_XOPENを付ける必要すらなし。
もう少し時間をかけてなぜ上手くいかないのか調べてみたいと思います。

/usr/includeの下をあれこれ眺めていましたが、Libcは難しいです。
開発者の頭の中にあるUNIXに関する知識に驚くばかりです。
ただし、BSDのそれはもう少しシンプルだったようにも思います。

__GNUC__などのプリプロセッサ用の値はgcc/c-cppbuiltin.cの、
define__GNUC__という関数にてgcc/version.cの値をそのままに設定していました。
3.3まであったno-gccなるオプションは3.4にてなくなったようです。

スレ違いらしいので、これにて終りにさせて頂きます。
半可通なGCC廚が多いな。
答えられないなら黙ってりゃいいのに。一生ビルドだけしてろ。
お前が黙ってろw
799デフォルトの名無しさん:04/06/16 15:45
ソースとアセンブリの混合リスティング出すオプションは無いの?
gcc --help
gcc -v --help
発音と日本語での書き方は別物。
warming upをワーミング・アップとかStar Warsをスター・ワーズとか言う奴はアホ。
おとうちゃん!
クロスコンパイラビルドしてみたんだけど、ブートストラップのcrti.oを作ってくれないよ!
crtbegin.oとかは作ってくれるのに、何故ぇ??
>>803
クロスで、とくにカナディアンで、ライブラリ作るの、
けっこうノウハウいるから苦労するよ。

俺なんて、cc1 とかのコンパイル成功した時点で、それ使っちゃうからな(w
805800:04/06/17 02:40
>>801
探しても無いんだけど。。
>>805
じゃ、無いってことだろ。あきらめたら。
開発者の人はどうやってデバッグしてるんだろう。
ソースとアセンブラ(もしくは他の内部的な中間コード)の
リストあったら見やすくない?
>開発者の人はどうやってデバッグしてるんだろう。
gdbでデバッグしている。といいたいところだけど。

制御系だとターゲットが常に手元にあるわけではないし
問題が発生しても、エンドユーザの環境でデバッグするわけにもいかない。

そこで例外発生時のバックトレース情報
(例外が発生したアドレスと、その呼び出し元のアドレスの一覧)
から調査を始めるわけなんだけど

ldの吐き出したマップファイルからアドレスと関数の対応はわかるものの
ソースのどの行かまではわからないんだよね。

アセンブリリストは -S で出るから、そのリストを見て、おそらくこの行だろう
と推測するしかないという状況。

外部ツールでもいいから、ソースとアセンブリの混合リストを吐く方法は無いだろうか?
デバッグ情報付きのオブジェクトから作れそうなものだけど。
仕事上、生粋のエイゴリアンともよく話すんだけど
連中にもワーニングって言って通じたよ
「ウォー」より「ウヮー」って発音だったけどね
warm と worm のどっちがワームなのか知らない奴が沢山いる予感・・・
いつまでくだらんネタやってんの?
>>805
objdump にそういう機能がある。

--source
Display source code intermixed with disassembly, if possible.
Implies -d.
>>812
ありがとうございます。
objdumpとは、言われて見ればああなるほど。

これで仕事が進みます。
>>813
>これで仕事が進みます。
それが、2chサーチエンジン。まれに嘘を吹き込まれるが。(藁
>>734-737
Cygwinで日本語PATH問題は、Win板のこちらへ。
http://pc5.2ch.net/test/read.cgi/win/1052361218/933-940

もとはUNIX板のCygwinスレで出てきた話だけど、まとまってないし、dat落ち中だし。
hoge
と表示してくれるのを期待したのに、piyoが表示されてしまいました。
これってANSI的にはどうなのよ?

$ gcc --version
gcc (GCC) 3.3.1 (cygming special)
Copyright(略)
$ cat hoge.c
#include <stdio.h>
int main(int argc, char **argv) {
printf("hoge\n");
return 0;
}
static void puts(void) {
printf("piyo");
}
$ gcc -ansi -pedantic -Wall -O -o hoge hoge.c
hoge.c:6: warning: `puts' defined but not used
$ ./hoge
piyo$
あ、スペースが詰まってインデントが見難い…
$gcc --version
gcc (GCC) 3.4.0 20040601 (Gentoo Linux 3.4.0-r6, ssp-3.4-2, pie-8.7.6.3)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$gcc -ansi -pedantic -Wall -O hoge.c
fo.c:6: error: conflicting types for 'puts'
fo.c:6: error: conflicting types for 'puts'
fo.c:6: warning: 'puts' defined but not used

でした。
あ、ファイル名違ったままだった。スマソ。
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
call __alloca
call ___main
movl $LC0, (%esp)
call _puts
movl $0, %eax
movl %ebp, %esp
popl %ebp
ret

なんでここで_putsが出てくるのかな。漏れも知りたいです。
gccのおせっかい機能だった気がせんでもない
-Oをはずせばprintfになる。
GCCの最適化処理が、不変な文字列出力であった場合、
puts等に置き換えるがその影響かも。
これは、既知の問題なのか?
まぁ、通常こんな書き方するやついないが。
>>819
ANSIはしらんが、最新のJIS C(=ISO C)ではライブラリの識別子は予約とされていて、
同じ識別子を使うと未定義となる。C89でも同じだと思う。
だからこの動作でもOK。

JIS X 3010 2003(ISO/IEC 9899: 1999) 126ページ 7.1.3 予約済み識別子
>>819でなくて>>816だった。

しかしJISCのサイトはなんでアイコンがネットスケープなのかな?
>>824
>しかしJISCのサイトはなんでアイコンがネットスケープなのかな?
ワロタ
鯖は、Solarisだがな。
自作putcharを作成したんですけど、以下の警告が出てしまいます。
この問題を回避する方法ってあるのでしょうか?
hoge.c:28: warning: conflicting types for built-in function `putchar'

gcc version 3.3.3です。
putcharという名前に拘るのをやめる
>>826
1. 自作putcharの名前を変える.
2. built-inのputcharが宣言してあるheaderを読み込まない.
3. c++にして名前空間を利用する.
くらいでしょうか.
普通は1、正しいのは3、2を選ぶ奴はドンキホーテ
>>823
7.1.3 予約済み識別子 だけだと、
ライブラリの extern な識別子は、extern な識別子として使うのは予約済みだけど、
>>816みたいに、static な識別子として使うのは予約されてない。
けど、6.2.2 識別子の結合 で、
翻訳単位の中で同じ識別子が内部結合と外部結合の両方で現れた場合、その動作は未定義とする
となっているので、動作は未定義になる。
という理解であってる?

>>820
最適化すると、printf("hoge\n"); が puts("hoge"); に置き換えられたり、
printf("%s\n", s); が puts(s); に置き換えられたりするみたい。
(ただし、返却値を使ってない場合)
>>818-8223
printf が最適化で puts に置き換えられるのは、
ちょっと余計なお世話なような気はするけど、通常は問題なさそうなので許すとして、
int puts(const char *);
static void puts(void) {}
が、型が違うぞゴルァと言われずにコンパイルできてしまうのは、ちょっと気持ち悪いかな。
Use either of -fno-builtin-printf or -fno-builtin
833826:04/06/21 06:36
>>832
Thanx
834デフォルトの名無しさん:04/06/22 11:04
局所的なstatic変数の動的な初期化をスレッドセーフに行わせるための
オプションってありますか?C++です。

void foo(void) {
static int bar = baz(); // ここ
return ++bar;
}
排他制御しろ。
main()に入る前(にstatic storageの変数の初期化が行われる)はシングルスレッド。
>>835
> 排他制御しろ。
チーム全体に周知するのが困難で。

>>836
局所変数だからmainの前には初期化されまへんね。ゼロクリアは保証されてるけど。
static __thread int bar = baz();
とすると、何が変わるの?
839834:04/06/22 11:26
とおもったがやっぱり排他制御しますー。
>>838
TLSあたりでぐぐってみる。
>>839
>とおもったがやっぱり排他制御しますー。
それが一番無難だ。
>>837
> チーム全体に周知するのが困難で。

intだからbaz()の中で排他制御するのがいいんじゃない?
Atomicでないdata typeだと代入を排他する必要があるけども。
ってスレ違いですかね。

>>838
http://developer.apple.com/documentation/DeveloperTools/gcc-3.3/gcc/C99-Thread-Local-Edits.html#C99%20Thread-Local%20Edits
それからgccのinfoの"Thread-Local"の項
844834:04/06/22 12:04
>>838
> static __thread int bar = baz();
> とすると、何が変わるの?
動的初期化はできないですよん
>>844
>動的初期化はできないですよん
起動時に一度だけ初期化したいってことか?
なら、フラグを持って排他制御だな。
排他制御の徹底をチーム全体に伝えれないのに、スレッドとか使うのは
なんだか凄く危険な予感がするんだが。
>>846
人のことなんてしったことではありません
動的初期化って言葉あまり言わないなぁ。
>>848
JISの用語だろうなJISX3014の3.4.2とか見てみれ。
850デフォルトの名無しさん:04/06/22 16:45
VC++で書いたコードをg++でコンパイルしたら
ファイルサイズが結構でかくなったんだけど、
これは仕様ですか?
>>850
stripした?
852デフォルトの名無しさん:04/06/22 17:00
>>851
は?ストリップ?
>>851
-Osでコンパイルして、stripしたら、70KBくらい減った。
ありがとー
質問しといて「は?」は無いよな・・・
厨房だろ
856850,853:04/06/22 21:27
>>854,>>855
一応だけど、>>852は漏れじゃないです。
>>854

>>852 は多分成りすまし。
ID 無い板でよく行われる。
gccで以下のように宣言できるんですけど
いったいどうなるんですか?

struct hoge;
g++で以下のように宣言できるんですけど
いったいどうなるんですか?

class hoge;
これってどういう意味?
__attribute__((noderef, hogehoge(1)))
>>858
gccさんが、(´・∀・`) ヘェーって思う。

>>859
g++さんが、(´・∀・`) ヘェーって思う。
http://www.sra.co.jp/wingnut/gcc/gcc-j.html#Function%20Attributes
これ見ても載ってないね。noderefってなんだろう。
>>861
糞ワロタ
>>860
gccのバージョンとターゲットは何?
3.3.2のソースを眺めでみたが、見当たらん。
>>858,859

C++だと時々使うよ、Cでも通るんだな struct hoge は初めてだ

後でちゃんとしたの宣言するから、とりあえず通せって考えてるけど
実際どうなんしょ?

>>858,>>859
何のメリットがあるんだろう..
相互参照する構造体での前方宣言ですよ。
struct foo;
struct bar {
struct foo *p;
};
struct foo {
struct bar *p;
};
struct __foo {
struct __foo * p;
};
というのもある意味前方参照?
>>867
2パス通せばいいと思うんだが。
コンパイル高速化の為?
>>869
それもあるが、実態を隠したいわゆる ADT (抽象データ型) を実装する
ためにも使う。
>>870
>それもあるが、実態を隠したいわゆる ADT (抽象データ型) を実装する
>ためにも使う。
なるほ。
struct foo;
こういうのは不完全型という。
class foo; //class header
class foo {}; //class body

と、C++では言います
>>873
聞いたことねーな。誰が言ってるの?
>>874
lippman
>>873
"class header"というと、ほとんどが「クラス定義を含むヘッダファイル」を指して言うみたいなんだが、
その意味で使われている例をWeb上の文書で示せるか?
876
C++Primerに載ってただけ。便利だから俺はよく使ってる。
ごめん今ちゃんと読んだら、class headだったし、
全然違う意味だった。逝って来る。
>>877
たぶん一般的じゃないからやめたほうがいいと思う。
>876のような意味に勘違いされる可能性が高い。

関数の場合を考えると、
 void foo(); // 関数宣言
 void foo() {} // 関数定義
この使い分けは一般的だから、
 class foo; // クラス宣言
 class foo {}; // クラス定義
こう使い分けるのがすっきりしてるかも知れない。
ただ、「クラス宣言」が「クラス定義」の意味で使用されることが多いので、
これも誤解を生まないわけではない。

現状で最も誤解が少ないのは、
 class foo; // クラスの前方宣言(forward declaration)
 class foo {}; // クラス定義
と使い分けることだろう。
lippmanのいうclass head,class bodyとは

class CLASS //この部分がclass head
{
  //この部分がclass body
  ...

ということ。汗かいちゃった。
>>879
> この使い分けは一般的だから、
一般的というか、規格書で使ってる用語そのまま。
>>881
ああ、NO DEREFerenceなのか。
・"noderef"を付けるとデータを参照してないポインタに警告を出す。
・address_space(N)データへのポインタは、同じaddress_spaceへのポインタと型が互換になり、そうでなければ警告を出す。
ってこと?
なんだかよくわからんが。
>>884
逆でしょ。

dereferenceしようとすると警告になるんでしょ。
使い方としては「カーネル空間からユーザ空間にアクセスしようとすると警告」など。

>>885
うむ。なるほど。
ソース見てたら以下の文字列がありました。
#pragma pack(1)
#pragma pack()
これってなんすか?

ネットで調べるとpragmaは古い仕様なことがありましたが。
889887:04/06/26 00:51
>>888
さんくすです。paddingか。
__attribute__ ((aligned (1), packed))ってことか。

pragmaってよく使用するんですかね。attributeを使えばいいような気もしますが。
attributeはgccの拡張仕様だから。
文法的にはattributeの方がわかりやすくでいいけど。
DLL作りでメモリ共有する時にもgccではattribute shared使うけど、MSだとpragma使うから
コンパイラ非依存にするには#ifdefでごちゃごちゃやってやらないといけないのが面倒。
>>892
該当するページが見つかりませんでした。

検索のヒント

- キーワードに誤字・脱字がないか確かめてください。
- 違うキーワードを使ってみてください。
- より一般的な言葉を使ってみてください。
- キーワードの数を少なくしてみてください。
>>890,>>891
なるほど、attributeってGCC依存なのか。知らんかった。Thx
>>892さんは以下を言いたかったに違いない。
http://www.kab-studio.biz/Programing/Dictionary/Words.html#__s__pragma
896デフォルトの名無しさん:04/06/27 18:15
それにしても、3.0 以降はバージョン番号がさくさく進むね。
なんか 2.95.2 のときの停滞がうそのようだ。
>>896
前は人手が足りないようなことを言ってけど、
開発メンバが増えたのかな。
エンタープライズ向けのみになって暇になったRedhat内の開発者がまたいじってるんじゃないかと推測
GCC 3.5 Release Series
Changes, New Features, and Fixes
http://gcc.gnu.org/gcc-3.5/changes.html
【gccの最適化オプション一覧】
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks
-fdelayed-branch -felide-constructors
-fexpensive-optimizations -ffast-math -ffloat-store
-fforce-addr -fforce-mem -finline-functions
-fkeep-inline-functions -fmemoize-lookups
-fno-default-inline -fno-defer-pop
-fno-function-cse -fno-inline -fno-peephole
-fomit-frame-pointer -frerun-cse-after-loop
-fschedule-insns -fschedule-insns2
-fstrength-reduce -fthread-jumps -funroll-all-loops
-funroll-loops -O -O2 -O3 -Os
これって何?
コストのかかる最適化?なんか矛盾してるような気がするが。
-fexpensive-optimizations
>>899
3.5出たのん?
>>901
strength reduction
>>901
コンパイルにコストがかかるってことだろ。
905901:04/06/29 15:21
>>904
>コンパイルにコストがかかるってことだろ。
Oh, I see.
>>902
まだ出てない。
>>899は、GCC 3.5を作成するにあたって行われる変更、新機能、修正一覧を知らせてるだけ。
>>901
-fexpensive-optimizations
 Perform a number of minor optimizations that are
 relatively expensive.

意訳すると「時間もメモリも喰うワリに効果の薄い最適化を行う」だ。
gcc-2 の頃からあったような希ガス
>>907
希ガスって風俗板方面の用語だっけ?
909デフォルトの名無しさん:04/06/29 20:03
gccではなくg++で、トランポリンのコードが生成されるシチュエーションってありますか?
ネストした関数はg++だとコンパイルできません。
>>900
-Oはいっぱいあって、-O999あたりまでいける。意味は皆無だと思うが。
>>910
昔、某ディストロは「-O99」なんてやってたね。今はどうだか知らないけど。
プリコンパイルヘッダをもう少しだけなんとかしてくれんか脳…
そういやx86用ならIntelのC++コンパイラはGCC完全互換+ごっつい
プリコンパイラヘッダ対応らしいが、GCCとどう違うんだろう。
>>912
どういうところが難アリとお考えで?
よく聞きますけど、
「トランポリンコード」って何ですか?
>>914
よく聞く ?
俺は初めて聞くが、どうも Linux 関係らしいから、それ以上調べるのはやめた。
>>909はLinuxなのか?
917デフォルトの名無しさん:04/07/03 11:29
>>909は何のことか分からないけど、
Linuxのトラノポリンはスタック領域の移動に使うコード。
シグナルハンドラで使われる。
二つのトランポリンを横移動ってイメージの命名だと思う。
918デフォルトの名無しさん:04/07/03 12:10
clock()で秒以下の数値が戻ってこないのですが、
なにかオプションの指定が必要なのでしょうか?
gcc 3.2.3 20030502(Red Hat Linux 3.2.3-20) を使用しています。
gccの問題なのか?
ははは
いいつっこみだ。
>>914
gcc のマニュアルの nested function の項に書いてあるよ。
あとはここにも。

ttp://www.shiro.dreamhost.com/scheme/docs/cont-j.html
>>918
gccとは無関係だからLinux板で。
まぁ、gettimeofday()でも使っとけってことで。
以下のソースで、
int main(){
 short a;
 int b;
 a = b = -1
 printf("%d, %d\n", sizeof(a), sizeof(b));
 printf("0x%X\n", a);
 printf("0x%X\n", b);
 return(0);
}
結果が
2, 4
0xFFFF
0xFFFFFFFF
とならずに
2, 4
0xFFFFFFFF
0xFFFFFFFF
になりましたけど。なぜでしょうか?
>>923
可変長引数に short 型の変数を渡すときには、暗黙の内に int にキャスト
(格上げ)されるから。
925デフォルトの名無しさん:04/07/07 00:45
3.4.1 age
926923:04/07/07 00:57
>>924
うぉーそうだったんですか!
何年もC使ってたけど知らなかった。 _| ̄|○
逝ってくる。
日本人でGCCデベロッパな方っているんでしょうか?
自分もGCCデベロッパに入りたい。けど、技術力がないからだめか。
やはり、コンパイラの勉強しないとだめですか?
Kに弟子入りすれば大丈夫
たまに開発MLに日本人らしき名前で投稿があっても、しょっちゅうスルーされてた。
英語の下手な香具師はコミュニケーションとれないからな。
技術力以前の問題というか。
>英語の下手な香具師はコミュニケーションとれないからな。
>技術力以前の問題というか。
その逆もまた真になる。

できる奴は技術力でそれをカバーできると思うし、
相手もできる奴とわかれば意思の疎通も多少はできるはずだが。
>>932
コーディングだけならね。パッチ送って採用されたとか
そのレベルでしょ。
>>933
それ以上になにかあるのか?
目的は達成されているような気がするが。

それとも相手の家にでも遊びに行くのか?
>>934
どのバージョンでどの機能を入れるか、みたいなプロジェクトの
方針や決定に関われるようなヤシはいないって事でしょ。

もっともそこまでやるなら、それこそRedHatみたいな会社でフル
タイムのhackerとして雇ってもらうとかじゃないと時間的に無理
だろうが。
>>933
それくらいでも、
hogehogeがおかしいので直して見たけど、これどうよ?
てな事をちゃんと説明しないとスルーされるわけですが。

それなりの実績があれば一行説明でもわかってくれるが。

>>934
commit権もらうとか。
>>936
>commit権もらうとか。
ワロタ
938デフォルトの名無しさん:04/07/08 08:01
3.4.1の出来はどうですか?
>>938
上々の出来
GCCじゃなくってGDBの話なんだけど、Cygwin、MinGW用のビルドは
常にスレッド対応してないのかな??
クロス開発で不自由で。
5.2.1〜6.1までをぽつぽつと試してみたんだけど、info thread(s)で
どれもRMT ERRORとでるか、最初のスレッドの情報が中途半端に
帰ってくるだけで、2つめ以降のスレッドの情報は出てこない。
break置いても止まらないし、あまつさえメインのスレッド止めても
それ以外のスレッドは走りっぱなしなのでデバッグにならん。
gdbserverのバージョン変えても駄目だし、--enable-threads付けて
ビルドしても駄目だし、どうしたものか。
んーgdbをデバッグするってのはどう?
>>940
CygwinやMinGW等ではなくて素のOSに入れてもなるのならGDBを疑う。
943940:04/07/09 10:52
>>942
手元のLinuxで同じコードをでビルドした時にはならなかった…。

info threadが何も返さない、RMT ERRORが出る、
最初のスレッドの情報しか返してよこさない、というのは、
GNUのページ見てると、Win環境に留まらず、時々報告されてる
バグ?ではあるみたい。

GDBのスレッド対応はターゲット次第らしいので、仕方ないっちゃあ
仕方ないけど、思ったよりも気にしてる人少ないのかな。
944940:04/07/09 10:57
>>942
手元のLinuxで同じコードをでビルドした時にはならなかった…。

info threadが何も返さない、RMT ERRORが出る、
最初のスレッドの情報しか返してよこさない、というのは、
GNUのページ見てると、Win環境に留まらず、時々報告されてる
バグ?ではあるみたい。

GDBのスレッド対応はターゲット次第らしいので、仕方ないっちゃあ
仕方ないけど、思ったよりも気にしてる人少ないのかな。
945名無しさん@そうだ選挙に行こう:04/07/11 18:33
各アプリケーションの初期設定では、最適化オプション
-O2
であることがほとんどですが
-O3
にすると問題は多いのでしょうか?
房な私にアドバイスお願いします。
多くない。
多いって言うかどんな問題があるのか知りたい
-O2にすると偶然動くバグとかあるじゃん。
そういう意味で-O3は問題だ。
酸素とオゾンは大違いだしな
>>940
Cygwin で GNU gdb 2003-09-20-cvs (cygwin-special) を使ってますが、
今のところ、マルチスレッドでおかしな現象には出会ったことないですよ。

自分が不自由してるのは、detach が効かないこと。
他のバージョンではどうなんだろう、試したことないけど。
そろそろ128bitCPU用にlong long longが欲しいな。long long long long かもしれないが。
コンパイル時の定数計算のために、long long(uint64_t)が導入されたが、
ILP64の環境の場合にはuint128_tが必要にならないんだろうか。
954デフォルトの名無しさん:04/07/16 23:56
GCCの最適化オプションは数あれど
基本的には -O* を指定しておけば、必要に応じて
-fstrength-reduce等のオプションが設定されると考えて良いのでしょうか?

要するに -O3等はオプションの総合オプションのように機能しているのでしょうか?

素人な私にアドバイスをお願いします。
んじゃ適切なアドバイスを。info読め。ちゃんと書いてあるから。

info読むためにはemacsの使い方を(略
957デフォルトの名無しさん:04/07/17 04:15
#include <iostream>
すると、
/usr/include/c++/3.4.0/backward/iostream.h
が読み込まれてしまうみたいなんだけど、
/usr/include/g++-3/iostream{,.h}
を使いたい場合はどうしたらいいでしょう?
>>954
その認識であってる思います.
最近どっかのスレで見掛けたのだけど,
-vと-Qを同時に指定すると, 実際に有効にされたオプションが表示されるようです.
960959:04/07/17 10:26
突っ込まれそうなのでもう一言.

>>954
あなたの言う「総合オプションのような機能」以外のなんらかの最適化を
更に-O*が行なうかどうかを私はよく知りません.
それはソースを当たって下さい.
>>959>>960
変わった人…
962959:04/07/17 11:01
>>961
???
何か良いこと知ってるんなら教えて下さい.
ソース読む前にinfoでしょ。
gcc hoge.c -lm 等、ライブラリを使用してコンパイルするときに
この'-lm'で具体的にどこのライブラリを参照するかはどのように指定するのでしょうか?
-L/home/foo/lib -L/usr/local/lib -L/opt/bar/lib
966959:04/07/17 11:53
>>963
それには異存ないんですが,
infoの説明では,
-O*にいくつかの-f*をまとめて指定する「総合オプションのような機能」があることは分かりますが,
-O*が,指定した-f*以外にも何らかの最適化を行なうのか,-f*の指定だけなのかちょっと不明だったもので.
読み落してたら御指摘下さい.
967959:04/07/17 12:08
-O2を指定して959に書いた-vと-Qを使うと,
「渡されたオプション」には-O2が表示されるけど,
「有効オプション」には-O2が表示されないところをみると,
-O*は「総合オプションのような機能」だけなのかも.
968デフォルトの名無しさん:04/07/17 12:43
$ gcc -O3 -v -Q test.c > o3.txt 2&>1
$ gcc -O2 -v -Q test.c > o2.txt 2&>1
$ diff o2.txt o3.txt

何もでないよ(^^;
2&>1 じゃなくて 2>&1 だったよ(^^;

diff を見るに
-frename-registers
だけ違うように見える。

gcc version 3.3.1 (cygming special)
古い記憶なんだが、そもそもO3が有効なのはx86系だけなんじゃなかったっけ。
バージョンにより違うんじゃないの?
>>970
sparcでも使えてたよ
info も嘘っつーか、source に追いついてなかったりするから
しょうがなく gcc/toplev.c と md 部分の *.c や *.md 見て確かめてるな。
-finline-functionsはO2にあるはず無いし、O3に無いはずが無いだろう
975959:04/07/17 19:08
>>974
manによるとそうなんですけど,
gcc -v -Q -O3 hoge.cpp
だと,-finline-functionsが出ません.
やっぱgccはソースを見るしかないのか.
-v -Qが壊れてるんじゃないの?
977959:04/07/17 19:16
gcc -v -Q -O3 -finline-functions hoge.c
としても,有効オプションに-finline-functionsは表示されないので,
-v -Qは指定された有効なオプション全部を表示しているわけではない
みたいです.
失礼致しました.
978959:04/07/17 19:19
>>976
壊れてるっていうか,
-v -Qに全部の有効オプションの表示を期待した私が間違ってたってことです.
979デフォルトの名無しさん:04/07/17 19:24
gcc -S -O2とgcc -S -O3でコード比較すれば
インライン展開してる事なんてすぐ分かるじゃん。
アセンブラも読めないのに最適化についてなんて語るなよ。
980959:04/07/17 19:35
>>979
それはそうなんだろうけど,
最適化はインライン展開以外にもたくさんあるわけだし,
全部の有効オプションを表示する機能はあれば便利なのでは?
正論だ。


ところで次スレは?
立てた

GCCについて part4
http://pc5.2ch.net/test/read.cgi/tech/1090062751/
>>980
そう思ったら-v -Qのコード直すなりしてパッチ送りなよ。どうしてそうしないの?
>>983
思った瞬間にスレに書き込んだんでしょ。きっと、もうパッチ作って送ってるヨ。
985959
「おまえら次のリリース楽しみにしておけよ!」
と書き込みたいところだけど.

>>983,984
そうやってひとを追い込まない.(苦笑)
私はgccのコード把握してないんで,そう簡単に直せないヨ.