|
|
▽SOFT :
NET :
studio A@T :
my DataBase
|
|
▽GCC :
java
|
紹介 :
履歴 :
▼取説 :
その他
| | |
Charlie 版 GCC として配布されているファイルの一覧を示します。 ただし、全てのファイルが単一のアーカイブとして配布されているとは 限りません。
1st.pen(tex) 2nd.pen(tex) gcc.doc.html gcc2.doc.html gcc3.doc.html COPYING FSF オリジナルのライセンス表示 COPYING.LIB FSF オリジナルのライブラリに関するライセンス表示 NEWS FSF による、最近のバージョンアップ概要 PROBLEMS FSF による、未解決不具合 PROJECTS FSF による、最適化をより有効にするソース記述のコツ SERVICE FSF のスタッフリスト gcc2.doc objc/readme.x68 Objective-C のインストールについて補足 objc/readme.doc Objective-C の文法 gcc2.x コンパイルドライバ g2cpp.x プリプロセッサ g2as.x アセンブラ g2lk.x リンカ g2cc1.x Cコンパイラ g2cc1plus.x G++コンパイラ g2cc1obj.x Objective-C コンパイラ libgcc.a Human68k 用ライブラリ libgccsx.a SX 用ライブラリ libobjc.a Human68k 用 Objective-C ライブラリ libobjcsx.a SX 用 Objective-C ライブラリ as/ アセンブラのドキュメントなど lk/ リンカのドキュメントなど include/objc/ Objective-C 用のヘッダファイル objc/sample/ Objective-C のサンプルプログラム
以上でインストールは完了しました。
予期した動作をしない場合、まずは付属のドキュメントなどを再度 読み直してみて下さい。前のバージョンから仕様が変更されているかも しれません。
ドキュメントを読んでも明らかではない、あるいはバスエラー等 どうみてもバグとしか思えない状態に陥る、そんな場合は作者に報告し て下さい。
GCC2 は巨大なプログラムですから、バグの存在は分かっていても 直ちに原因を突き止められないこともしばしばです。不具合の報告を される時には、不具合を再現可能にする情報をできる限り添えて下さい。 すなわち、
などです。 サポート窓口へメイルを出す
Charlie 版 は GCC 2.6.3 をベースに、まりこ版に近い改造を 施してありますが細かい違いもあります。この章ではまりこ版を 使用しているユーザーを対象にそういった仕様の違いを解説します。 なお、ここに明言されていないものでもまりこ版の Ver.1.41 以降の 改良、仕様変更には対応していないことがあります。
まりこ版と Charlie 版の機能比較
| まりこ版 | Charlie 版 |
|---|---|
| 環境変数 | |
| MARINA | GCC2_ED |
| MARIKO | GCC2_OPTION0 |
| GCC_OPTION | GCC2_OPTION1 |
| GCC_AS | 同等の機能なし |
| GCC_LINK | 〃 |
| SX モード | |
| -SX | まりこ版と同等 |
| -z-stack= | |
| -z-heap= | |
| LASCII 文字列 | |
| SXCALL | |
| DOSCALL | |
| remote | |
| relocate | |
| common | |
| -fpicでSXモード | -fpic は使用できない |
| 拡張機能 | |
| pcr | まりこ版と同様 |
| -fansi-only | |
| 2 進表記中の「_」 | |
| ジャンプ系命令 | |
| デフォルトは jbsr | まりこ版と同様 |
| -fall-bsr | まりこ版と同様 |
| -fall-jsr は廃止 | -fall-jsr は存在 |
| -mregparm | 動作チェック未済 |
| コマンドライン | |
| 自力 wild-card展開 | 展開機能なし(HUPAIR 対応) |
| -+-+- | インダイレクト機能なし |
| テンポラリの .o ファイルを生成するディレクトリ | |
| カレント | 環境変数 temp |
int * wide = L"a""b";
をコンパイルすると
| まりこ版 | 00 00 82 81 00 00 00 82 00 00 00 82 00 00 00 00 |
|---|---|
| Charlie版 | 00 00 82 81 00 00 82 82 00 00 00 00 |
| 文字 | 機能 |
|---|---|
| # | 現在処理中の関数名、処理進行度を表示する |
| B | 関数の真偽値引数を最適化する |
| D | コンパイラが必要だと判断した時に nop を出力させる |
| I | 浮動小数点数値をメモリを介さず即値で扱うよう試みる |
| L | ループの条件判定に関する最適化を単純に行う |
| l | ループの条件判定に関する最適化を慎重に行う |
| M | 複数文字の文字定数の warning を抑制する |
| S | ビット数以上の右シフトでも asr を出力する |
| U | 未宣言の識別子は一度しか報告しない旨のwarningを抑制する |
| Z | メモリに 0 を代入する際にはレジスタを介するようにする |
↓ ┌ループ開始時の条件判定 │ ↓ │ループ内処理←──────┐ │ ↓ │ │条件判定─────────┘ └→↓ループの前の部分にもコード展開します。ループ開始時には条件の 真偽値の一部が分かっていることがあるので、その場合には条件判 定コードを省いて速度の向上が見込めます。 しかし大部分のループでは真偽値が分からないため、ただ単に条 件判定コードが増えるだけになってしまいます。 そこで Charlie 版のデフォルトでは 1.x と同様に
↓ ┌─┘ │ループ内処理←──────┐ └→↓ │ 条件判定─────────┘ ↓と展開します。GCC2_OPTION2 に L を記述すると本来の 2.x の展 開方法を用います。実際に試せば分かりますが、かなり特殊な状況で なければ効果は期待できません。 また l を記述すると、判定部分が非常に小さくなることが 分っている場合(分岐命令が1つと、付随する0〜2つの代入・比較命令のみ)だけ 展開を行うようにします (この場合、コードサイズ的には 2〜8 bytes 程度の損をする代わりに 10 clock 分程度の得をする換算になります)。
void foo (int *p, int *q) {
int r = *p;
bar (r, (*q = 0, *p));
}
のような場合に第 2 引数も r にしてしまいます。よって、この最適化は
-fcache-memref を指定した時にのみ機能するように変更しました。
-xc cpp → cc1 (.c)
c++ cpp → cc1plus (.cc .cxx .C)
objective-c cpp → cc1obj (.m)
cpp-output cc1 (.i)
c++-cpp-output cc1plus (.ii)
objective-c-cpp-output cc1obj
assembler as (.s)
assembler-with-cpp cpp → as (.S)
none 拡張子で識別するモードに戻す
です。 -xnone については、ソースより、
/* Suppress the warning if -xnone comes after the last input file,
because alternate command interfaces like g++ might find it
useful to place -xnone after each input file. */
だそうです。
gcc2 -dumpspecs > /lib/specs
などとやると生成されるテキストファイルです。エディタで編集
することで、自分の環境に合わせた設定を行うことができます。
内容は、
*〜〜: (設定項目)
内容
(1 空行、すなわち改行コード 1 個)
の繰り返しです。内容を省略する場合は、*〜〜:の後に空行が
2 行続くことになります。内容が 2 行以上にわたる場合は、C で
文字列を次行につなげるのと同様に
*lib:
%{lne*tstep:appkit.a%s} \
%{lne*tstep:soundkit.a%s} \
%{lne*tstep:musickit.a%s} \
%{lc@iro:ole.a%s}
*startfile:
などとします。空行を必要以上に記述してはいけません。
*lib:
(空行)
を
*lib:
%{ldos:libdos2.a%s}
^
としておけば、-ldos を指定した時に、libdos2.a をリンクする
ようになります。specs が見付からない場合や、specs 内に記述
されていない場合、-l** は
lib**.{環境変数 GCC_LIB(デフォルト`.a')}
に展開されます。
なお、GCC_LIB は specs に記述してしまったものには効きません。
(つまり、上の例では libdos2 は .a しか探さない、ということ。)
ほかに手軽に使えそうなものとして、specs 内の
*predefines:
-Dmc68000 -Dhuman68k -DHUMAN68K -DMARIKO_CC -Dmariko_cc
に、定義しておきたいものを記述しておけば、プリプロセッサに
渡されます。前後に __ がないものは(上の例では全て)、
mc68000
__mc68000
__mc68000__
のように 3 通りに展開されます。 __ を含んでいるものは、加工
なしで渡されます。
常時:mc68000 human68k HUMAN68K MARIKO_CC mariko_cc
__mc68000 __human68k __HUMAN68K __MARIKO_CC __mariko_cc
__mc68000__ __human68k__ __HUMAN68K__ __MARIKO_CC__
__mariko_cc__
__GNUC__=2 __GNU_MINOR__=6
-SX:SX_GCC __SX_GCC__
G++:__GNUG__=2 __cplusplus
-funsigned-char:__CHAR_UNSIGNED__
-ansi:__STRICT_ANSI__
-O* (0 以外):__OPTIMIZE__
-mshort:__MSHORT__
-m68881:__HAVE68881__
-m68020:__MC68020__
-m68020-40:__MC68020__
-m68030:__MC68020__ __MC68030__
-m68040:__MC68020__ __MC68040__ __HAVE68881__
です。
char *a;
char *f1(char *c){
char *q=16;
while(*q==0)*q++=0;
// ループを抜けると、q は不定
a=(char*)((((unsigned int)q)+15)&-16);
while(*q==0)*q++=0;
}
移植の際に処理を変更してありますが、エンバグの可能性が
あります。
int func(void){
register int x asm("a0");
asm("someCmd" : "=a"(x));
return x;
}
移植の際に処理を変更してありますが、エンバグの可能性があります。
typedef struct W {
short o;
char f;
} W;
typedef struct MW {
int o;
} MW;
void
foo(W *wp, MW *mwp)
{
for (; wp;) {
for (; mwp;)
if (mwp->o == wp->o)
wp->f = 0;
}
}
移植の際に処理を変更してあり誤ったコードを出力しないようにしてあり
ますが、そのために original の持つ最適化性能の一部が損なわれています。
全体は GPL に準拠していますが、アセンブラ/リンカは GNU ware ではありませんので、取り扱いには十分注意して下さい。
なお、g2as に関しては
初期の段階から協力をいただいている中村ちゃぷに氏、HAS,FAS,HLK のソースを提供してくださった YuNK 氏、H.O 氏、SALT 氏、バグ潰し の叩き台として SXgzip を与えてくださった BAA 氏、連日の修正で 負担をお掛けしたひどり氏、そして network SX の皆さんに感謝いたし ます。 また、移植にあたって数多くの作品を利用させていただきました。 関係者の方々に感謝いたします。以下にその一部を掲示させていただき ます。
GCC まりこ版 1.39 X6_05 〜 1.28(TOOLS) microEmacs J1.31 Gnu Make/Awk/Sed GDB HAS/FAS HLK HAR LIBC TwentyOne hcommand ITA TOOLS lndrv/execd ksh/bash TMN/tmsio Gnu zip/tar LHA/ISH Bdif/Bup SXgzip
Link point is
http://www.kyagroup.com/soft/gcc/