GCC

2010年04月30日

GCC 本家のサイトトップに、「January 25, 2010 An experimental profile mode has been added. 」と出ているのが気になります。

これは C++ 標準ライブラリ(主にコンテナ系)の使い方についてアドバイスしてくれる機能で、効率改善に役立つとのことです。さっそく試してみました。

続きを読む

2010年04月16日

まだ has been released とは書いてないので微妙ですが、一応 GCC 4.5 が Current release series になり、各ミラーサイトに tar ball も上がっているようです。

4.5 の目玉の一つ LTO は、まだ Windows (PE-COFF target) では動かないようですが、patch が投げられているので、おそらく 4.5.1 あたりに入るのではないでしょうか。

[PATCH,4.6/4.5.1,PR42776] Implement LTO for Windows (PE-COFF) targets.

4.5 は他にも Plugin など、面白そうな機能がたくさん入っています。さっそくビルド… といきたいところですが、GMP/MPFR の他に、MPC/PPL/CLooG-PPL とさらに依存ライブラリが増えているので、ちょっと大変そうです。

とりあえずバイナリをダウンロードして試してみましょう。

続きを読む

2010年02月09日

GCC では -Wall を付けていても、条件コンパイル時に未定義のシンボル参照に対して警告が出ません。そのため、うっかり typo してしまった場合など、わかりにくいバグの原因となり得ます。
$ cat ifdef.c
#if UNDEFINED_SYMBOL
void f(void){}
#endif
$ gcc -Wall -c ifdef.c


-Wundef オプションにより、警告が出るようになります。
$ gcc -Wall -Wundef -c ifdef.c
ifdef.c:1:5: warning: "UNDEFINED_SYMBOL" is not defined
続きを読む

2010年01月22日

GCC のソースツリー中の gcc/config/arm/ 以下には、OCaml という関数型(プログラミングを支援する)言語 ML (Meta-Language) の方言で書かれたプログラムが存在しています。

NEON 命令のためのヘッダ、テストケース、ドキュメントなどを生成するために O'Caml プログラムが使われているようです。

Contents of /trunk/gcc/config/arm/neon-gen.ml
Contents of /trunk/gcc/config/arm/neon-schedgen.ml/a>
Contents of /trunk/gcc/config/arm/neon-testgen.ml
Contents of /trunk/gcc/config/arm/neon.ml
Contents of /trunk/gcc/config/arm/neon-docgen.ml

OCaml は言語処理系の開発によく使用される言語なのですが、まさか GCC の内部でも使われている(直接は関わっていないのですが。生成済みのヘッダが trunk に commit されているので、GCC のビルドの際には O'Caml 処理系は必要ありません。)とは思ってなかったので意外でした。(佐藤先輩に教えていただきました。)

参考リンク:

Modern Compiler Implementation in ML

有名なタイガーブックです。ML の他にも、Java と C による同内容の本が出ていて、Java が一番いろいろなところで参考文献として挙げられている気がします。

Fail-Safe C: 安全なC言語コンパイラ

O'Caml で書かれた C コンパイラです。

CIL (C Intermediate Language)

C のソースコードを解析して、解析が容易な形 (中間言語) に変換する O'Caml のライブラリです。ANSI C だけではなく、GNU 拡張や MS 拡張 (の一部) までサポートしているそうです。ソースコード解析系の研究で、比較的よく使われているような印象です。

2010年01月20日

前回の記事で少し触れた、Linux で使われているソースコード解析ツールである sparse は、Linux Kernel 以外のソースコードに対しても有益そうです。

Sparse - a Semantic Parser for C

MinGW 環境で試してみたところ、ちゃんと GNU C のソースコードを解析することができました。

続きを読む

2010年01月12日

Linux のソースコードでは、ユーザ空間とカーネル空間のポインタを区別するために、__user や __iomem などのマクロを変数に付けています。これは最終的には noderef や address_space(n) などの attribute に落ちて、sparse チェッカーというプログラムによってチェックされます。

参考: sparseチェッカー

これと同じように、異なるアドレス空間を指すポインタ変数に、アドレス空間ごとに任意の名前を付け、静的チェックや自動的に適切なコードを生成してくれるようなしくみがコンパイラにあれば、メモリが複数領域に分かれているような環境でのプログラミング時に便利です。これが名前付きアドレス空間サポートです。

時系列は追いきれてないのですが、2008 年 4 月に RFC が GCC の ML に提案されたようです。

RFC: named address space support

named-addr-spaces-branch という branch が存在し、更新はメインラインにマージされるそうです。
今のところは CELL/spu ターゲット限定のようです。

3.17.37 SPU Options

この方の記事が詳しいです。PIC や AVR などのプロセッサでは、ROM/RAM/FLASH というようにメモリ領域が分かれているため、名前付きアドレス空間のサポートが必要になってくるそうです。

ARMにはまった: GCCの名前つきアドレス空間サポート
ARMにはまった: まだまだねばるPIC用GCC、別アドレス空間の話

2010年01月08日

GCC 4.5 から、libstdc++ のみをスタティックリンクするための -static-libstdc++ オプションが追加されたそうです。

「PATCH RFA: Add -static-libstdc++ option to g++」
http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html

g++ は、過去のバージョンアップで何度か ABI が変わっています(2.95、3.1、3.3、4.0 で互換性が失われているそうです)し、これからも変わる可能性があります。

そのため、場合によっては適切な libstdc++ がダイナミックリンクできなくて、プログラムが動かなくなる可能性があります。
例えば上記の patch の説明では、gcc 自身を g++ でブートストラップする場合などが挙げられています。ビルドプロセスの途中で ABI が異なる g++ が複数動くことになると、ダイナミックリンクでは当然上手く動きません。

注意点として、libstdc++ をダイナミックリンクする C++ コードを dlopen() などを経由して使うことができなくなるようです。

「Re: -static-libgcc, static libstdc++.a and dynamicly loaded so files」
http://gcc.gnu.org/ml/gcc-help/2009-12/msg00186.html

2009年10月30日

長らく 3.x だった MinGW の GCC も、ようやく今年の 6 月に 4.0 がリリースされ、4.x 移行はだいたい終了したのではないかと思われます。今後は 4.x を無視することはできないと思われます。

gcc 3.x から 4.x に移行する際に問題となる変更の 1 つとして、cast-as-lvalue という GCC 拡張の削除があります。
cast-as-lvalue とは、キャストの結果を左辺値として使える、という機能です。
続きを読む

2009年10月08日

twitter で gas の構文は理解しにくいと hmori さんがつぶやいていたのを見て、意外と知られて無さそうなので書きます。

x86 と x86-64 において、gas と GCC が出力するアセンブリコードのデフォルト構文は AT&T 構文と呼ばれる UNIX アセンブラの伝統的な構文です。プログラミングの力を生み出す本や、ふつうのコンパイラをつくろうなど、最初から一貫して AT&T 構文を元にアセンブリプログラミングを解説している書籍も無いことは無いのですが、確かにintel のマニュアルの構文とは引数の順番などが異なるので、慣れないと混乱の元になるのではないかと思います。

また、%レジスタや$即値などの独特のプリフィクスが大量に付くので、見た目が少しゴチャゴチャするようにも感じます。(movl などの b/w/l のように、データ長を指定するサフィックスも便利と言えば便利なのですが、区切りが紛らわしい気もします。サフィックスを付けるならば、mov.l のように区切りがある方が、個人的には好みです。ちょっと脱線しました。)

実は gas (GNU Assembler) は、バージョン 2.10 から、インテル構文 (intel syntax) もサポートしています。

続きを読む

2009年09月30日

GoogleのDiego Novillo氏が、GCCのtrunkに大量のパッチを投げました。

[LTO merge][0/15] Description of the final 15 patches
http://gcc.gnu.org/ml/gcc/2009-09/msg00578.html
http://gcc.gnu.org/ml/gcc-patches/2009-09/

ついにLTO(Link-Time Optimization)branchがGCC trunkにmergeされるようです。

続きを読む

2009年09月18日

私がよく使うgccの便利なオプションをまたひとつ紹介します。

gccのコマンドラインオプションをちょっと調べたいときには、gcc自身のhelpが便利です。

続きを読む

2009年09月10日

この記事ではgcc 4.4.0を使用しています。もっと新しいgccの場合はこちら。

2013年06月27日 ARMのNEONのSIMD命令をgccのオートベクタライズの最適化で使う方法

AndroidのSDKのgoldfishのCPUをcortex-A8に置き換えてNEONのSIMD命令を試す(その2) のときにはarm_neon.hに定義されているintrinsicsを使ってNEONのSIMD命令を生成させました。この方法だとNEONの命令について詳細を知っていなければなりませんし、なによりもそのプログラムがNEONに依存したものになってしまいます。

今回はコンパイラの最適化の機能を使ってNEONのSIMD命令を生成させるコツを紹介します。

続きを読む

2009年07月30日

私がよく使うgccの -save-temps というオプションを紹介します。

続きを読む

2009年07月28日

定義宣言と参照宣言の話に関連して、実際にこのコードをコンパイルして、変数がどう割り当てられるかをみてみましょう。

v.c

int x;  /* (1) */
int y = 0; /* (2) */
int z = 1; /* (3) */
extern int x; /* (4) */

このファイルをコンパイルしてアセンブラ出力の結果を見てみましょう。

gcc -S v.c
続きを読む

記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード