元スレGCCについて part9
gcc覧 / PC版 /みんなの評価 : ○
501 = :
GCCで文字コードをunicodeで
やるにはどうしたらできますか?
502 = :
「やる」とはどういうことか定義してくれ。
503 = :
unicode文字列をwstringにインプットするにはどうやりますか?
505 = :
いいえ、それはなにか設定が無いと出来ないから
教えてください。
507 = :
オプションで -finput-charset と -fwide-exec-charset に文字コードを指定すればいいかもね。
gcc をビルドするときに iconv がリンクされていない場合には使えないけど。
あと、ライブラリ側も貧弱なことがある。
508 = :
>>505
できないというなら、やってみてどうなったのか言ってみろよ。
510 = :
自己解決
>>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にこういう使い方があるとは・・・
511 = :
#errorの行に到達したら即座に処理を停止するオプションとかってありますか?
何がしたいのかというと,コンパイル時に-Dオプションでパラメタを与えていて
パラメタを書き忘れた場合にずらずらと大量のエラーが表示されるのを防ぎたいのです.
#ifndef ~
#error ~~~ <-- ここに到達したら即座に停止する
#endif
512 = :
>>511 いや、それだけで停止するだろ。
513 = :
4.5で
wstring=u"あいう"とやったらエラーになりました
uをLに変えてもエラーになりました。
const char*=u8"あいう"とやったらエラーにならないけれど
文字コードはSJISでした。
ユニコードにするにはどうしたらいいですか?
515 = :
もしもGCCでユニコードがつかえるときのためには
strings<T>のTを変えるだけで出来るようにプログラムを作っておけばいいんですか?
それとも他に何か必要ですか?
516 = :
必要ありますん
517 = :
ありますんとは否定形ですかそれとも肯定形ですか?
518 = :
曖昧形です
519 = :
ん
523 = :
リンカスクリプトの中で#ifdef~#endifみたいなことをやる方法はありますか?
やりたいことはROM焼きの時とモニタ上で動かす時で各セクションのアドレスを変えたいのですが
リンカスクリプトをコピーして書き換えるのは嫌だなぁと・・・
524 = :
Makefileでcppを使って生成するんじゃだめかね
525 = :
>>523
条件式とDEFINED組み込み関数があるじゃん。
526 = :
リンカスクリプト二つ用意して、
makeするときに、
ROM焼きとモニタの二つが出来るようにしておくとか
527 = :
レスありがとうございます
>>524
単なるテキスト整形ツールとしてcppを使うわけですね
diffとpatchでとは思っていたんですがそれは思いつきませんでした
>>525
DEFINEDを見落としていました
まだ成功してませんがこれでいけそうな・・・感じ
>> 526
2つ用意するのが面倒という話でして
528 = :
メモリの割り当てが違うぐらいだと思うんだけどな
529 = :
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.
って最後に表示される
ヽ(`Д´)ノウワァァァン
530 = :
組み込みソフトの開発に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を
許可しているのか腑に落ちません。
なぜこうなっているのかご存知の方、いらっしゃいませんでしょうか?
531 = :
補足です。
インライン展開されている関数は(staticのついてない)globalな関数なので、インライン
展開されたコードだけでなく、独立したコードも生成されています。
また、クロスコンパイラだけでなくネイティブ(i686-pc-cygwin-gcc)でも同様の現象を
確認しています。
533 = :
>>532
早速のレス、ありがとうございます。
-param max-inline-insns-auto (デフォルト値=90)を超えなければ、staticの無いそこそこ大きな関数でもインライン展開されるようです。
下記は、その例です。
http://219.94.194.39/up2/src/fu25205.zip
534 = :
まぁあれだ、-Osはそこまで厳密に実装(カスタマイズ?)されていないに違いない。
必要に応じて制限すればよかろ。
それにしても、>532の最後のjmpは秀逸だな。
535 = :
そう?
536 = :
>>534 レス、ありがとうございます。
>まぁあれだ、-Osはそこまで厳密に実装(カスタマイズ?)されていないに違いない。
そうなんですかねえ。
コメントに"good idea"とまで書かれているから単純なバグじゃないと思うんですけど・・・
-Osなんて組み込み以外では使わないだろうから、だれも気に留めてないのかなあ?
537 = :
changelogとかでソースの改変履歴を探ってみたら、
誰がいつ改変したかはわかるでしょ。その情報を元にgccのmlのlogを漁ってみたら、何かわかるかもね
538 = :
>>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に分離したときのドサクサで、この
部分のコードが失われてしまっているようです。
540 = :
なぜgccってcluster openmp未サポートなんですか?
バカなの?技術力ないからなの?
542 = :
コンパイラの領分じゃないと考えてるんじゃないの?
543 = :
>>540
gmp
544 = :
>>541
OpenMP自体は実装してるでしょw
Clusterの方はIntelの(R)だし、
Intelのコンパイラで使えるから、
やる気のある人が出にくいんじゃないの?
一応TODOに入ってるみたいだけど。
547 = :
>>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
----------
549 = :
マージされなかった・・・(´;ω;`)
とりあえず disable-lto & CFLAGS へのオプション無し(-O2 とかやると error になった)で一応ビルドは出来た(gcc-4.6-20101016 rev.165566)
550 = :
lto-pluginで失敗するのを回避する方法としては
sys/wait.hをコメントアウトして
WIFEXITED(status)
WEXITSTATUS(status)
をmingw用のを作れば、コンパイルは通りそうだけど
(´・ω・)にはわかんないかな?
みんなの評価 : ○
類似してるかもしれないスレッド
- 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
トップメニューへ / →のくす牧場書庫について