Oracle Solaris Studio 12.2: C ユーザーガイド

第 1 章 C コンパイラの紹介

この章では、Oracle Solaris Studio C コンパイラに関する基本的な情報を紹介します。

1.1 Solaris Studio 12 Update 2 リリースでの Version 5.11 の新機能

C コンパイラの現在のリリースには、次の新機能と変更された機能があります。

ABI の変更により再コンパイルが必要に C コンパイラの変更により、複雑な型が含まれる構造体が 64 ビットモードの SPARC プロセッサで渡されて返される方法が修正されます。以前は、これらの構造体の値は間違ったレジスタで渡されて返され、gcc により作成されるバイナリと互換性がないバイナリが作成されることがありました。この変更は、C コンパイラに実装されている既存の ABI の要素に影響を与えるため、複雑なフィールドを持つ構造体を使用するソースファイルがアプリケーション内にある場合は、間違った応答が返される可能性をなくすため、そのアプリケーションのソースベース全体を再コンパイルする必要があります。32 ビットの SPARC プロセッサ向けと、32 ビットまたは 64 ビットの x86 プロセッサ向けのコンパイルは、この変更の影響を受けません。

1.2 x86 の特記事項

x86 Solaris プラットフォーム用にコンパイルを行う場合に注意が必要な、重要な事項がいくつかあります。

-xarchssesse2sse2a、または sse3 以降に設定してコンパイルしたプログラムは、必ずこれらの拡張と機能を提供するプラットフォームでのみ実行してください。

Solaris 9 4/04 以降の Solaris OS リリースは、Pentium 4 互換プラットフォームでは SSE/SSE2 に対応しています。これより前のバージョンの Solaris OS は SSE/SSE2 に対応していません。-xarch で選択した命令セットが、実行中の Solaris OS で有効ではない場合、コンパイラはその命令セットのコードを生成またはリンクできません。

コンパイルとリンクを個別に行う場合は、必ずコンパイラを使ってリンクし、同じ -xarch 設定で正しい起動ルーチンがリンクされるようにしてください。

x86 の 80 ビット浮動小数点レジスタが原因で、x86 での演算結果が SPARC の結果と異なる場合があります。この差を最小にするには、-fstore オプションを使用するか、ハードウェアが SSE2 をサポートしている場合は -xarch=sse2 でコンパイルします。

Solaris と Linux でも、固有の数学ライブラリ (たとえば、sin(x)) が同じではないため、演算結果が異なることがあります。

1.3 バイナリの互換性の妥当性検査

Solaris システムの Solaris Studio 11 以降では、Solaris Studio コンパイラによってコンパイルされたプログラムのバイナリには、そのコンパイル済みバイナリによって想定されている命令セットを示すアーキテクチャーハードウェアフラグが付いています。実行時にこれらのマーカーフラグが検査され、実行しようとしているハードウェアで、そのバイナリが実行できることが確認されます。

これらのアーキテクチャーハードウェアフラグを含まないプログラムを、適切な機能または命令セット拡張に対応していないプラットフォームで実行すると、セグメント例外、または明示的な警告メッセージなしの不正な結果が発生することがあります。

このことは、.il インラインアセンブリ言語関数を使用しているプログラムや、SSE、SSE2、SSE2a、SSE3 の命令、およびより新しい命令と拡張機能を利用している __asm() アセンブラコードにも当てはまります。

1.4 64 ビットプラットフォーム用のコンパイル

ILP32 32 ビットモデル用にコンパイルするには、—m 32 オプションを使用します。ILP64 64 ビットモデル用にコンパイルするには、—m64 オプションを使用します。

C 言語の int、long、およびポインタデータ型を指定する ILP32 モデルは、すべて 32 ビット拡張です。long およびポインタデータ型を指定する LP64 モデルは、すべて 64 ビット拡張です。Solaris および Linux OS は、LP64 メモリーモデルの大きなファイルや配列もサポートします。

—m64 を使用してコンパイルを行う場合、結果の実行可能ファイルは、64 ビットカーネルを実行する Solaris OS または Linux OS の 64 ビット UltraSPARC または x86 プロセッサでのみ動作します。コンパイル、リンク、および 64 ビットオブジェクトの実行は、64 ビット実行をサポートする Solaris または Linux OS でのみ行うことができます。

1.5 準拠規格

このマニュアルで使用される C99 という用語は、ISO/IEC 9899:1990 の C プログラミング言語を表します。C90 という用語は、ISO/IEC 9899:1990 の C プログラミング言語を意味します。

Solaris プラットフォーム上では、このコンパイラは、C99 規格に完全に準拠しています (-xc99=all,lib —Xc を指定した場合)。

このコンパイラはまた、『Programming Language - C (ISO/IEC 9899:1999)』規格にも準拠しています。

このコンパイラは従来の K&R C (Kernighan と Rithcie、つまり ANSI C の前段階) もサポートしているため、ISO C への移行が容易に行えます。

C90 の実装固有の動作については、「D.1.17 _Pragma」を参照してください。

C99 機能の詳細は、表 C–6 を参照してください。

1.6 C Readme ファイル

C コンパイラの readme ファイルでは、コンパイラに関する重要な情報について説明しています。これは、『Oracle Solaris Studio 12.2 リリースの新機能』ガイドの一部となりました。次の内容が含まれています。

新機能』ガイドを参照するには、http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation にある Oracle Solaris Studio 12.2 のドキュメントページにアクセスしてください。

1.7 マニュアルページ

オンラインマニュアル (man) ページは、コマンド、関数、サブルーチン、およびそれらの集合について即座に参照できるドキュメントを提供します。

次のコマンドを実行することにより、C コンパイラのマニュアルページを表示できます。


example% man cc

C のドキュメント全体を通して、マニュアルページのリファレンスは、トピック名とマニュアルのセクション番号で表示されます。cc(1) を表示するには、man cc と入力 します。たとえば ieee_flags(3M) など、ほかのセクションを表示するには、man コマンドに -s オプションを使用します。


example% man -s 3M ieee_flags

1.8 コンパイラの構成

C コンパイルシステムはコンパイラ、アセンブラ、およびリンカーから構成されます。cc コマンドは、コマンド行オプションでほかの指定をしないかぎり、この 3 つの構成要素をそれぞれ自動的に起動します。

表 A–15 では、cc コマンドで使用できるオプションについて説明しています。

次の図に C コンパイルシステムの構成を示します。

図 1–1 C コンパイルシステムの構成

C コンパイルシステムのコンポーネントを示す図

次の表は、コンパイルシステムの構成要素を要約したものです。

表 1–1 C コンパイルシステムの構成要素

コンポーネント  

内容の説明  

使用時の注意  

cpp

プリプロセッサ (前処理系) 

-Xs のみ

acomp

コンパイラ (-Xs 以外のモードではプリプロセッサが組み込まれている)

 

ssbd

静的同期バグ検出 

(SPARC)

iropt

コードオプティマイザ 

-O-xO2-xO3-xO4-xO5-fast

fbe

アセンブラ 

 

cg

コード生成、インライン機能、アセンブラ 

ipo

内部手続きオプティマイザ 

postopt

ポストオプティマイザ 

(SPARC)

ir2hf

中間コード翻訳 

(x86) 

ube

コードジェネレータ 

(x86) 

ld

リンカー 

 

mcs

コメントセクションの操作 

-mr

1.9 C 関連のプログラミングツール

C プログラムの開発、保守、改良を行うときに役立つツールは多数あります。本書では、C にもっとも密接な 2 つのツール、cscopelint について説明します。また、ツールごとにマニュアルページが用意されています。