私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレGCCについて part9
gcc スレッド一覧へ / gcc とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : ○
レスフィルター : (試験中)
オプションで -finput-charset と -fwide-exec-charset に文字コードを指定すればいいかもね。
gcc をビルドするときに iconv がリンクされていない場合には使えないけど。
あと、ライブラリ側も貧弱なことがある。
gcc をビルドするときに iconv がリンクされていない場合には使えないけど。
あと、ライブラリ側も貧弱なことがある。
>>505
できないというなら、やってみてどうなったのか言ってみろよ。
できないというなら、やってみてどうなったのか言ってみろよ。
自己解決
>>478のマクロだけど__asmを使っているだけでアセンブラではなかった。
もちろんIA-32のオペコードでもなかった。
ただgccを利用した文字列処理をするために利用しているだけだった。
例えば、kernel_chk.cではこういう風に使われていて
void checker_function(void)
{
DEFS(TMAX_TPRI);
MEMBER(queue,next);
OBJECT(task_6,LOGTASK);
}
これらをコンパイルして.sファイルに変換すると
#APP
sTMAX_TPRI,($16),(0)@
squeue::next,($4),($0)@
dtask_6,LOGTASK@
#NO_APP
となるけど、もちろんこれをアセンブルすると当然エラーになる。
TOPPERSはこれをアセンブルしないで、jsp/utils/gencheckというツールにかけて
jsp.chkという静的APIファイル(カーネルの設定ファイル)の設定チェックファイルを生成する。
最終的にこういうテキストになる。
sTMAX_TPRI,16,0
squeue::next,4,0
dtask_6,LOGTASK
C言語の関数の中でこのマクロを使っているのは、Cとして定義された関数名、変数名、型名などを使えるからC言語にしているだけ。
まさか__asmにこういう使い方があるとは・・・
>>478のマクロだけど__asmを使っているだけでアセンブラではなかった。
もちろんIA-32のオペコードでもなかった。
ただgccを利用した文字列処理をするために利用しているだけだった。
例えば、kernel_chk.cではこういう風に使われていて
void checker_function(void)
{
DEFS(TMAX_TPRI);
MEMBER(queue,next);
OBJECT(task_6,LOGTASK);
}
これらをコンパイルして.sファイルに変換すると
#APP
sTMAX_TPRI,($16),(0)@
squeue::next,($4),($0)@
dtask_6,LOGTASK@
#NO_APP
となるけど、もちろんこれをアセンブルすると当然エラーになる。
TOPPERSはこれをアセンブルしないで、jsp/utils/gencheckというツールにかけて
jsp.chkという静的APIファイル(カーネルの設定ファイル)の設定チェックファイルを生成する。
最終的にこういうテキストになる。
sTMAX_TPRI,16,0
squeue::next,4,0
dtask_6,LOGTASK
C言語の関数の中でこのマクロを使っているのは、Cとして定義された関数名、変数名、型名などを使えるからC言語にしているだけ。
まさか__asmにこういう使い方があるとは・・・
#errorの行に到達したら即座に処理を停止するオプションとかってありますか?
何がしたいのかというと,コンパイル時に-Dオプションでパラメタを与えていて
パラメタを書き忘れた場合にずらずらと大量のエラーが表示されるのを防ぎたいのです.
#ifndef ~
#error ~~~ <-- ここに到達したら即座に停止する
#endif
何がしたいのかというと,コンパイル時に-Dオプションでパラメタを与えていて
パラメタを書き忘れた場合にずらずらと大量のエラーが表示されるのを防ぎたいのです.
#ifndef ~
#error ~~~ <-- ここに到達したら即座に停止する
#endif
>>511 いや、それだけで停止するだろ。
4.5で
wstring=u"あいう"とやったらエラーになりました
uをLに変えてもエラーになりました。
const char*=u8"あいう"とやったらエラーにならないけれど
文字コードはSJISでした。
ユニコードにするにはどうしたらいいですか?
wstring=u"あいう"とやったらエラーになりました
uをLに変えてもエラーになりました。
const char*=u8"あいう"とやったらエラーにならないけれど
文字コードはSJISでした。
ユニコードにするにはどうしたらいいですか?
もしもGCCでユニコードがつかえるときのためには
strings<T>のTを変えるだけで出来るようにプログラムを作っておけばいいんですか?
それとも他に何か必要ですか?
strings<T>のTを変えるだけで出来るようにプログラムを作っておけばいいんですか?
それとも他に何か必要ですか?
CentOS5.5上でXML関係のプログラムをmakeしたところ、以下のエラーが発生してしまいました。
ぐぐったところgccのバグの可能性もありますが、プログラムやstlportの方が問題でどこを見ればよいか教えて頂けないでしょうか。
gcc:4.1.2
ld:2.17.50
ccache g++ -fcommon -fPIC -DLINUX -DCENTOS -DLYNX386
-D_MULTITHREADED -DLYNX386_V230_SOURCE -D_POSIX_SOURCE
-DECC_MC_IF_VME -DPOSIX1B_SOURCE -DPOSIX1C_SOURCE
-DLYNX386_V310A_SOURCE -D_XOPEN_SOURCE -D_SVID_SOURCE
-D_REENTRANT -D_GNU_SOURCE -D_BSD_SOURCE -o
../../../XMLPROG -g
-Wall -Wno-format -I. -I../.. -I- -I../../include
-I../../include/stlport -D_STLP_NO_STATIC_TEMPLATE_DATA
xml_prog.cpp -L../../../libfile -lmxmllib -lmxmlpath
-lmxmllib -lxslt -lxml2 -liconv -lstlport_gcc -lz -lm
cc1plus: note: obsolete option -I- used, please use
-iquote instead
`.gnu.linkonce.t._ZNK4_STL9money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERiRNS_12basic_stringIcS3_NS_9allocatorIcEEEE'
referenced in section `.rodata' of
../../../libfile/libstlport_gcc.a(monetary.o): defined in
discarded section
`.gnu.linkonce.t._ZNK4_STL9money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERiRNS_12basic_stringIcS3_NS_9allocatorIcEEEE'
of ../../../libfile/libstlport_gcc.a(monetary.o)
`.gnu.linkonce.t._ZNK4_STL9money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERiRNS_12basic_stringIwS3_NS_9allocatorIwEEEE'
referenced in section `.rodata' of
../../../libfile/libstlport_gcc.a(monetary.o): defined in
discarded section
`.gnu.linkonce.t._ZNK4_STL9money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERiRNS_12basic_stringIwS3_NS_9allocatorIwEEEE'
of ../../../libfile/libstlport_gcc.a(monetary.o)
ぐぐったところgccのバグの可能性もありますが、プログラムやstlportの方が問題でどこを見ればよいか教えて頂けないでしょうか。
gcc:4.1.2
ld:2.17.50
ccache g++ -fcommon -fPIC -DLINUX -DCENTOS -DLYNX386
-D_MULTITHREADED -DLYNX386_V230_SOURCE -D_POSIX_SOURCE
-DECC_MC_IF_VME -DPOSIX1B_SOURCE -DPOSIX1C_SOURCE
-DLYNX386_V310A_SOURCE -D_XOPEN_SOURCE -D_SVID_SOURCE
-D_REENTRANT -D_GNU_SOURCE -D_BSD_SOURCE -o
../../../XMLPROG -g
-Wall -Wno-format -I. -I../.. -I- -I../../include
-I../../include/stlport -D_STLP_NO_STATIC_TEMPLATE_DATA
xml_prog.cpp -L../../../libfile -lmxmllib -lmxmlpath
-lmxmllib -lxslt -lxml2 -liconv -lstlport_gcc -lz -lm
cc1plus: note: obsolete option -I- used, please use
-iquote instead
`.gnu.linkonce.t._ZNK4_STL9money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERiRNS_12basic_stringIcS3_NS_9allocatorIcEEEE'
referenced in section `.rodata' of
../../../libfile/libstlport_gcc.a(monetary.o): defined in
discarded section
`.gnu.linkonce.t._ZNK4_STL9money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERiRNS_12basic_stringIcS3_NS_9allocatorIcEEEE'
of ../../../libfile/libstlport_gcc.a(monetary.o)
`.gnu.linkonce.t._ZNK4_STL9money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERiRNS_12basic_stringIwS3_NS_9allocatorIwEEEE'
referenced in section `.rodata' of
../../../libfile/libstlport_gcc.a(monetary.o): defined in
discarded section
`.gnu.linkonce.t._ZNK4_STL9money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERiRNS_12basic_stringIwS3_NS_9allocatorIwEEEE'
of ../../../libfile/libstlport_gcc.a(monetary.o)
自己解決しました。
XML関係のプログラムをコンパイルするため、STLportのヘッダーファイルを変更したのですが、
その時STLport自体を再ビルドしていなかったのが原因でした。
XML関係のプログラムをコンパイルするため、STLportのヘッダーファイルを変更したのですが、
その時STLport自体を再ビルドしていなかったのが原因でした。
リンカスクリプトの中で#ifdef~#endifみたいなことをやる方法はありますか?
やりたいことはROM焼きの時とモニタ上で動かす時で各セクションのアドレスを変えたいのですが
リンカスクリプトをコピーして書き換えるのは嫌だなぁと・・・
やりたいことはROM焼きの時とモニタ上で動かす時で各セクションのアドレスを変えたいのですが
リンカスクリプトをコピーして書き換えるのは嫌だなぁと・・・
>>523
条件式とDEFINED組み込み関数があるじゃん。
条件式とDEFINED組み込み関数があるじゃん。
リンカスクリプト二つ用意して、
makeするときに、
ROM焼きとモニタの二つが出来るようにしておくとか
makeするときに、
ROM焼きとモニタの二つが出来るようにしておくとか
GCC-4.6-20101002 のビルド途中、s-tm-texi (tm.texi?) の所でエラーが発生して終了する(ノД`)シクシク
以下の所とエラーの表示内容は同じで
http://mingw-w64.pastebin.com/N1ancXbR
Verify that you have permission to grant a GFDL license for all new text in tm.texi, then copy it to (中略) doc/tm.texi.
って最後に表示される
ヽ(`Д´)ノウワァァァン
以下の所とエラーの表示内容は同じで
http://mingw-w64.pastebin.com/N1ancXbR
Verify that you have permission to grant a GFDL license for all new text in tm.texi, then copy it to (中略) doc/tm.texi.
って最後に表示される
ヽ(`Д´)ノウワァァァン
組み込みソフトの開発にgccを使用しており、最近gcc3.4からgcc4.4.3に乗り換えたのですが、
-Osの指定でいくつかの関数がインライン展開されてしまい、コードサイズがgcc3.4の時より
明らかに大きくなってしまいます。
で、gccのソースを見てみると以下のようなコードが・・・
プロセッサに関係なく、ほとんどの場合にインライン展開はコードサイズは大きくなると
思うのですが、なぜかこうなっています。
==================== gcc/opts.c ==========================
void
decode_options (unsigned int argc, const char **argv)
{
:略
if (optimize_size)
{
/* Inlining of functions reducing size is a good idea regardless of them
being declared inline. */
flag_inline_functions = 1;
:略
==========================================================
-fno-inline-functionsで問題は回避できるのですが、なぜ-Osで-finline-functionsを
許可しているのか腑に落ちません。
なぜこうなっているのかご存知の方、いらっしゃいませんでしょうか?
-Osの指定でいくつかの関数がインライン展開されてしまい、コードサイズがgcc3.4の時より
明らかに大きくなってしまいます。
で、gccのソースを見てみると以下のようなコードが・・・
プロセッサに関係なく、ほとんどの場合にインライン展開はコードサイズは大きくなると
思うのですが、なぜかこうなっています。
==================== gcc/opts.c ==========================
void
decode_options (unsigned int argc, const char **argv)
{
:略
if (optimize_size)
{
/* Inlining of functions reducing size is a good idea regardless of them
being declared inline. */
flag_inline_functions = 1;
:略
==========================================================
-fno-inline-functionsで問題は回避できるのですが、なぜ-Osで-finline-functionsを
許可しているのか腑に落ちません。
なぜこうなっているのかご存知の方、いらっしゃいませんでしょうか?
補足です。
インライン展開されている関数は(staticのついてない)globalな関数なので、インライン
展開されたコードだけでなく、独立したコードも生成されています。
また、クロスコンパイラだけでなくネイティブ(i686-pc-cygwin-gcc)でも同様の現象を
確認しています。
インライン展開されている関数は(staticのついてない)globalな関数なので、インライン
展開されたコードだけでなく、独立したコードも生成されています。
また、クロスコンパイラだけでなくネイティブ(i686-pc-cygwin-gcc)でも同様の現象を
確認しています。
>>531
実際のところは判りませんが、非常に小さな関数の場合はインライン展開した方がサイズが小さくなります。
例えば、x86で次のようなソースを-Osでコンパイルするとその下のリストのようになります。
--
static int func(int d) {return d * d;}
int ff(int d) {return func(d);}
--
_ff:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
imull %eax, %eax
ret
--
因みに、staticを外したらこうなりました。
--
_func:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
imull %eax, %eax
ret
--
_ff:
pushl %ebp
movl %esp, %ebp
popl %ebp
jmp _func
--
staticじゃない関数もインライン展開してしまうのは、確かにちょっと腑に落ちませんね。
実際のところは判りませんが、非常に小さな関数の場合はインライン展開した方がサイズが小さくなります。
例えば、x86で次のようなソースを-Osでコンパイルするとその下のリストのようになります。
--
static int func(int d) {return d * d;}
int ff(int d) {return func(d);}
--
_ff:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
imull %eax, %eax
ret
--
因みに、staticを外したらこうなりました。
--
_func:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
imull %eax, %eax
ret
--
_ff:
pushl %ebp
movl %esp, %ebp
popl %ebp
jmp _func
--
staticじゃない関数もインライン展開してしまうのは、確かにちょっと腑に落ちませんね。
>>532
早速のレス、ありがとうございます。
-param max-inline-insns-auto (デフォルト値=90)を超えなければ、staticの無いそこそこ大きな関数でもインライン展開されるようです。
下記は、その例です。
http://219.94.194.39/up2/src/fu25205.zip
早速のレス、ありがとうございます。
-param max-inline-insns-auto (デフォルト値=90)を超えなければ、staticの無いそこそこ大きな関数でもインライン展開されるようです。
下記は、その例です。
http://219.94.194.39/up2/src/fu25205.zip
>>534 レス、ありがとうございます。
>まぁあれだ、-Osはそこまで厳密に実装(カスタマイズ?)されていないに違いない。
そうなんですかねえ。
コメントに"good idea"とまで書かれているから単純なバグじゃないと思うんですけど・・・
-Osなんて組み込み以外では使わないだろうから、だれも気に留めてないのかなあ?
>まぁあれだ、-Osはそこまで厳密に実装(カスタマイズ?)されていないに違いない。
そうなんですかねえ。
コメントに"good idea"とまで書かれているから単純なバグじゃないと思うんですけど・・・
-Osなんて組み込み以外では使わないだろうから、だれも気に留めてないのかなあ?
changelogとかでソースの改変履歴を探ってみたら、
誰がいつ改変したかはわかるでしょ。その情報を元にgccのmlのlogを漁ってみたら、何かわかるかもね
誰がいつ改変したかはわかるでしょ。その情報を元にgccのmlのlogを漁ってみたら、何かわかるかもね
>>537 ヒント、ありがとうございます。
ChangeLogでは見つけることができませんでしたが、コメントの
/* Inlining of functions reducing size is a good idea regardless of them
で検索して下記を見つけました。
http://gcc.gnu.org/ml/gcc/2005-07/msg00547/optimize_size
元々、max-inline-insns-autoでサイズが大きくならないようにしていたものを
+ if (optimize_size
+ && newsize > to->global.insns)
と、サイズを厳密に比較するようにこのパッチで変更したようです。
ところが、gcc4.4.3のソースにはこれに該当する部分が見つかりません。
どうも、インライン関係をipa_inline.cに分離したときのドサクサで、この
部分のコードが失われてしまっているようです。
ChangeLogでは見つけることができませんでしたが、コメントの
/* Inlining of functions reducing size is a good idea regardless of them
で検索して下記を見つけました。
http://gcc.gnu.org/ml/gcc/2005-07/msg00547/optimize_size
元々、max-inline-insns-autoでサイズが大きくならないようにしていたものを
+ if (optimize_size
+ && newsize > to->global.insns)
と、サイズを厳密に比較するようにこのパッチで変更したようです。
ところが、gcc4.4.3のソースにはこれに該当する部分が見つかりません。
どうも、インライン関係をipa_inline.cに分離したときのドサクサで、この
部分のコードが失われてしまっているようです。
なぜgccってcluster openmp未サポートなんですか?
バカなの?技術力ないからなの?
バカなの?技術力ないからなの?
>>540
gmp
gmp
>>541
OpenMP自体は実装してるでしょw
Clusterの方はIntelの(R)だし、
Intelのコンパイラで使えるから、
やる気のある人が出にくいんじゃないの?
一応TODOに入ってるみたいだけど。
OpenMP自体は実装してるでしょw
Clusterの方はIntelの(R)だし、
Intelのコンパイラで使えるから、
やる気のある人が出にくいんじゃないの?
一応TODOに入ってるみたいだけど。
>>529
(´・ω・)やっとこ原因がわかったかも・・・orz・・・イマゴロカヨ
問題の部分は、下記の tmp-tm.texi から tm.texi を作成して、後にソース元にある tm.texi と cmp する所でした
改行コードが違う?為に error になっていたらしいです(゚∀゚)
修正して make ・・・今度は lto-plugin の所で sys/wait.h 無い言われて error ・・・アッヒャッヒャ!ヽ(゚∀゚)ノアッヒャッヒャ!
関係無い?けど target.def のディレクトリ先が間違ってるよね?
Makefile.in
----------
s-tm-texi: build/genhooks$(build_exeext) $(srcdir)/doc/tm.texi.in
$(RUN_GEN) build/genhooks$(build_exeext) \
$(srcdir)/doc/tm.texi.in > tmp-tm.texi
$(SHELL) $(srcdir)/../move-if-change tmp-tm.texi tm.texi
@if cmp -s $(srcdir)/doc/tm.texi tm.texi; then \
$(STAMP) $@; \
elif test $(srcdir)/doc/tm.texi -nt $(srcdir)/doc/tm.texi.in \
&& test $(srcdir)/doc/tm.texi -nt $(srcdir)/doc/target.def; then \
echo >&2 ; \
echo You should edit $(srcdir)/doc/tm.texi.in rather than $(srcdir)/doc/tm.texi . >&2 ; \
false; \
else \
echo >&2 ; \
echo Verify that you have permission to grant a GFDL license for all >&2 ; \
echo new text in tm.texi, then copy it to $(srcdir)/doc/tm.texi. >&2 ; \
false; \
fi
----------
(´・ω・)やっとこ原因がわかったかも・・・orz・・・イマゴロカヨ
問題の部分は、下記の tmp-tm.texi から tm.texi を作成して、後にソース元にある tm.texi と cmp する所でした
改行コードが違う?為に error になっていたらしいです(゚∀゚)
修正して make ・・・今度は lto-plugin の所で sys/wait.h 無い言われて error ・・・アッヒャッヒャ!ヽ(゚∀゚)ノアッヒャッヒャ!
関係無い?けど target.def のディレクトリ先が間違ってるよね?
Makefile.in
----------
s-tm-texi: build/genhooks$(build_exeext) $(srcdir)/doc/tm.texi.in
$(RUN_GEN) build/genhooks$(build_exeext) \
$(srcdir)/doc/tm.texi.in > tmp-tm.texi
$(SHELL) $(srcdir)/../move-if-change tmp-tm.texi tm.texi
@if cmp -s $(srcdir)/doc/tm.texi tm.texi; then \
$(STAMP) $@; \
elif test $(srcdir)/doc/tm.texi -nt $(srcdir)/doc/tm.texi.in \
&& test $(srcdir)/doc/tm.texi -nt $(srcdir)/doc/target.def; then \
echo >&2 ; \
echo You should edit $(srcdir)/doc/tm.texi.in rather than $(srcdir)/doc/tm.texi . >&2 ; \
false; \
else \
echo >&2 ; \
echo Verify that you have permission to grant a GFDL license for all >&2 ; \
echo new text in tm.texi, then copy it to $(srcdir)/doc/tm.texi. >&2 ; \
false; \
fi
----------
(´・ω・) patch が出てるようだけど、マージされることを期待して取りあえず次の定期リリースまで放置~
マージされなかった・・・(´;ω;`)
とりあえず disable-lto & CFLAGS へのオプション無し(-O2 とかやると error になった)で一応ビルドは出来た(gcc-4.6-20101016 rev.165566)
とりあえず disable-lto & CFLAGS へのオプション無し(-O2 とかやると error になった)で一応ビルドは出来た(gcc-4.6-20101016 rev.165566)
lto-pluginで失敗するのを回避する方法としては
sys/wait.hをコメントアウトして
WIFEXITED(status)
WEXITSTATUS(status)
をmingw用のを作れば、コンパイルは通りそうだけど
(´・ω・)にはわかんないかな?
sys/wait.hをコメントアウトして
WIFEXITED(status)
WEXITSTATUS(status)
をmingw用のを作れば、コンパイルは通りそうだけど
(´・ω・)にはわかんないかな?
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / gcc スレッド一覧へ
みんなの評価 : ○類似してるかもしれないスレッド
- GCCについて part8 (763) - [95%] - 2009/3/11 8:47 ☆
- GCCについて part10 (538) - [90%] - 2018/7/5 20:30
- 【激遅】AppleGCC【絶望】 (111) - [18446744073709551607%] - 2010/1/15 10:31
トップメニューへ / →のくす牧場書庫について