JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: C ユーザーガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  C コンパイラの紹介

2.  C コンパイラ実装に固有の情報

2.1 定数

2.1.1 整数定数

2.1.2 文字定数

2.2 リンカースコープ指示子

2.3 スレッドローカルな記憶領域指示子

2.4 浮動小数点 (非標準モード)

2.5 値としてのラベル

2.6 long long データ型

2.6.1 long long データ型の入出力

2.6.2 通常の算術変換

2.7 Switch 文内の Case 範囲

2.8 表明

2.9 サポートされる属性

2.10 警告とエラー

2.11 プラグマ

2.11.1 align

2.11.2 c99

2.11.3 does_not_read_global_data

2.11.4 does_not_return

2.11.5 does_not_write_global_data

2.11.6 dumpmacros

2.11.7 end_dumpmacros

2.11.8 error_messages

2.11.9 fini

2.11.10 hdrstop

2.11.11 ident

2.11.12 init

2.11.13 inline

2.11.14 int_to_unsigned

2.11.15 must_have_frame

2.11.16 nomemorydepend

2.11.17 no_side_effect

2.11.18 opt

2.11.19 pack

2.11.20 pipeloop

2.11.21 rarely_called

2.11.22 redefine_extname

2.11.23 returns_new_memory

2.11.24 unknown_control_flow

2.11.25 unroll

2.11.26 warn_missing_parameter_info

2.11.27 weak

2.12 事前に定義されている名前

2.13 errno の値の保持

2.14 拡張機能

2.14.1 _Restrict キーワード

2.14.2 _ _asm キーワード

2.14.3 __inline__inline__

2.14.4 __builtin_constant_p()

2.14.5 __FUNCTION____PRETTY_FUNCTION__

2.15 環境変数

2.15.1 PARALLEL

2.15.2 SUN_PROFDATA

2.15.3 SUN_PROFDATA_DIR

2.15.4 TMPDIR

2.16 インクルードファイルを指定する方法

2.16.1 -I- オプションによる検索アルゴリズムの変更

2.16.1.1 警告

2.17 フリースタンディング環境でのコンパイル

2.18 Intel MMX および拡張 x86 プラットフォーム組み込み関数のためのコンパイラサポート

3.  C コードの並列化

4.  lint ソースコード検査プログラム

5.  型に基づく別名解析

6.  ISO C への移行

7.  64 ビット環境に対応するアプリケーションへの変換

8.  cscope: 対話的な C プログラムの検査

A.  機能別コンパイラオプション

B.  C コンパイラオプションリファレンス

C.  ISO/IEC C 99 の処理系定義の動作

D.  C99 の機能

E.  ISO/IEC C90 の処理系定義の動作

F.  ISO C データ表現

G.  パフォーマンスチューニング

H.  Oracle Solaris Studio C: K&R C と ISO C の違い

索引

2.17 フリースタンディング環境でのコンパイル

Oracle Solaris Studio C コンパイラは、標準 C ライブラリにリンクされたプログラムのコンパイルや、標準 C ライブラリおよびほかの実行時サポートライブラリが含まれる実行環境での実行をサポートします。C 標準では、そのような環境はホスト環境と呼ばれます。標準ライブラリ関数を提供しない環境は、フリースタンディング環境と呼ばれます。

コンパイルされたコードから呼び出される可能性のある特定の実行時サポート関数は通常、標準 C ライブラリでのみ使用可能なため、C コンパイラはフリースタンディング環境での一般的なコンパイルをサポートしません。問題は、コンパイラによるソースコードの変換によって、関数呼び出しを含まないソースコード構造体で実行時サポート関数への呼び出しが導入される場合があり、これらの関数は通常フリースタンディング環境で使用できないことです。次の例を考えてみましょう。

% cat -n lldiv.c
     1    void
     2    lldiv(
     3        long long *x,
     4        long long *y,
     5        long long *z)
     6    {
     7        *z = *x / *y ;
     8    }
% cc -c -m32 lldiv.c
% nm lldiv.o | grep " U "
 0x00000000 U __div64
% cc -c -m64 lldiv.c
% nm lldiv.o | grep " U "

この例では、-m32 オプションを使用して 32 ビットプラットフォームで実行するようにソースファイル lldiv.c がコンパイルされると、行 7 の文の変換が __div64 という名前の実行時サポート関数への外部参照となります。これは、標準 C ライブラリの 32 ビットバージョンでのみ使用できます。

同じソースファイルが -m64 オプションを使用して 64 ビットプラットフォームで実行するようにコンパイルされると、コンパイラはターゲットマシンの 64 ビット算術命令セットを使用するため、標準 C ライブラリの 64 ビットバージョンでの実行時サポート関数が不要になります。

フリースタンディング環境をターゲットとする C コンパイラの使用は一般的な事例ではサポートされませんが、特定のフリースタンディング環境 (つまり Oracle Solaris カーネルとデバイスドライバ) 用にコードをコンパイルするためにコンパイラを使用することはできます (警告が生成されます)。

デバイスドライバなど、Oracle Solaris カーネルで実行されるコードは、外部関数呼び出しがカーネル内で使用可能な関数のみ参照するように記述する必要があります。これを可能にするため、次のガイドラインが推奨されます。

前述のように、ソースコードの変換の結果、コンパイラにより実行時サポート関数への呼び出しが生成されることがあります。Oracle Solaris カーネルの特定の事例では、カーネルが浮動小数点型や複合型、数学ライブラリ関数、または実行時サポートライブラリに関連付けられたコンパイラオプションを使用しないため、呼び出される可能性のある実行時サポート関数のセットが一般的な事例より小さくなります。

次の表に、C コンパイラによるソースコード変換の結果、Oracle Solaris カーネルで実行するためにコンパイルされたコードで呼び出される可能性のある実行時サポート関数を示します。この表に、ソースコードの変換で呼び出しが生成されるプラットフォーム、呼び出される関数の名前、関数呼び出しを引き起こすソース構造体またはコンパイラ機能を示します。C コンパイラをサポートする Solaris のすべてのバージョンで 64 ビットカーネルが実行されるため、64 ビットプラットフォームだけがリストに示されています。

32 ビット命令セット用にコンパイルすると、命令セットに固有の制限があるため、追加のマシン固有のサポート関数が呼び出されることがあります。

表 2-4 実行時サポート関数

関数
64 ビットプラットフォーム
参照元
__align_cpy_n
SPARC
大きい構造体を返します。n は 1、2、4、8、または 16 です。
_memcpy
x86
大きい構造体を返します。
_memcpy
x86 および SPARC
ベクトル化。
_memmove
x86 および SPARC
ベクトル化。
_memset
x86 および SPARC
ベクトル化。

一部のバージョンのカーネルは、_memmove()_memcpy()、または _memset() を提供しませんが、ユーザーモードルーチン memmove()、memcpy()、および memset() のカーネルモードアナログは提供する点に注意してください。

x86 プラットフォーム向けの Solaris カーネルコードをコンパイルする際にはオプション -xvector=%none を使用する必要がある点に注意することが重要です。C コンパイラは、x86 プラットフォーム上ではデフォルトで、XMM レジスタを使用するコードを生成することにより、C の浮動小数点算術型を使用しないアプリケーションなど、一般的なユーザーアプリケーションのパフォーマンスを改善します。XMM レジスタの使用は、カーネルコードでは不適切です。

追加情報については、『Writing Device Drivers Guide』および『SPARC Compliance Definition, version 2.4』を参照してください。