ARM® デベロッパスイート - ARM Information Center

ARM デベロッパスイート
®
バージョン 1.2
コンパイラおよびライブラリガイド
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM デベロッパスイート
コンパイラおよびライブラリガイド
Copyright © 1999-2001 ARM Limited. All rights reserved.
リリース情報
本書の改訂履歴は以下の通りです。
改訂履歴
日付
発行
変更内容
1999 年 10 月
A
リリース 1.0
2000 年 3 月
B
リリース 1.0.1
2000 年 11 月
C
リリース 1.1
2001 年 11 月
D
リリース 1.2
著作権
または ™ のマークが付いた言葉およびロゴは、ARM 社が所有する登録商標または商標です。本書
に記載されている他の製品名は、各社の所有する商標です。
®
本書に記載されている情報の全部または一部、ならびに本書で紹介する製品は、著作権所有者の
文書による事前の許可を得ない限り、転用・複製することを禁じます。
本書に記載されている製品は、今後も継続的に開発・改良の対象となります。本書に含まれる製
品およびその利用方法についての情報は、ARM が利用者の利益のために提供するものです。した
がって当社では、製品の市販性または利用の適切性を含め、暗示的・明示的に関係なく一切の責
任を負いません。
本書は、本製品の利用者をサポートすることだけを目的としています。本書に記載されている情
報の使用、情報の誤りまたは省略、あるいは本製品の誤使用によって発生したいかなる損失・損
傷についても、ARM 社は一切責任を負いません。
ii
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
目次
ARM デベロッパスイートコンパイラおよび
ライブラリガイド
序章
本書について ................................................................................................. viii
ご意見・ご質問...............................................................................................xii
第1章
はじめに
1.1
1.2
1.3
1.4
第2章
C および C++ コンパイラ
2.1
2.2
2.3
第3章
C および C++ コンパイラについて............................................................... 2-2
ファイルの使用方法...................................................................................... 2-4
コマンド構文 ................................................................................................ 2-9
ARM コンパイラリファレンス
3.1
3.2
3.3
3.4
ARM DUI0067DJ-00
コンパイラおよびライブラリについて ......................................................... 1-2
ARM コンパイラおよびライブラリ .............................................................. 1-3
コンパイル済みオブジェクトのリンク......................................................... 1-5
関連ユーティリティ...................................................................................... 1-6
コンパイラ固有の機能 .................................................................................. 3-2
言語拡張...................................................................................................... 3-17
C および C++ の実装情報 ........................................................................... 3-22
事前定義マクロ........................................................................................... 3-32
Copyright © 1999-2001 ARM Limited. All rights reserved.
iii
目次
第4章
C および C++ ライブラリ
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
4.15
第5章
浮動小数点サポート
5.1
5.2
5.3
5.4
5.5
付録 A
EC++ のサポート ......................................................................................... C-2
積分変換 ....................................................................................................... C-3
純仮想関数の呼び出し.................................................................................. C-4
二次的な言語機能のサポート....................................................................... C-5
主要言語機能のサポート .............................................................................. C-7
標準 C++ ライブラリ実装定義 ..................................................................... C-8
C および C++ コンパイラの実装に関する制限
D.1
D.2
D.3
D.4
iv
実装定義 ....................................................................................................... B-2
標準 C++ 実装定義
C.1
C.2
C.3
C.4
C.5
C.6
付録 D
via ファイルの概要....................................................................................... A-2
構文 .............................................................................................................. A-3
標準 C 実装定義
B.1
付録 C
浮動小数点サポート ..................................................................................... 5-2
ソフトウェア浮動小数点ライブラリ:fplib.................................................. 5-3
浮動小数点環境の制御.................................................................................. 5-8
数学ライブラリ:mathlib ........................................................................... 5-24
IEEE 754 算術演算 ..................................................................................... 5-30
Via ファイル構文
A.1
A.2
付録 B
ランタイムライブラリについて ................................................................... 4-2
C ライブラリを使用するアプリケーションの作成 ...................................... 4-6
C ライブラリを使用しないアプリケーションの作成................................. 4-13
新しい実行環境に合わせた C ライブラリのカスタマイズ......................... 4-20
スタティックデータアクセスのカスタマイズ............................................ 4-25
ロケールと CTYPE のカスタマイズ........................................................... 4-26
エラー通知、エラー処理、プログラム終了のカスタマイズ ...................... 4-50
記憶域管理のカスタマイズ ........................................................................ 4-57
ランタイムメモリモデルのカスタマイズ................................................... 4-66
I/O 関数のカスタマイズ ............................................................................. 4-74
その他の C ライブラリ関数のカスタマイズ .............................................. 4-84
リアルタイム除算の選択 ............................................................................ 4-89
ISO 実装定義 .............................................................................................. 4-90
C ライブラリ拡張 ....................................................................................... 4-98
ライブラリ命名規則 ................................................................................. 4-104
C++ ISO/IEC 標準の制限.............................................................................. D-2
内部制限 ....................................................................................................... D-4
積分数の制限 ................................................................................................ D-5
浮動小数点数の制限 ..................................................................................... D-6
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
目次
用語集
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
v
目次
vi
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
序章
本章では、ARM デベロッパスイート(ADS)に含まれているツールおよび参考文献に
ついて説明します。本章は以下のセクションから構成されています。
•
本書について:P. viii
•
ARM DUI0067DJ-00
ご意見・ご質問:P. xii
Copyright © 1999-2001 ARM Limited. All rights reserved.
vii
序章
本書について
この資料では ADS に関する参考情報を提供しています。コンパイラに対するコマンド
ラインオプションを説明します。ARM の C/C++ コンパイラと C ライブラリの実装に
関する参考情報も記載しています。
対象読者
本書は、ADS を使用してアプリケーションを作成する全ての開発者を対象とし、読者
が経験豊富なソフトウェア開発者であることを想定して書かれています。本書の内容
は、ADS のセットアップガイドで説明している ARM 開発ツールに精通した経験豊富
なソフトウェア開発者を想定して書かれています。
本書の構成
本書は以下の章および付録から構成されています。
第1章
はじめに
ADS v1.2 コンパイラおよびライブラリについて概説します。
第2章
C および C++ コンパイラ
ARM C および C++ コンパイラに使用することができる全てのコマンド
ラインオプションについて説明します。
第3章
ARM コンパイラリファレンス
ARM C および C++ コンパイラで提供されている言語機能、標準適合性
および実装の詳細について説明します。
第4章
C および C++ ライブラリ
各ライブラリ関数を再実装する際の ARM C および C++ ライブラリと命
令の使用方法について説明します。
第4章
C および C++ ライブラリ
ADS の浮動小数点サポートについて説明します。
付録 A
Via ファイル構文
Via ファイルの構文について説明します。Via ファイルを使用すると、多
くの ARM ツールに対するコマンドライン引数を指定することができま
す。
付録 B
標準 C 実装定義
ISO/IEC C 標準要件に直接関係する ARM C の実装について説明します。
viii
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
序章
付録 C
標準 C++ 実装定義
ARM C++ の実装について説明します。
付録 D
C および C++ コンパイラの実装に関する制限
ARM C および C++ コンパイラの実装に関する制約事項について説明し
ます。
表記規則
本書では以下の表記規則を用いています。
monospace コマンド、ファイル名、プログラム名、ソースコードなど、キーボード
から入力可能なテキストを示しています。
monospace コマンドまたはオプションに使用可能な略語を示しています。コマンド
名またはオプション名を全て入力する代わりに、下線部分の文字だけを
入力してこれらを指定することができます。
monospace italic
コマンドおよび関数への引数で、特定の値に置き換えることが可能なも
のを示しています。
monospace bold
サンプルコード以外に使用される言語キーワードを示しています。
italic
重要用語、専門用語、相互参照、引用箇所を斜体で記載しています。
bold
メニュー名などのインタフェース要素を太字で記載しています。また、
適宜記述リスト内の重要箇所と、ARM プロセッサシグナルの名前にも太
字を用いています。
参考資料
このセクションでは、ARM プロセッサファミリの開発コード関連情報を提供している
ARM 社および各社の出版物を紹介します。
ARM は自社出版物の定期的な更新・修正を行っています。最新の正誤表と追補情報、
ならびに ARM によく寄せられる質問とその回答については、ARM ホームページ
http://www.arm.com をご覧下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
ix
序章
ARM の出版物
本書では、ADS に含まれている開発ツールの参考情報を提供しています。この他、本
製品には以下の資料が同梱されています。
•
製品説明書(ARM DUI 0064)
•
ADS アセンブラガイド(ARM DUI 0068)
•
ADS デベロッパガイド(ARM DUI 0056)
•
AXD/armsd デバッガガイド(ARM DUI 0066)
•
ADS デバッグターゲットガイド(ARM DUI 0058)
•
ADS Installation and License Management Guide(ARM DUI 0139)
•
ADS リンカ / ユーティリティガイド(ARM DUI 0151)
•
CodeWarrior IDE Guide(ARM DUI 0065)
ARM デベロッパスイートには上記の他に以下の資料が収録されています。
•
ARM Architecture Reference Manual(ARM DDI 0100)。この資料は
DynaText と PDF 形式で提供しています。
•
ARM Applications Library Programmer's Guide。この資料は DynaText と
PDF 形式で提供しています。
•
ARM ELF 仕様書(SWS ESPC 0003)。PDF 形式で
install_directory\PDF\specs\ARMELF.pdf に収録されています。
•
TIS DWARF 2 仕様書。PDF 形式で
install_directory\PDF\specs\TIS-DWARF2.pdf に収録されています。
•
ARM/Thumb® Procedure Call Standard specification。PDF 形式で
install_directory\PDF\specs\ATPCS.pdf に収録されています。
また、ARM 製品の関連情報については、以下の出版物を参照して下さい。
•
ARM Reference Peripheral Specification(ARM DDI 0062)
•
ご使用中のハードウェアデバイスに関する ARM データシートまたはテクニカル
リファレンスマニュアル
他の出版物
本書は、C や C++ プログラミング言語の入門書を意図したものではありません。C お
よび C++ のプログラミングを解説する C/C++ 標準のリファレンスマニュアルではあり
ません。プログラミングに関する一般情報については、他の出版物を参照して下さい。
ARM アーキテクチャについての一般情報については、以下の出版物を参照して下さい。
•
x
ARM System-on-chip Architecture (second edition), Furber, S., (2000). Addison Wesley.
ISBN 0-201-67519-6.
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
序章
C++ 言語については以下の出版物を参照して下さい。
•
ISO/IEC 14882:1998(E), C++ Standard. 国家規格団体から入手できます。
C++ プログラミングについての一般情報については、以下の出版物を参照して下さい。
•
Ellis, M.A. and Stroustrup, B., The Annotated C++ Reference Manual (1990).
Addison-Wesley Publishing Company, Reading, Massachusetts. ISBN 0-201-51459-1.
この出版物は C++ のリファレンスガイドです。
•
Stroustrup, B., The Design and Evolution of C++ (1994). Addison-Wesley Publishing
Company, Reading, Massachusetts. ISBN 0-201-54330-3.
この出版物では、初期の設計から現在使用されている言語へ C++ がどのように
進化したかを説明しています。
•
Meyers, S., Effective C++ (1992). Addison-Wesley Publishing Company, Reading,
Massachusetts. ISBN 0-201-56364-9.
効果的な C++ 開発を端的に分かりやすく説明したガイドラインです。
•
Meyers, S., More Effective C++ (1996). Addison-Wesley Publishing Company, Reading,
Massachusetts. ISBN 0-201-63371-X.
Effective C++ の続編です。
C プログラミングについての一般情報については、以下の出版物を参照して下さい。
•
Kernighan, B.W. and Ritchie, D.M., The C Programming Language (2nd edition, 1988).
Prentice-Hall, Englewood Cliffs, NJ, USA. ISBN 0-13-110362-8.
元祖 C バイブルと呼ばれるもので、ANSI C の本質を網羅するように更新されて
います。
•
Harbison, S.P. and Steele, G.L., A C Reference Manual (second edition, 1987).
Prentice-Hall, Englewood Cliffs, NJ, USA. ISBN 0-13-109802-0.
ANSI C に関する有益な情報を盛り込みながら、C を非常に詳しく解説している
ガイドです。
•
Koenig, A, C Traps and Pitfalls, Addison-Wesley (1989), Reading, Mass. ISBN
0-201-17928-8.
C プログラミングで直面する最も一般的な問題点の回避方法を説明しています。
C の初心者から上級者までを対象とした参考書です。
•
ISO/IEC 9899:1990, C Standard.
ANSI から No. X3J11/90-013 として提供されています。この標準規格は、国家規
格団体(フランスの AFNOR、アメリカの ANSI など)から入手できます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
xi
序章
ご意見・ご質問
ARM 社では、ADS および本書に関するご意見等をお待ちしています。
ARM デベロッパスイートに関するご意見
ADS に関するご意見・ご質問等がございましたら、製品購入元までご連絡下さい。そ
の際、迅速かつ適切な対応をさせて頂くために、以下の情報をご用意下さい。
•
お名前と会社名
•
製品のシリアルナンバー
•
ご使用になっている製品のリリース情報
•
ハードウェアプラットフォーム、オペレーティングシステムのタイプ、バージョ
ンなど、ご使用になっているプラットフォームについての詳しい情報
•
当該問題が繰り返し発生するコードの小さなスタンドアロンサンプル
•
当初の目的と、実際に起こったことに関する詳しい説明
•
コマンドラインオプションを含め、使用した全てのコマンド
•
問題を例示するサンプル出力
•
バージョン番号、ビルド番号などを含め、ご使用になっているツールのバージョ
ン情報
本書に関するご意見
本書に関するご意見等がございましたら、電子メールに以下の情報をご記入の上、
[email protected] までお寄せ下さい。
•
•
•
•
資料名
資料番号
ご意見のあるページ番号
問題点の詳しい説明
補足または向上すべき点についてのご提案もお待ちしています。
xii
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
第1章
はじめに
本章では、ADS に収録されている ARM コンパイラ、ライブラリ、リンカ、ユーティ
リティプログラムをご紹介します。本章は以下のセクションから構成されています。
•
コンパイラおよびライブラリについて:P. 1-2
•
•
•
ARM DUI0067DJ-00
ARM コンパイラおよびライブラリ:P. 1-3
コンパイル済みオブジェクトのリンク:P. 1-5
関連ユーティリティ:P. 1-6
Copyright © 1999-2001 ARM Limited. All rights reserved.
1-1
はじめに
1.1
コンパイラおよびライブラリについて
ADS は、支援文書およびサンプルを含み、ARM ファミリの RISC プロセッサ用アプリ
ケーションの記述・デバッグを目的としたアプリケーション群で構成されています。
ADS を使用することにより、C、C++、ならびに ARM アセンブリ言語プログラムの開
発・作成・デバッグが可能となります。
ADS ツールキットは、以下の主要コンポーネントから構成されています。
•
•
コマンドライン開発ツール
GUI 開発ツール
•
•
ユーティリティ
支援ソフトウェア
本書は、ADS に収録されている ARM のコンパイラおよびライブラリについて説明し
ます。ADS に収録されている ARM アセンブラ、デバッガ、支援ソフトウェアの参考
文書については、P. x「ARM の出版物」をご覧下さい。
1-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
はじめに
1.2
ARM コンパイラおよびライブラリ
このセクションでは、ARM C および C++ コンパイラ、ならびに C および C++ ライブ
ラリについて概説します。
1.2.1
C および C++ コンパイラ
ADS には以下のコンパイラが収録されています。
armcc
ARM C コンパイラ。このコンパイラは、Plum Hall C バリデーションス
イートによる ANSI 規格適合性試験を済ませています。このツールを使
用して、ANSI C ソースを 32 ビット ARM コードにコンパイルすること
ができます。
armcpp
ARM C++ コンパイラ。このツールを使用して、ANSI C++ または EC++
ソースを 32 ビット ARM コードにコンパイルすることができます。
tcc
Thumb C コンパイラ。このコンパイラは、Plum Hall C バリデーションス
イートによる ANSI 規格適合性試験を済ませています。このツールを使
用して、ANSI C ソースを 16 ビット Thumb コードにコンパイルすること
ができます。
tcpp
Thumb C++ コンパイラ。このツールを使用して、ANSI C++ または EC++
ソースを 16 ビット Thumb コードにコンパイルすることができます。
ARM コンパイラは最適化を行うコンパイラです。コマンドラインオプションを使用す
ると、最適化のレベルを制御することができます。
ARM コンパイラは、出力オブジェクトを ELF 形式で生成し、DWARF2 デバッグ情報
を生成します。さらに、これらのコンパイラは出力コードのアセンブリ言語リストを
生成し、アセンブリ言語リストをソースコードにインタリーブさせることができます。
ARM コンパイラの詳細については、第 2 章「C および C++ コンパイラ」を参照して
下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
1-3
はじめに
1.2.2
C および C++ ライブラリ
ADS には、以下のランタイム C および C++ ライブラリが収録されています。
ARM C ライブラリ
ARM C ライブラリには、標準 C 関数と、C および C++ ライブラリで使
用されるヘルパ関数が含まれています。また、この C ライブラリは、標
準 C ライブラリ関数をセミホスティングされた環境で実装するときに使
用される、ターゲット依存関数も提供します。この C ライブラリは、ユー
ザコード内のターゲット依存関数を再定義し、セミホスティングの依存
性を除去できるように構成されています。
Rogue Wave C++ ライブラリ
Rogue Wave C++ ライブラリには、標準 C++ 関数と、cout() などのオブ
ジェクトが含まれています。Rogue Wave ライブラリの詳細については、
Rogue Wave HTML 文書を参照して下さい。C++ ライブラリにはターゲッ
トへの依存性はありません。C++ ライブラリは C ライブラリを使用して、
ターゲットに固有のサポートを提供します。
サポートライブラリ
ARM C ライブラリには、C++ のサポートを可能にし、異なるアーキテク
チャまたはプロセッサ向けのコードをコンパイルするための追加コン
ポーネントが含まれています。
C および C++ ライブラリは、バイナリで形式のみで提供されています。ANSI C ライブ
ラリには、選択された ATPCS バリアントやターゲットシステムのバイト順序、浮動小
数点のタイプといった、主要なビルドオプションの組合せに応じたバリアントがあり
ます。ライブラリの詳細については、第 4 章「C および C++ ライブラリ」を参照して
下さい。
1-4
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
はじめに
1.3
コンパイル済みオブジェクトのリンク
ARM および Thumb リンカは、1 つ以上のオブジェクトファイルの内容と、1 つ以上の
オブジェクトライブラリから選択された部分とを組み合わせ、ELF 実行イメージまた
は部分的にリンクした ELF オブジェクトを生成します。
このリンカは ARM コードと Thumb コードをリンクさせ、必要に応じてプロセッサ状
態を切り替えるためのインターワーキングベニアを自動生成することができます。さ
らに、必要に応じて長分岐ベニアを自動生成し、分岐命令の範囲を拡張することがで
きます。
このリンカは、単純なイメージのコードとデータのメモリ位置を個々に指定できるコ
マンドラインオプションをサポートしています。また、このリンカを使用することで、
分散ロード記述ファイルで複雑なイメージを作成することができます。分散ロード記
述ファイルを使用して、出力イメージ内のコードセクションとデータセクションの
ロード時と実行時両方のメモリ位置を個々に指定することができます。
このリンカを使用して共通セクションと未使用セクションを削除し、出力イメージの
サイズを小さくすることができます。下記の事項を行うことができます。
•
リンク済みファイルのデバッグ情報と参照情報の生成
•
スタティックコールグラフ情報の生成
•
出力イメージにあるシンボルテーブルの内容の制御
このリンカは、リンクしようとするオブジェクトのビルド属性に基づいて、リンクに
適した標準 C または C++ ライブラリバリアントを自動的に選択します。
このとき ELF 以外の出力形式は生成されせん。したがって、ELF イメージを ROM に
ロードするプレーンバイナリなどの他の形式に変換したい場合には、fromELF ユーティ
リティを使用して下さい。P. 1-6「関連ユーティリティ」を参照して下さい。
ARM リンカの詳細については、ADS リンカ / ユーティリティガイドを参照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
1-5
はじめに
1.4
関連ユーティリティ
このセクションでは、主要開発ツールをサポートするために提供されている以下の
ユーティリティツールについて概説します。
•
fromELF
•
armar
•
armprof
ユーティリティの詳細については、ADS リンカ / ユーティリティガイドを参照して下
さい。
1.4.1
fromELF
fromELF は、ARM イメージ変換ユーティリティです。fromELF は ELF 形式の入力ファ
イルを受け取り、以下の多様な出力形式に変換します。
•
プレーンバイナリ
•
Motorola 32 ビット S レコード形式
•
Intel Hex-32 形式
•
バイト指向(Verilog メモリモデル)Hex 形式
•
Extended Intellec Hex(IHF)形式(このオプションは廃止予定であり、本製品の
今後のバージョンではサポートされません。)
このユーティリティは以下を実行することもできます。
•
入力ファイルのテキスト情報の生成
•
コードの逆アセンブル
•
ELF 形式による再保存
1.4.2
armar
ARM ライブラリアンを使用して、ELF ファイルセットを ar 形式ライブラリに収集・
保管することができます。リンカには複数の ELF オブジェクトファイルの代わりに、
これらのライブラリを渡すことができます。
1.4.3
armprof
この ARM プロファイラは、ARM デバッガが生成したプロファイルデータファイルか
らの簡単なプログラムの実行プロファイルを表示します。
1-6
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
第2章
C および C++ コンパイラ
本章では、ARM と Thumb の C および C++ コンパイラに使用できるコマンドラインオ
プションを説明します。この章では、ユーザが ADS に収録されているツールなどのコ
マンドラインソフトウェア開発ツールに精通していることを想定しています。本章は
以下のセクションから構成されています。
•
C および C++ コンパイラについて:P. 2-2
•
•
ARM DUI0067DJ-00
ファイルの使用方法:P. 2-4
コマンド構文:P. 2-9
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-1
C および C++ コンパイラ
2.1
C および C++ コンパイラについて
ADS のコンパイラには、UNIX ユーザおよび Windows/MS-DOS ユーザにとってなじみ
があり幅広く使用されているコンパイラオプションが、可能な限り採用されています。
ARM C および C++ コンパイラは ANSI C をコンパイルします。
ARM C++ コンパイラで使用できる C++ は ISO/IEC 14822:1998 International Standard for
C++ に準拠したものです。ARM C++ 言語サポートの詳細については、付録 C「標準
C++ 実装定義」を参照して下さい。
ARM C++ コンパイラは、組み込み C++(EC++)として知られる標準 C++ のサブセッ
トもコンパイルできます。EC++ は、組み込みシステムで使用できる効率的なコードを
実現する標準 C++ のサブセットです。現在、ISO 標準に照らし合わせた EC++ の修正
が進められています。提案されている定義は、http://www.caravan.net/ec2plus
でご覧頂けます。
2.1.1
コンパイラバリアント
ARM C および C++ コンパイラは全て、同じ基本コマンドラインオプションを認識しま
す。別途記載されていない限り、本章の情報は全てのコンパイラタイプに適用されま
す。特定のコンパイラで追加された機能や機能制限がある場合には、本文中で注釈を
つけています。オプションが C++ だけに適用される場合にも、本文中でその旨を明記
しています。
表 2-1 が示すように、4 つのコンパイラバリアントがあります。
表 2-1 コンパイラバリアント
コンパイラ名
コンパイラバリアント
ソース言語
コンパイラ出力
armcc
C
C
32 ビット ARM コード
tcc
C
C
16 ビット Thumb コード
armcpp
C++
CまたはC++ 32 ビット ARM コード
tcpp
C++
CまたはC++ 6 ビット Thumb コード
注
本章を通じ、ARM コンパイラという用語は、armcc、armcpp、tcc、tcpp を指しています。
2-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
2.1.2
ソース言語モード
ARM コンパイラには以下の 3 つの異なるソース言語モードがあり、これらを使用して
様々なタイプの C および C++ ソースコードをコンパイルすることができます。
ANSI C
ANSI C モードでは、ARM コンパイラは Plum Hall C Validation Suite
(CVS)
のリリース 7.00 に適合しています。このスイートは、欧州における C コ
ンパイラの検証を目的として英国規格協会に採用されています。このテ
ストを実行するときは、コンパイラオプション -strict を使用します。
EC++
このモードは、ARM C++ コンパイラのみに適用できます。ARM C++ コ
ンパイラは、ISO/IEC Standard C++ の組み込み C++ サブセットをコンパ
イルします。
C++
このモードは、ARM C++ コンパイラのみに適用できます。ARM C++ コ
ンパイラは ISO/IEC 標準 C++ をコンパイルします。ARM C++ コンパイ
ラは、Suite++、The Plum Hall Validation Suite for C++、バージョン 5.00
でテストされています。このモードは、ARM C++ コンパイラのデフォル
ト言語モードです。このテストを実行するときは、オプション -strict
を使用します。
コンパイラのソースモードを設定するコンパイラオプションの使用方法については、
P. 2-14「ソース言語の設定」を参照して下さい。
2.1.3
インラインアセンブリ言語
C および C++ コンパイラに含まれているインラインアセンブラを使用することにより、
最適なアセンブリ言語ルーチンを記述し、C または C++ で利用できないターゲットプ
ロセッサの機能にアクセスすることができます。__asm キーワードの情報については、
P. 3-19「インラインアセンブラ」を参照して下さい。インラインアセンブラの使用方法
およびインラインアセンブリ言語に関する制約条件については、ADS デベロッパガイ
ドの「C、C++、アセンブリ言語の混合」を参照して下さい。ARM コアに適したアセ
ンブリ言語の記述については、ADS アセンブラガイドを参照して下さい。ただし、イ
ンラインThumbアセンブリルーチンは廃止される予定であり、使用すると警告メッセー
ジが生成されます。
2.1.4
ライブラリサポート
ADS には、プリビルドされたバイナリ形式の ANSI C ライブラリと Rogue Wave C++ ラ
イブラリが収録されています。これらのライブラリの詳細については、第 4 章「C およ
び C++ ライブラリ」を参照して下さい。
ターゲット依存関数を独自に定義することで、C ライブラリをカスタマイズすることが
できます。プロセッサ固有の再対象化は、プロセッサアーキテクチャおよびプロセッ
サファミリのコンパイラオプションを設定することで自動的に行われます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-3
C および C++ コンパイラ
2.2
ファイルの使用方法
このセクションでは、命名規則とインクルードファイルについて説明します。
2.2.1
命名規則
ARM コンパイラは接尾文字の命名(ファイル名拡張子)規則を使用して、コンパイル
やリンクプロセスに関わるファイルのクラスを識別します。コマンドラインで使用さ
れている名前、ならびにプリプロセッサ #include ディレクティブへの引数として使
用されている名前は、UNIX および Windows/MS-DOS 環境では直接ホストのファイル
名にマップされます。
ARM コンパイラは以下のファイル接尾文字に基づいてファイルを使用、生成します。
filename.c
ARM C コンパイラは、.c 接尾文字の付いたファイルをソース
ファイルと認識します。
ARM C++ コンパイラは、.c、.cpp、.cp、.c++、.cc の接尾文
字が付いたファイルソースファイルと認識します。
filename.h
ヘッダファイルを示します(単なる取り決めであり、この接尾文
字はコンパイラにとって特別な意味をもちません)。
filename.o
ELF 形式の ARM オブジェクトファイルであることを示します。
filename.s
ARM または Thumb アセンブリ言語ファイルであることを示しま
す。
(このファイルは入力ファイルリストに含めるか、-S オプショ
ンを使用して C および C++ コンパイラから出力ファイルとして生
成することができます。
filename.lst
エラーおよび警告リストファイルです(-list オプションのデ
フォルト出力拡張子です)。
移植性
ARM コンパイラは、サポートされている全てのホストで複数のファイル命名規則をサ
ポートします。ホスト間の移植性を維持するため、以下の規則に従って下さい。
•
ファイル名にスペースを入れない。スペースを含むパス名やファイル名を使用す
る必要があるときは、そのパスまたはファイル名を引用符で囲んで下さい。
•
パス名を組み込む場合は絶対パスではなく相対パスにする。
各ホスト環境で、コンパイラは以下をサポートしています。
•
ネイティブファイル名
•
以下の形式を使用した疑似 UNIX ファイル名
host-volume-name:/rest-of-unix-file-name
•
2-4
/ をパスの区切子として使用した UNIX ファイル名
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
ファイル名は以下のように解析されます。
•
host-volume-name:/ で始まる名前は疑似 UNIX ファイル名
•
host-volume-name:/ で始まらず、かつ / を含む名前は、UNIX ファイル名
•
/ を含まない名前は、ホストファイル名
ファイル名の妥当性
コンパイラは、ファイル名がホストのファイルシステムに使用可能なものであるかど
うかをチェックしません。ファイル名が受け入れられない場合、コンパイラはファイ
ルを開けない旨を通知しますが、それ以上の診断は行いません。
出力ファイル
デフォルトでは、ARM コンパイラにより作成される出力ファイルは、カレントディレ
クトリに保存されます。オブジェクトファイルは、ARM 実行リンク形式(ELF)で記
述されます。ELF を説明した文書は、install_directory\PDF に収録されています。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-5
C および C++ コンパイラ
2.2.2
インクルードファイル
ARM コンパイラが #include ヘッダファイルとソースファイルを検索する方法は、以
下に挙げるいくつかの要因によって影響されます。
•
-I および -j コンパイラオプション
•
-fk および -fd コンパイラオプション
•
環境変数 ARMINC の値
•
•
ファイル名が絶対ファイル名か相対ファイル名か
ファイル名が < > または " " で囲まれているかどうか
インメモリファイルシステム
ARM コンパイラは、ANSI C ライブラリヘッダをテキスト圧縮された特別なインメモ
リファイルシステム内に作成します。コマンドラインからビルドされたアプリケー
ションの場合は、これらの C ヘッダファイルがデフォルトでこのファイルシステムか
ら使用されます。コマンドラインで -j- または -I- を使用することで、インメモリ
ファイルシステムを指定することができます。
C ライブラリヘッダと等価な C++ ヘッダファイルも、インメモリファイルシステムに
保存されます。iostream など C++ に固有のヘッダファイルは、インメモリファイル
システムに保存されません。
#include <stdio.h> のように < > でファイル名を囲むと、囲い込まれたファイルが
システムファイルであることを示し、最初にインメモリファイルシステムを検索する
ようにコンパイラに指示することになります。
#include "myfile.h" のようにファイル名を二重引用符で囲むと、そのファイルが
システムファイルではないことを示し、検索パスを検索するようにコンパイラに指定
することになります。
現在位置
ARM コンパイラはデフォルトで Berkeley UNIX 検索規則を使用するため、ソースファ
イルと #include ヘッダファイルは現在位置と相対して検索されます。現在位置は、
その時点でコンパイラによって処理されているソースまたはヘッダファイルを含む
ディレクトリです。
検索パスのエレメントに相対したファイルが検出されると、そのファイルを含むディ
レクトリが新しい現在位置になります。コンパイラがそのファイルの処理を終了する
と、以前の現在位置が復元されます。常に、入れ子になった #include ディレクティ
ブのスタックに対応する現在位置のスタックがあります。例えば、現在位置が
install_directory\include にあり、コンパイラがインクルードファイル
sys\defs.h を検索しているとき、install_directory\include\sys\defs.h が
存在していればコンパイラはこの場所を検索します。
2-6
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
コンパイラが defs.h の処理を開始すると、現在位置は
install_directory\include\sys になります。defs.h に含まれ、絶対パス名が
指定されていないファイルは、install_directory\include\sys に相対して検索
されます。
元の現在位置 install_directory\include は、コンパイラが defs.h の処理を終
了してはじめて復元されます。
コンパイラオプション -fk を使用すると、現在位置のスタッキングをディセーブルす
ることができます。このオプションにより、コンパイラは、もともとカーニガン & リッ
チーの『The C Programming Language』で説明された検索規則を使用することになりま
す。この規則に基づき、ルートに存在しないどのユーザ #include ファイルも、コン
パイル中のソースファイルを含むディレクトリに相対して検索されます。
ARMINC 環境変数
ARMINC 環境変数をカンマで区切ったディレクトリリストで設定し、インクルードする
ヘッダファイルとソースファイルの検索を制御することができます。例えば、Windows
のコマンドラインからは以下のように入力します。
set ARMINC=c:\work\x,c:\work\y
コマンドラインからコンパイルを実行する場合、ARMINC で指定されたディレクトリは
コマンドラインの -I オプションで指定されたディレクトリが検索された直後に検索さ
れます。-j オプションが使用されている場合は、ARMINC は無視されます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-7
C および C++ コンパイラ
検索パス
表 2-2 は、コンパイラがインクルードするヘッダファイルとソースファイルを検索する
ときに、コマンドラインオプションが使用される検索パスにどのように作用するかを
示しています。この表では、以下の表記規則を使用しています。
:mem
ARM コンパイラが ANSI C ヘッダファイルと一部の C++ ヘッダファイル
を保存するインメモリファイルシステム。詳細については、P. 2-6「イン
メモリファイルシステム」を参照して下さい。
ARMINC
ARMINC環境変数が設定されている場合に、これによって指定されるディ
レクトリのリスト
CP
現在位置。詳細については、P. 2-6「現在位置」を参照して下さい。
Idir および jdirs
-I および -j コンパイラオプションで指定されるディレクトリ
表 2-2 インクルードファイルの検索パス
コンパイラ
オプション
<include>
-I も -j も使用し :mem および ARMINC
ない場合
CP、ARMINC、:mem
-j
jdirs
CP および jdirs
-I
:mem、ARMINC、Idirs
CP, Idirs, ARMINC, and :mem
-I と -j の両方を Idirs および jdirs
使用した場合
2-8
"include"
CP、Idirs、jdirs
-fd
影響なし
検索パスからCPが削除されるた
め、検索パスは < > で呼び出さ
れる検索パスと同じ
-fk
影響なし
カーネギー & リッチー検索規則
を使用
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
2.3
コマンド構文
このセクションでは、ARM C および C++ コンパイラのコマンド構文を説明します。
多くのコンパイラ動作におけるアスペクトは、コマンドラインオプションで制御する
ことができます。オプションは全て、マイナス - 記号の接頭文字が付き、オプションに
よってはその後に引数を取るものもあります。ARM C および C++ コンパイラでは、オ
プションの文字と引数の間にスペースがあってもほとんどの場合は問題ありません。
2.3.1
コンパイラの呼び出し
ARM コンパイラを呼び出すコマンドは以下の通りです。
compiler [PCS-options] [source-language] [search-paths] [preprocessor-options]
[output-format] [target-options] [debug-options] [code-generation-options]
[warning-options] [additional-checks] [error-options] [source]
コマンドラインオプションは任意の順序で使用できます。これらのオプションには以
下のタイプがあります。
compiler
armcc、tcc、armcpp、tcpp のいずれかを指定します。
PCS-options
使用するプロシージャコール標準を指定します。詳細について
は、P. 2-12「プロシージャコール標準オプション」を参照して下
さい。
source-language コンパイラに使用できるソース言語のバリアントを指定します。
C コンパイラでは ANSI C、C++ コンパイラでは ISO 標準 C++ が
デフォルトで使用されます。詳細については、P. 2-14「ソース言
語の設定」を参照して下さい。
search-paths
インクルードファイルを検索するディレクトリを指定します。詳
細については、P. 2-15「検索パスの指定」を参照して下さい。
preprocessor-options
プリプロセッサ出力やマクロ定義などを含むプリプロセッサの
動作を指定します。詳細については、P. 2-15「プリプロセッサオ
プションの設定」を参照して下さい。
ARM DUI0067DJ-00
output-format
コンパイラ出力形式を指定します。このオプションを使用する
と、アセンブリ言語出力リストファイルおよびオブジェクトファ
イルを生成することができます。詳細については、P. 2-17「出力
形式の指定」を参照して下さい。
target-options
ターゲットプロセッサまたはアーキテクチャを指定します。詳細
については、P. 2-19「ターゲットプロセッサまたはアーキテクチャ
の指定」を参照して下さい。
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-9
C および C++ コンパイラ
debug-options
デバッグテーブルを生成するかどうかと、その形式を指定しま
す。詳細については、P. 2-22「デバッグ情報の生成」を参照して
下さい。
code-generation-options
コンパイラによって生成されるデータの最適化、バイト順序、ア
ライメントなどのオプションを指定します。詳細については、
P. 2-23「コード生成の制御」を参照して下さい。
warning-options 特定の警告メッセージを生成するかどうかを指定します。詳細に
ついては、P. 2-30「警告メッセージの制御」を参照して下さい。
additional-checks データフロー異常や使用されていない宣言のチェックなど、コー
ドに適用できる追加チェックを指定します。詳細については、
P. 2-34「追加チェックの指定」を参照して下さい。
error-options
回復可能な特定のエラーを無効にしたり、特定のエラーを警告に
降格することができます。詳細については、P. 2-36「エラーメッ
セージの制御」を参照して下さい。
source
C または C++ のソースコードを含む 1 つ以上のテキストファイル
のファイル名を指定します。デフォルトでは、コンパイラはカレ
ントディレクトリでソースファイルを検索し、このディレクトリ
に出力ファイルを作成します。
ソースファイルがアセンブリファイルの場合(.s 拡張子がつい
ているもの)は、アセンブラが起動してソースファイルを処理し
ます。
ファイルからのコンパイラオプションの読み出し
オペレーティングシステムによりコマンドラインの長さが制限されている場合は、以
下のオプションを使用してファイルからコマンドラインオプションを読み出します。
-via filename
ファイルを開き、そこからコマンドラインオプションを読み出します。-via
filename2 をこのファイルに含めると、via ファイルの中で -via コールを入れ子にす
ることができます。
以下の例では、コマンドラインが解析されるときに、input.txt 内に指定されたオプ
ションが読み出されます。
armcpp -via input.txt source.c
via ファイルの記述については、付録 A「Via ファイル構文」を参照して下さい。
2-10
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
キーボード入力の指定
マイナス記号 - をソースファイル名に使用すると、コンパイラはキーボードからの入力
を受け付けます。キーボードからの入力を終了したい場合は、UNIX 環境では Ctrl-D、
Windows 環境では Ctrl-Z を入力します。
キーボード入力のアセンブリリストは、以下の条件の両方が満たされている場合に、入
力が終了した時点で出力ストリームに送信されます。
•
出力ファイルが指定されていない。
•
-E などのプリプロセッサ専用オプションが指定されていない。
-o オプションで出力ファイルを指定すると、オブジェクトファイルが記述されます。
-E オプションを指定すると、プリプロセッサ出力が出力ストリームに送信されます。
ヘルプとバージョン情報の表示
-help オプションを使用すると、主なコンパイラコマンドラインオプションの一覧を
表示させることができます。
-vsn オプションを使用すると、コンパイラのバージョン情報が表示されます。
エラーの転送
-errors filename オプションを使用すると、コンパイラエラー出力をファイルに転
送することができます。コマンドライン上のエラーは転送されません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-11
C および C++ コンパイラ
2.3.2
プロシージャコール標準オプション
このセクションの内容は、ARM コンパイラで使用される ARM/Thumb プロシージャコー
ル標準(ATPCS)に適用されます。
ARM および Thumb のプロシージャコール標準の詳細については、ADS デベロッパガ
イドを参照して下さい。その他のビルドオプションの詳細については、P. 2-23「コード
生成の制御」を参照して下さい。
以下のコマンドラインオプションを使用すると、コンパイラで使用するプロシージャ
コール標準のバリアントを指定することができます。
-apcs qualifiers
-apcs コマンドラインオプションには以下の規則が適用されます。
•
1 つ以上の修飾子があること
•
修飾子の間にはスペースを入れないこと
-apcs オプションと -cpu オプションがいずれも指定されていない場合、全てのコンパ
イラに以下のデフォルトが使用されます。
-apcs /noswst/nointer/noropi/norwpi -fpu softvfp
上記は、デフォルト -fpu が -cpu の使用によってオーバライドされていないことが前
提です。詳細については、P. 2-19「ターゲットプロセッサまたはアーキテクチャの指
定」を参照して下さい。
修飾子については以下を参照して下さい。
インターワーキング修飾子
/nointerwork
ARM/Thumb インターワーキングサポートなしでコードが生成されます。
アーキテクチャ v5T ではインターワーキングを直接サポートしているた
め、-cpu 5T などで ARM アーキテクチャ v5 が指定されていない限り
はこれがデフォルトです。
/interwork ARM/Thumb インターワーキングサポートを使用してコードが生成され
ます。ARM/Thumb インターワーキングの詳細については ADS デベロッ
パガイドを、自動生成されるインターワーキングベニアの詳細について
は ADS リンカ / ユーティリティガイドを参照して下さい。ARM アーキ
テクチャ v5T では、これがデフォルトです。
2-12
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
位置独立型修飾子
/noropi
(読み出し専用)位置独立コードが生成されます。これがデフォルトで
す。/nopic はこのオプションのエイリアスです。
/ropi
(読み出し専用)位置独立コードが生成されます。/pic はこのオプショ
ンのエイリアスです。このオプションを選択した場合、コンパイラは以
下を行います。
•
読み出し専用コードおよびデータをPC相対でアドレス指定します。
•
読み出し専用出力セクションに位置独立(PI)属性を設定します。
注
リンカが入力セクションの処理を終了するまで、ARM ツールは最終出力
イメージが読み出し専用位置独立(ROPI)イメージであるかどうかを決
定できません。したがって、このオプションを選択していても、リンカ
が ROPI エラーメッセージを通知することがあります。
/norwpi
読み出し / 書き込みデータのアドレス指定を位置独立で行わないコード
を生成します。これがデフォルトです。/nopid はこのオプションのエ
イリアスです。
/rwpi
読み出し / 書き込みデータのアドレス指定を位置独立で行うコードを生
成します(読み出し / 書き込み位置独立)。位置独立データの場合、/pid
はこのオプションのエイリアスです。このオプションを選択すると、コ
ンパイラは以下を行います。
•
スタティックベースレジスタ sb からのオフセットを使用し、書き
込み可能データをアドレス指定します。つまり、以下のことを意
味します。
—
データアドレスをランタイムで修正できる。
—
データの複数のインスタンスを生成できる。
—
データを位置独立データにできる。ただし、必ずしもそうす
る必要はありません。
•
読み出し / 書き込み出力セクションに PI 属性を設定します。
注
コンパイラによって読み出し / 書き込み可能データに位置独立属性が設
定されることはありません。したがって、このオプションを選択してい
ても、リンカが RWPI 警告メッセージを通知することがあります。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-13
C および C++ コンパイラ
スタックチェック修飾子
/noswstackcheck このオプションでは、非ソフトウェアスタックチェック ATPCS
バリアントが使用されます。このオプションはデフォルトです。
/swstackcheck
2.3.3
このオプションでは、ソフトウェアスタックチェック ATPCS バ
リアントが使用されます。
ソース言語の設定
このセクションでは、コンパイラに認識されるソース言語バリアントを決定するオプ
ションについて説明します(P. 2-23「コード生成の制御」参照)。
以下のオプションで、コンパイラにどの程度厳正に該当言語の標準や規則を遵守させ
るかを指定することができます。デフォルトでは、C コンパイラは ANSI-C を、C++ コ
ンパイラは ISO/IEC C++ のうち対応可能なものをコンパイルします。
-ansi
このオプションは、ANSI 標準 C をコンパイルするときに指定します。
armcc と tcc では、これがデフォルトです。このデフォルトモードでは、
コンパイラはかなり厳正に ANSI に準拠しますが、ANSI 標準のいくつか
の不都合な機能は取り除かれます。若干の拡張も可能です。
(コメント内
の //、識別子の $ など)。
-ansic
ANSI 標準 C をコンパイルするときに使用します。このオプションは、
-ansi オプションの同義語です。
-cpp
ISO/IEC C++ をコンパイルするときに使用します。C++ コンパイラでは
このオプションがデフォルトとなりますが、C コンパイラでは使用でき
ません。
-embeddedcplusplus
組み込み C++(EC++)をコンパイルするときに使用します。このオプ
ションは、C コンパイラには使用できません。
-strict
ANSI C 標準および ISO/IEC C++ 標準により厳密に準拠させたいときに使
用します。例えば、以下のコード
static struct T {int i; };
は、-cpp -strict を指定してコンパイルするとエラーを発生させ、
-cpp でコンパイルすると警告だけを発生させます。オブジェクトが宣言
されていないため、static はスプリアスです。したがって、C++ 標準
では、このコードは不正とみなされます。
言語オプションは組み合わせることができます。
2-14
armcc -ansi
ANSI 標準 C をコンパイルします。この設定がデフォルトです。
armcc -strict
ANSI 標準 C に厳密に準拠したコンパイルを実行するときに使用
します。
armcpp
標準 C++ をコンパイルするときに使用します。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
armcpp -ansi
通常の ANSI 標準 C(C++ の C モード)をコンパイルするときに
使用します。
armcpp -ansi -strict
ANSI 標準 C(C++ の C モード)に厳密に準拠したコンパイルを
実行するときに使用します。
armcpp -strict
2.3.4
C++ を厳密にコンパイルするときに使用します。
検索パスの指定
以下のオプションを使用して、インクルードファイルを検索するディレクトリを指定
できます。
厳密な検索パスは、選択されているオプションの組み合わせや、インクルードファイ
ルが < > または " " で囲まれているかどうかによって異なります。これらのオプション
がどのように互いに作用するかについては、P. 2-6「インクルードファイル」を参照し
て下さい。
-Idir-name このオプションは、指定されたディレクトリ(またたカンマで区切られた
ディレクトリのリスト)をインクルードファイルが検索される場所のリス
トに追加します。複数のディレクトリを指定すると、-I オプションがそ
れらを指定している順序と同じ順序でディレクトリが検索されます。
ARM コンパイラはインメモリファイルシステムを使用して、インクルー
ドするヘッダファイルの処理を高速化します。インメモリファイルシス
テムは、-I- で指定します。
-fk
このオプションを指定すると、カーニガン & リッチー検索規則を使用し
てインクルードファイルが検索されます。現在位置は元のソースファイ
ルによって定義され、スタックされません。詳細については、P. 2-6「現
在位置」を参照して下さい。このオプションを使用しないときは、Berkeley
方式の検索が行われます。
-fd
このオプションを指定すると、" " で囲まれたインクルードファイルが、
< > で囲まれたインクルードファイルと同じように処理されます。した
がって、現在位置は検索パスから外されます。
-jdir-list
このオプションは、指定されたカンマ区切りのディレクトリリストを、
-I オプションで指定された全てのディレクトリに続けて検索パスの終
わりに追加します。-j- を使用すると、インメモリファイルシステムを
検索させることができます。
2.3.5
プリプロセッサオプションの設定
以下のコマンドラインオプションは、プリプロセッサのアスペクトを制御します。
(プ
ラグマで設定できるその他のプリプロセッサオプションについては、P. 3-2「プラグマ」
を参照して下さい。
)
-E
ARM DUI0067DJ-00
このオプションを指定すると、コンパイラのプリプロセッサフェーズの
みが実行されます。デフォルトでは、プリプロセッサからの出力は標準
出力ストリームへ送信され、標準の UNIX または MS-DOS の表記を使用
してファイルに転送することができます。例:
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-15
C および C++ コンパイラ
compiler-name -E source.c > raw.c
-o オプションを使用して、前処理された出力のファイルを指定するこ
ともできます。デフォルトでは、コメントは出力から取り除かれます。
プリプロセッサは、任意の拡張子(.o、.s、.txt など)が付いたソー
スファイルを受け付けます。-C オプションを参照して下さい。
このオプションを -E と組み合わせて使用すると、プリプロセッサの出
力内にコメントが残されます。このオプションは。リンクステップを抑
制する -c(小文字)オプションとは異なります。-c オプションについ
ては、P. 2-17「出力形式の指定」を参照して下さい。
-C
-Dsymbol=value
symbol をプリプロセッサマクロとして定義するときに使用します。こ
のオプションには、
ソースファイルの冒頭にテキスト #define symbol
value を記述したときと同じ効果があります。このオプションは繰り返
し使用することができます。
-Dsymbol
symbolをプリプロセッサマクロとして定義するときに使用します。この
オプションには、ソースファイルの冒頭にテキスト #define symbol
を記述したときと同じ効果があります。このオプションは繰り返し使用
することができます。シンボルのデフォルト値は、1 です。
このオプションを指定すると、-E を指定したときと同様に、コンパイラ
のプリプロセッサフェーズのみが実行されます。このオプションにより、
メークユーティリティの使用に適したメークファイル依存行のリストが
生成されます。デフォルトでは、出力は標準出力ストリームです。出力
を標準の UNIX または MS-DOS の表記でファイルに転送することができ
ます。例:
-M
compiler-name -M source.c >> Makefile
-o filename オプションを指定すると、標準出力に生成された依存行は
source.o ではなく、filename.o を参照します。ただし、-M -o
filename の組み合わせを使用した場合は、オブジェクトファイルは生
成されません。
-Usymbol
このオプションは、symbol を未定義にします。このオプションには、
ソースファイルの冒頭にテキスト #undef symbol を記述したときと同
じ効果があります。このオプションは繰り返し使用することができます。
2-16
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
2.3.6
出力形式の指定
デフォルトでは、コンパイルとリンクが行われたソースファイルから、1 つの実行イ
メージが生成されます。
以下のオプションを使用すると、C または C++ ソースファイルから、リンクされてい
ないオブジェクトファイル、アセンブリ言語ファイル、リストファイルを生成するこ
とができます。
このオプションを指定すると、コンパイラによって生成されたアセンブ
リ言語のリストがファイルに書き込まれます。オブジェクトコードが生
成された後、-c オプションが使用されていない限りはリンクステップが
実行されます。
-fs とともに使用すると、ソースコードはアセンブリリストとインタ
リーブされ、.txt ファイルへ出力されます。
-asm
出力ファイル名は、以下のように使用するオプションによって異なりま
す。
-asm
inputname.s が生成されるリストに使用されます。
-asm -fs 生成されたインタリーブコードをアセンブラに入力できない
ため、inputname.txt が使用されます。以下の -fs オプショ
ンを参照して下さい。
-asm -c -o newname.ext
2 つのファイルが出力されます(通常、オブジェクトコードに
は newname.o、アセンブリには newname.s が使用されま
す)。.ext が .s または .o でない場合は、newname.ext が
オブジェクトファイルの名前となり、newname.s がリスト
ファイルの名前となります。
-asm -fs -c -o newname.ext
-asm -c -o newname.ext を指定したときと同じ出力が得
られますが、リストファイルにはインタリーブされたソース
コードが含まれ。.txt 拡張子が付けられます。
-c
このオプションを指定すると、コンパイルは実行されますが、リンクス
テップは実行されません。コンパイラはソースプログラムをコンパイル
し、オブジェクトファイルをカレントディレクトリまたは -o オプショ
ンで指定されたファイルに書き込みます。このオプションは、P. 2-15「プ
リプロセッサオプションの設定」で説明した -C(大文字)オプションと
は異なります(-C オプションは、プリプロセッサ出力内にコメントを残
します。)
-list
エラーメッセージと警告メッセージにインタリーブされたソース行で構
成されるリストファイルを生成します。オプション -fi、-fj、-fu を
使用すると、このファイルの内容を制御することができます。
注意
-list オプションを指定しても出力ファイルのパス名は認識されませ
ん。前バージョンのリストファイルを上書きしたくないときは、それら
のファイルに別の名前を付ける必要があります。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-17
C および C++ コンパイラ
このオプションを -list と組み合わせて使用すると。#include
"file" 形式のディレクティブによってインクルードされたファイルか
らの行をリストできます。
このオプションを -list と組み合わせて使用すると、#include
<file> 形式のディレクティブによってインクルードされたファイルか
らの行をリストできます。
このオプションを -list と組み合わせて使用すると、前処理されていな
いソースをリストできます。
デフォルトでは、-list を指定すると、コンパイラは前処理終了後にコ
ンパイラから見たソーステキストをリストします。-fu を指定すると、
拡張されていないソーステキストがリストされます。例:
p = NULL; /* assume #defined NULL 0 */
-fu が指定されていない場合は、以下のようにリストされます。
p = 0;
-fu が指定されている場合は、以下のようにリストされます。
p = NULL;
-fi
-fj
-fu
-o file
このオプションを使用して、コンパイルの最終出力を保持するファイル
の名前を指定できます。
•
file が - の場合、出力は標準出力ストリームに書き込まれ、-S
が想定されます(-E が指定されている場合を除く)。
•
-c と組み合わせて使用すると、オブジェクトファイルが指定され
ます。
•
-S と組み合わせて使用すると、アセンブリ言語ファイルが指定さ
れます。
•
-E と組み合わせて使用すると、前処理されたソースの出力ファイ
ルが指定されます。
•
-c、-S、-E のいずれも使用されていない場合は、リンクステップ
の出力ファイルが指定されます。file.axf と呼ばれる実行イメー
ジが生成されます。
-o オプションを指定しない場合、出力ファイル名にはデフォルトで適切
なファイル拡張子が付けられた入力ファイル名が使用されます。例えば、
file1.c からの出力は -c オプションが指定されていると file1.o にな
り、-S が指定されていると file1.s になります。-c、-S、-E、-o の
いずれも存在しない場合、デフォルトのリンカ出力名 __image.axf が
使用されます。
-MD
このオプションを指定すると、ソースがコンパイルされ、メークファイ
ル依存行がファイル inputfilename.d に書き込まれます。出力ファイ
ルは、メークユーティリティでの使用に適したファイルが出力されます。
-depend filename
このオプションは -MD と同じですが、メークファイル依存行が特定の
ファイルに書き込まれます。
-S
このオプションを指定すると、コンパイラによって生成されたアセンブ
リ言語のリストがファイルに書き込まれます。ただし、-asm オプショ
ンとは異なり、オブジェクトモジュールは生成されません。アセンブリ
2-18
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
出力ファイルの名前には、デフォルトでカレントディレクトリのfile.s
が使用されます。なお、file.c はディレクトリ名を取り除いたソース
ファイルの名前です。デフォルトのファイル名は、-o オプションで上書
きできます。
注
armasm を使用すると、出力ファイルをアセンブルしてオブジェクトコー
ドを生成することができます。コンパイラは、出力を再アセンブルする
ときに互換性のあるコンパイラオプションまたはアセンブラオプション
が使用されるように、ATPCS バリアントやバイト順序などのコマンドラ
インオプションについて ASSERT ディレクティブを追加します。アセン
ブラとコンパイラに対して同じ ATPCS 設定を指定する必要があります。
このオプションを -S または -asm と組み合わせて使用すると、コンパイ
ラに生成されたアセンブラコード内で C または C++ ソースコードが 1 行
ずつコメントとしてインタリーブされます。出力コードは、file.txt
に書き込まれます。生成されたインタリーブコードはアセンブラに取り
込むことができないため、テキストファイルが出力されます。
-fs
注
このオプションを使用すると、-S を指定して生成された出力コードリス
トを再アセンブルすることはできません。
2.3.7
ターゲットプロセッサまたはアーキテクチャの指定
このセクションで説明しているオプションは、コンパイル時に使用されるターゲット
プロセッサまたはアーキテクチャの属性を指定します。コンパイラは、ハーフワード
ロード / ストア命令や命令スケジューリングのサポートなど、選択したプロセッサまた
はアーキテクチャの特定の追加機能を利用することができます。
注
ターゲットプロセッサを指定すると、その他の ARM プロセッサに対するコードの互換
性が失われることがあります。
以下の一般的な情報は、プロセッサとアーキテクチャに関するオプションに適用され
ます。
ARM DUI0067DJ-00
•
-cpu の値には、現時点での全ての ARM 製品名またはアーキテクチャバージョ
ンがサポートされています。エイリアスまたはワイルドカードのマッチングは行
われません。
•
-cpu オプションでアーキテクチャ名を指定すると、コードはそのアーキテク
チャをサポートしている全てのプロセッサで実行できるようにコンパイルされ
ます。例えば、-cpu 4T を指定すると、ARM7TDMI® と ARM9TDMI™ のどちら
にも使用できるコードが生成されます。
•
-cpu ARM1020E など、-cpu オプションでプロセッサを指定すると、コンパイ
ル済みのコードはそのプロセッサ用に最適化されます。これにより、コンパイラ
は最適なパフォーマンスを実現できるように特定のコプロセッサまたは命令ス
ケジューリングを使用することができます。
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-19
C および C++ コンパイラ
•
-cpu には、1 つのプロセッサ名またはアーキテクチャ名だけを使用して下さい。
プロセッサとアーキテクチャの両方を指定することはできません。
•
-cpu を指定しない場合は、-cpu ARM7TDMI がデフォルトで使用されます。
•
armcc または armcpp に -cpu ARM7TDMI などの Thumb 対応プロセッサを指定し
ても、これらのコンパイラは Thumb コードを生成しません。インターワーキン
グ命令など、使用されるプロセッサの機能だけが認められます。Thumb コードを
生成するには、tcc または tcpp を使用して下さい。
以下のオプションを使用することができます。
-cpu name
このオプションを使用すると、特定の ARM プロセッサまたはアーキテ
クチャを対象としたコードが生成されます。
name にプロセッサを指定した場合:
•
ARM7TDMI など、ARM データシートに記載されている通りの正確
な名前を入力する必要があります。ワイルドカード文字は使用で
きません。この値には、ARM6 以降であればどの ARM プロセッサ
でも指定できます。
•
プロセッサを選択すると、適切なアーキテクチャ、fpu、メモリ構
成が選択されます。
•
-cpu を選択すると、-fpu が自動的に選択されることがあります。
例えば、ARM コンパイラでは、-cpu ARM10200E を指定すると
-fpu vfpv2 が自動的に指定されます。この自動的に指定される
-fpu は、-fpu option を明示的に指定することでオーバライド
されます。-fpu オプションも -cpu オプションも指定されていな
いときは、-fpu softvfp が使用されます。
name にアーキテクチャを指定する場合は、以下のいずれかを指定する必
要があります。
3
ロング乗算をサポートしていない ARMv3
2-20
3M
ロング乗算をサポートしている ARMv3
4
ロング乗算はサポートしているが Thumb をサポートしていな
い ARMv4
4xM
ロング乗算も Thumb もサポートしていない ARMv4
4T
ロング乗算と Thumb の両方をサポートしている ARMv4
4TxM
ロング乗算はサポートしているが Thumb をサポートしていな
い ARMv4
5T
ロング乗算と Thumb の両方をサポートしている ARMv5
5TE
ロング乗算、Thumb、DSP 乗算、ダブルワード命令をサポー
トしている ARMv5
5TEJ
ロング乗算、Thumb、DSP 乗算、ダブルワード命令、Jazelle 拡
張をサポートしている ARMv5
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
-fpu name
このオプションには、ターゲットの浮動小数点ユニット(FPU)アーキ
テクチャを指定します。このオプションを指定すると、-cpu オプショ
ンで自動的に設定された FPU がオーバライドされます。
有効なオプションは、以下の通りです。
none
浮動小数点オプションが使用されないことを示します。この
オプションを指定するときは、浮動小数点コードを使用して
はなりません。
vfp
アーキテクチャ VFPv1 に準拠したハードウェアベクタ浮動小
数点ユニットを選択します。このオプションは -fpu vfpv1
の同義語です。このオプションは Thumb コンパイラには使用
できません。
VFP rev 0 など、アーキテクチャ VFPv1 に準拠したハードウェ
vfpv1
アベクタ浮動小数点ユニットを選択します。このオプション
は Thumb コンパイラには使用できません。
vfpv2
VFP10 rev 1 など、アーキテクチャ VFPv2 に準拠したハード
ウェアベクタ浮動小数点ユニットを選択します。このオプ
ションは、Thumb コンパイラには使用できません。
ハードウェア 浮動小数点アクセラレータ(FPA)を選択しま
す。このオプションは、Thumb コンパイラには使用できませ
ん。下位互換性を維持するだけの目的で用意されています。
softvfp+vfp
純エンディアンダブルで構成され、VFP ハードウェアを使用
するソフトウェア浮動小数点リンケージをもつ浮動小数点ラ
イブラリを選択します。VFP ユニットが実装されたシステム
上で、Thumb コードと ARM コードをインタワーキングさせ
る場合は、このオプションを選択して下さい。
このオプションを選択すると、以下のようになります。
•
tcc および tcpp は、VFP で最適化された浮動小数点ライ
ブラリにリンクする点を除き、-fpu softvfp を指定
した場合と全く同じように動作します。
•
armcc および armcpp は、全ての関数にソフトウェア浮動
小数点リンケージが与えられる点を除き、-fpu vfp を
指定した場合と同じように動作します。したがって、
-fpu softvfp を指定した場合と同様に、
このオプショ
ンでコンパイルされた ARM 関数は浮動小数点引数と結
果を受け渡しますが、
内部ではVFP命令が使用されます。
fpa
注
armcc と tcc の両方でこのオプションを指定すると、インター
ワーキングする浮動小数点コードが、ソフトウェア浮動小数
点リンケージを使用するようにコンパイルされます。armcc に
vfp、vfpv1、vfpv2 のいずれかを指定する場合は、インター
ワーキングする ARM コードがソフトウェア浮動小数点リン
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-21
C および C++ コンパイラ
ケージを使用するようにコンパイルされるように、__softfp
キーワードを使用する必要があります。詳細については、P. 3-6
「関数キーワード」の __softfp の説明を参照して下さい。
softvfp 純エンディアンダブルのソフトウェア浮動小数点ライブラリ
(FPLib)を選択します。-fpu オプションをしていない場合は、
これがデフォルトになります。
softfpa 混合エンディアンダブルのソフトウェア浮動小数点ライブラ
リを選択します。
2.3.8
デバッグ情報の生成
このセクションで説明するオプションを使用して、現在のコンパイルでデバッグテー
ブルを生成するかどうかを指定し、生成する場合にはその形式を指定することができ
ます。デバッグ情報の制御については、P. 3-2「プラグマ」を参照して下さい。
注
最適化基準を設定することにより、コンパイラが生成するデバッグ情報を制限するこ
とができます。詳細については、P. 2-23「最適化基準の定義」を参照して下さい。
デバッグテーブル生成オプション
以下のオプションを使用して、デバッグテーブルの生成方法を指定することができます。
現在のコンパイルに関するデバッグテーブルの生成がオンになります。
-g が使用されているかどうかに関わらず、コンパイラは同じコードを生
成します。違うのはデバッグテーブルが存在することだけです。
-g
デバッグコードの最適化オプションは、-O で指定します。デフォルト
で、-g オプションを単独で使用することは、以下を指定することと同じ
です。
-g -dwarf2 -O0 -gt+p
-g+ は、-g の同義語です。これはグラフィカルコンフィギュアラ
(CodeWarrior など)によって生成されます。
2-22
-g-
現在のコンパイルに関するデバッグテーブルの生成をオフにします。デ
フォルトにはこの設定が使用されます。
-gtp
このオプションを -g と組み合わせて使用すると、プリプロセッサマク
ロの定義に関するデバッグテーブルエントリの生成をオフにできます。
これにより、デバッグイメージのサイズを小さくすることができます。
-gt-p は、-gtp の同義語です。
-gt+p
このオプションを -g と組み合わせて使用すると、プリプロセッサ情報が
イネーブルされます。デフォルトにはこの設定が使用されますが、デバッ
ガによってはプリプロセッサエントリが無視されることがあります。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
デバッグテーブル形式のオプション
以下のオプションは、コンパイラによって生成されるデバッグテーブルの形式を指定
します。
-dwarf2
2.3.9
DWARF2 デバッグテーブル形式を指定します。デフォルトにはこの設定
が使用され、これが唯一使用可能なデバッグテーブル形式です。
コード生成の制御
このセクションで説明するオプションを使用することで、最適化などのコンパイラに
よって生成されるコードのアスペクトを制御することができます。プラグマを使用し
て制御される他のコード生成オプションについては、P. 3-2「プラグマ」を参照して下
さい。
このセクションでは以下について説明します。
•
最適化基準の定義
•
非限定浮動小数点定数のデフォルトタイプの設定:P. 2-26
•
•
•
•
コードセクションとデータセクションの制御:P. 2-28
バイト順序の設定:P. 2-28
アライメントオプションの設定:P. 2-29
実装情報の制御:P. 2-30
最適化基準の定義
以下のオプションを使用して、コンパイラによる生成コードの最適化に関するアスペ
クトを制御できます。
-Onumber
使用する最適化レベルを指定します。最適化レベルは以下の通りです。
-O0
簡単なソースの変換を除き、全ての最適化をオフにします。-g
を指定してデバッグテーブルを生成する場合は、この最適化
レベルがデフォルトで使用されます。これによって最良のデ
バッグビューが得られますが、最適化レベルは最も低くなり
ます。
-O1
デバッグビューの質を大幅に劣化させる最適化をオフにしま
す。-g と組み合わせて使用することで、コード密度の良好な
満足のいくデバッグビューを得られます。
-O2
完全に最適化されたコードを生成します。-g と組み合わせて
使用すると、オブジェクトコードからソースコードへのマッ
ピングは必ずしもクリアではないため、デバッグビューは満
足度の低いものになることがあります。デバッグテーブルが
生成されない場合は、これがデフォルトの最適化レベルにな
ります。
プラグマを使用した最適化の制御については、P. 3-2「プラグマ」を参照
して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-23
C および C++ コンパイラ
-Ospace
実行時間が長くなる可能性はありますが、イメージサイズが小さくなる
ように最適化されます。例えば、大きな構造体のコピーは、インライン
コードの代わりに、離れた位置からの関数呼び出しで行われます。パ
フォーマンスよりもコードサイズが重要である場合には、このオプショ
ンを使用して下さい。デフォルトにはこの設定が使用されます。
-Otime
イメージサイズが大きくなる可能性はありますが、実行時間が短くなる
ように最適化されます。コードサイズよりも実行時間が重要である場合
には、このオプションを使用て下さい。例えば、このオプションを指定
すると、
while (expression) body;
が以下のようにコンパイルされます。
if (expression) {
do body;
while (expression);
}
-Otime と -Ospace のいずれも指定しない場合、コンパイラは -Ospace
を使用します。コードの中で時間が優先される部分は -Otime を使用し
てコンパイルし、残りは -Ospace でコンパイルすることができます。同
じコンパイラを呼び出すときに、-Otime と -Ospace の両方を指定する
ことはできません。
-Ono_inline 関数のインラインをディセーブルします。インライン関数への呼び出し
は、拡張インラインではありません。このオプションは、インライン関
数のデバッグに役立てることができます。
-Oinline
コンパイラに関数をインラインさせることができます。デフォルトには
この設定が使用されます。
コンパイラは、必要に応じて関数をインラインします。
•
-Ono_autoinline オプションが指定されていない限りは、最適
化レベル O2 で自動的に実行
•
C の __inline キーワードや C++ の inline キーワードのように、
関数がインライン関数として修飾されている場合。これは全ての
最適化レベルに適用されます。インライン関数として修飾されて
いる関数は、インラインされる可能性が高くなりますが、その修
飾子はコンパイラにとって単なる手かがりにすぎません。P. 3-6「関
数キーワード」を参照して下さい。
-Ospace と -Otime のどちらを選択するかによって、コンパイラが関数
をインラインするかどうかの基準は異なります。-Otime を選択すると、
インラインされる関数の数が増えます。
注
ROM イメージ内へのブレークポイントの設定
インライン関数にブレークポイントを設定すると、ARM デバッガはその
関数のインラインされた全てのインスタンスにブレークポイントを設定
しようと試みます。Multi-ICE® または他のハードウェアを使用して ROM
2-24
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
のイメージをデバッグする場合、インラインインスタンスの数が使用可
能なハードウェアブレークポイントを上回るとき、デバッガはそれ以上
のブレークポイントを設定することができずにエラーを通知します。
-Ono_autoinline
自動インラインをディセーブルします。この設定は、-Oinline がイネー
ブルされているときの最適化レベル -O1 および -O0 のデフォルトです。
-Oautoinline
自動インラインをイネーブルします。最適化レベル -O0 および -O1 では
デフォルトでオフになり、最適化レベル -O2 ではデフォルトでオンにな
ります。コンパイラは、必要に応じ、関数を自動的にインラインします。
-Ospace オプションと -Otime オプションは、コンパイラが自動的に関
数をインラインする方法に影響を及ぼします。
-Ono_ldrd ARM アーキテクチャ v5TE プロセッサに固有の最適化をディセーブルし
ます。デフォルトにはこの設定が使用されます。
-Ono_data_reorder
トップレベルのデータ項目(グローバルなど)の自動再順序付けをディ
セーブルします。C/C++ コンパイラは、データ項目間の無駄な空間を除
去することで、メモリを節約します。ただし、コンパイラによるデータ
の順序付けについてコードが想定を誤っている場合は、この最適化に
よって既存コードが壊れることがあります。C 標準では、データの順序
が保証されないため、想定された順序に依存するコードの記述を避ける
必要があります。データの順序付けが必要な場合は、データ項目を構造
体化して下さい。
-Oldrd
ARM アーキテクチャ v5TE プロセッサの固有の最適化をイネーブルしま
す。このオプションを選択し、-cpu xscale などのアーキテクチャv5TE
がサポートしている -cpu オプションを選択すると、コンパイラは以下
を実行します。
•
必要に応じて、LDRD 命令と STRD 命令を生成します。
•
double および long long 変数のナチュラルアライメントを 8 に
設定します。これは、各変数に対して __align(8) を指定するこ
とと同じです。
注
このオプションを選択すると、8 バイトアライメントにする必要が
あることが出力オブジェクトにマーキングされます。したがって、
1.1 より前のバージョンの ADS でビルドされたオブジェクトには
リンクできることはまずありません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-25
C および C++ コンパイラ
-split_ldm LDM 命令または STM 命令を必要に応じて 2 つ以上の LDM または STM 命
令に分割し、転送されるレジスタの最大数を以下の値まで減少するよう
にコンパイラに指示します。
•
全ての STM と、PC をロードしない LDM の場合、5
•
PC をロードする LDM の場合、4
このオプションを使用して、以下の ARM システムの割り込みレイテン
シを短縮させることができます。
•
キャッシュもライトバッファも実装されていないシステム
(キャッシュなしの ARM7TDMI など)
•
ウェイト状態のない 32 ビットメモリを使用するシステム
注
このオプションを使用するとコードサイズが大きくなり、パフォーマン
スが若干低下します。
このオプションによって、ARM インラインアセンブリの LDM 命令や STM
命令が、あるいは VFP の FLDM 命令や FSTM 命令が分割されることはあ
りませんが、Thumb の LDM および STM インラインアセンブリ命令は可
能な限り分割されます。ただし、インライン Thumb アセンブリルーチン
は廃止予定であり、使用すると警告メッセージが生成されます。
このオプションをキャッシュ搭載システムまたはライトバッファを実装
したプロセッサで使用しても、ほとんど効果はありません。
またこのオプションは、ウェイト状態のないメモリを使用するシステム
や、低速ペリフェラルデバイスが接続されたシステムでは、効果があり
ません。このようなシステムの割り込みレイテンシは、最も遅いメモリ
アクセスまたはペリフェラルアクセスに必要とされるサイクル数によっ
て決定されます。一般的にこのときのレイテンシは、多重レジスタ転送
によるレイテンシを大きく上回ります。
非限定浮動小数点定数のデフォルトタイプの設定
-auto_float_constants
このオプションは、接尾文字のない浮動小数点定数のタイプを double
(ANSI/ISO C および C++ 標準で指定されているもの)から unspecified へ
変更します。このコンテキストで、unspecified とはキャスト(型変換)さ
れていない double 定数であり、double 定数式は、double 以外の値を
含む式で使用されると、
floatとして扱われます。
こうすることで、
float
変数を使用したプログラムの実行速度が向上することがあります。
このような定数を含む定数式のコンパイル時の評価は、変化しません。
コンパイラは、倍精度の計算を使用しますが、unspecified タイプは保存
されます。例:
(1.0 + 1.0) // evaluates to the floating-point
// constant 2.0 of double precision and
// unspecified type.
2-26
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
ランタイムで評価される必要のある(?: 演算子を使用した演算子を含む)
バイナリ式では、unspecified タイプの定数は、double ではなく、float
に変換されます。コンパイラは次の警告を通知します。
C2621W: double constant automatically converted to float
float として処理させたい浮動小数点定数に、例 2-1 が示すように明示
的に f 接尾文字を使用することによって、この警告を回避することがで
きます。-Wk コンパイラオプションを使用すると、この警告をオフにす
ることができます。
注
この動作は、ANSI C 標準に準拠するものではありません。
式に含まれているその他のオペランドに double タイプのものがある場
合、unspecified タイプの定数は double に変換されます。unspecified タ
イプの定数をタイプ T にキャストすると、タイプ T の定数が生成されま
す(例 2-1)。
例 2-1 Double および Float
float f1(float x) { return x + 1.0; } // Uses float add and is treated the same
// as f2() below, a warning is issued.
float f2(float x) { return x + 1.0f;} // Uses float add with no warning, with
// or without -auto_float_constants.
float f3(double x) { return x + 1.0;} // Uses double add,
// no special treatment.
float f4(float x) { return x + (double)1.0;} // Uses double add,
// no special treatment.
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-27
C および C++ コンパイラ
コードセクションとデータセクションの制御
ソースファイル内の各関数に対して1つのEFLセクションを生成します。
出力セクションには、そのセクションを生成する関数と同じ名前が付け
られます。例:
int f(int x) { return x+1; }
-zo
これを -zo を指定してコンパイルすると、以下が生成されます。
AREA ||i.f||, CODE, READONLY
f PROC
ADD
MOV
r0,r0,#1
pc,lr
このオプションは、デフォルトの -remove リンカオプションがアクティ
ブなときに、リンカによる未使用関数の除去を可能にします。このオプ
ションを使用すると、アドレス、データ、ストリングリテラルを関数間
で共有する可能性が低くなるため、使用する関数によってはコードサイ
ズが若干大きくなります(一般的には数パーセント)
。ただし、ライブラ
リ用のコードを作成するときは、このオプションによって未使用関数が
リンクステージでインクルードされるのを防ぐことができます。こうす
ることで、最終的なイメージサイズを小さくすることができます。この
オプションをリンカ分散ローディング記述ファイルに使用すれば、特定
の関数を高速メモリ内に配置し、その他の関数を低速メモリ内に配置で
きます(ADS リンカ / ユーティリティガイドの分散ローディングファイ
ルのセクションを参照して下さい)。また、分散ローディングファイルを
使用して、関数をメモリの特定アドレスに配置することもできます。サー
ドパーティのコードを使用する場合は、ソースを変更する必要はありま
せんが、再コンパイルする必要があります(コードが既に -zo オプショ
ンを指定してコンパイルされている場合を除きます)。
pragma arm section
このプラグマは、これ以降の関数またはオブジェクトに使用されるコー
ドセクションまたはデータセクションの名前を指定します。これには、
初期化のためにコンパイラが作成する匿名オブジェクトの定義が含まれ
ます。
リンカに分散ローディング記述ファイルを使用すると、命名されたセク
ションをメモリ内の特定アドレスに配置することができます(P. 3-4
「コード生成を制御するプラグマ」および ADS リンカ / ユーティリティガ
イド参照)。
バイト順序の設定
-littleend リトルエンディアンメモリを使用して、ARM プロセッサ用のコードを生
成します。リトルエンディアンメモリでは、ワードの最下位バイトに最
下位アドレスが割り当てられます。デフォルトにはこの設定が使用され
ます。
-bigend
2-28
ビッグエンディアンメモリを使用して、ARM プロセッサ用のコードを生
成します。ビッグエンディアンメモリでは、ワードの最上位バイトに最
下位アドレスが割り当てられます。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
アライメントオプションの設定
-zasNumber
構造体の最小バイトアライメントを指定します。Number の値には以下
を指定することができます。
1, 2, 4, 8
デフォルトは、1 です。このオプションは廃止予定のため、本製品の今
後のバージョンではサポートされません。
-memaccess option
ターゲットシステムのメモリの機能が多少制限または拡張されているこ
とを、コンパイラに通知します。デフォルトでは、ARM コンパイラは、
メモリシステムがワードは 4 バイトアライメントで、ハーフワードは 2
バイトアライメントで、その他はバイトでロード / ストアできることを
想定しています。ロード / ストア機能は、option: を指定することで指
示することができます。
+L41
メモリは、アドレス指定されたバイトを含む境界整列ワード
を戻すことができます。このオプションは、ハーフワードの
ロードをサポートしていないARMアーキテクチャv3プロセッ
サにのみ役立ちます。
-S22
メモリがハーフワードをストアできないことを示します。こ
のオプションを使用して、アーキテクチャ v4(およびこれ以
降の)プロセッサを対象とした ARM コードを生成するとき
に、STRH 命令の生成を抑制することができます。
-L22
このメモリは、ハーフワードはロードできません。これを使
用すると、アーキテクチャ v4(以降の)プロセッサで、ARM
コードを生成するとき、LDRH 命令の生成を抑制することがで
きます。
注
Thumb コードをコンパイルするときは、-L22 も -S22 も使用しないで
下さい。
物理メモリにはないメモリアクセスモードがプロセッサで使用できる場
合もあります(境界整列ハーフワードのロードなど)。
また、プロセッサが使用できないアクセスモードを物理メモリで使用で
きる場合も考えられます(アーキテクチャ v3 の境界整列ハーフワードの
ロードなど)。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-29
C および C++ コンパイラ
実装情報の制御
全ての列挙子を整数で保存します。このオプションは、デフォルトでは
オフになっており、全ての列挙子の値を保持できる最小データタイプが
使用されます。
-fy
注
一般的な用途にこのオプションを使用することは推奨しません。また、
ANSI に準拠したソースには必要ありません。
このオプションを使用すると、char タイプに符号が付けられます。通
常は、符号は付きません。
-zc
注
一般的な用途にこのオプションを使用することは推奨しません。また、
ANSI に準拠したソースには必要ありません。不適切に使用すると、この
オプションによって生成されたイメージにエラーが発生する可能性があ
ります。
char の符号は、一般的にこれに作用する、最後に指定したオプションに
よって設定されます。例えば、-ansi と -zc オプションの両方を指定
し、char に符号を設定したい場合には、-ansi オプションの後に -zc
オプションを指定する必要があります。
2.3.10
警告メッセージの制御
コンパイラは、潜在的な移植性の問題やその他のハザードについて、警告メッセージ
を通知します。コンパイラオプションを使用すると、特定の警告をオフにすることが
できます。例えば、旧方式の C で記述されたプログラムの移植初期段階で、警告をオ
フにすることができます。一般的には、警告をオフにしないでコードをチェックした
方が良いでしょう。
これらのオプションは、特に指定されていない限り、デフォルトでオンに設定されます。
警告メッセージの詳細については、P. 2-34「追加チェックの指定」を参照して下さい。
-W コンパイラオプションの一般形式は以下の通りです。
-W[options][+][options]
この options フィールドにはゼロ以上の文字が含まれます。
-W に続く文字の中に + が含まれている場合、それ以降の文字に対応した警告は、抑制さ
れずにイネーブルされます。
同時に複数のオプションを指定することができます。例:
-Wad+fg
2-30
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
a および d で指定される警告メッセージをオフにし、f および g で指定される警告メッ
セージをオンにします。
警告メッセージのオプションは、以下の通りです。
-W
全ての警告を抑制します。このオプションの後に 1 文字以上の文字が続
く場合、それらの文字によって制御される警告のみが抑制されます。
-Wa
以下の警告を抑制します。
C2961W: Use of the assignment operator in a condition context
この警告は通常、コンパイラが以下のようなステートメントを検出した
ときに通知されます。
if (a = b) {...
上記は、以下のどちらかを意図している可能性があります。
if ((a = b) != 0) {...
if (a == b) {...
-Wb
-Wd
ANSI 標準の拡張に対して通知される警告メッセージを抑制します。例え
ば:
•
ANSI C の割り当てにおいてワイドになっていないタイプを使用し
たとき
•
char、short、long、long long のいずれかのタイプにビット
フィールドを指定したとき
•
va_start() などの可変ルーチン関数に対し char、short、
float、enum のいずれかの引数を指定したとき
以下の警告メッセージを抑制します。
C2215W: Deprecated declaration foo() - give arg types
この警告は通常、ANSI C モードで引数タイプが指定されていない宣言が
検出された場合に通知されます。
ANSI C では、このような宣言は廃止される予定です。ただし、古いコー
ドを移植する場合は、この警告を抑制すると役立つこともあります。
C++ では、void foo(); は void foo(void); を意味するため、警告
は生成されません。
-We
標準で、他の C コンパイラが認識する必要がないとされている拡張イニ
シャライザ(P. 3-17「C 言語拡張」参照)を使用しているときに生成さ
れる警告メッセージを抑制します。
-Wf
以下の警告を抑制します。
Inventing extern int foo()
これは C++ ではエラーであり、抑制することはできません。ANSI C で
は警告であり、このメッセージの抑制は、旧方式の C を ANSI C モード
でコンパイルするときに役立ちます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-31
C および C++ コンパイラ
-Wg
保護されていないヘッダファイルが #included であるときに通知され
る警告を抑制します。
C2819W: Header file not guarded against multiple inclusion
この警告はデフォルトでオフに設定されますが。-W+g を使用してイネー
ブルすることができます。保護されていないヘッダファイルとは、以下
のような宣言内でラップされないヘッダファイルを意味します。
#ifndef foo_h
#define foo_h
/* body of include file */
#endif
-Wi
自動的に定義された構成子に関する警告を抑制します(C++ のみ)。
C2887W: implicit constructor ’struct X’()
コードが、構成子を自動的に呼び出すよう要求している場合に通知され
ます。例:
struct X { X(int); };
X x = 10;
// actually means, X x = X(10);
// See the Annotated C++
// Reference Manual p.272
この警告はデフォルトでオフに設定されますが。-W+i でイネーブルす
ることができます。
-Wk
以下の警告をオフにします。
C2621W: double constant automatically converted to float
これらの警告は、非限定浮動小数点定数のデフォルトタイプが
-auto_float_constants オプションで変更されたときに通知されま
す。この警告はデフォルトでオンに設定されます。
-Wl
以下の警告をオフにします。
C2951W: lower precision in wider context
以下のようなコードが検出された場合、
long x; int y, z; x = y*z
ここでの乗算から int 結果が求められ、これが long に伸張されます。
デスティネーションが long long である場合、あるいはコードを 16
ビット整数、つまり 64 ビット長を使用するシステムに移植した場合にこ
の警告が通知されたときは、潜在的な問題があることを示しています。
このオプションはデフォルトでオフに設定されますが。-W+l でイネー
ブルすることができます。
-Wm
複数文字 char 定数についての警告を抑制します。
-Wn
以下の警告メッセージを抑制します。
C2921W: implicit narrowing cast
2-32
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
この警告は、コンパイラが int または char コンテキストで長い式の暗
示的な限定を検出した場合、あるいは整数コンテキストまたはより狭い
浮動小数点コンテキストで浮動小数点式の暗示的な限定を検出した場合
に通知されます。
このような暗示的な限定キャストは、int に 16 ビット、long に 32 ビッ
トが使用される 32 ビットシステムで開発されたコードを移動するとき、
常に問題の原因になります。このオプションはデフォルトでオフに設定
されます。
-Wo
符号付き long long 定数への暗示的変換に対する警告を抑制します。
-Wp
以下の警告メッセージを抑制します。
C2812W: Non-ANSI #include <…>
ANSI C 標準では、ANSI C ヘッダのみに #include <…> を使用するこ
とが要求されています。ただし、ANSI C 標準のこのアスペクトに準拠し
ていないコードをコンパイルするときに、この警告をディセーブルする
と便利です。この警告は、-strict オプションを指定しない限り、デ
フォルトで抑制されます。
-Wq
C++ 構成子の初期化順序に関する警告を抑制します。
-Wr
派生したクラスの非仮想メンバ関数が、親クラスの仮想メンバを隠蔽し
たときに通知される、暗示的な警告(C++ のみ)を抑制します。例:
struct Base { virtual void f(); };
struct Derived : Base { void f(); };
これに対して以下の警告が生成されます。
C2997W: 'Derived::f()' inherits implicit virtual from 'Base::f()'
派生したクラスに virtual キーワードを追加すると、警告を防ぐこと
ができます。
-Ws
コンパイラが struct にパディングを挿入したときに生成される警告を
抑制します。例:
C2221W: padding inserted in struct 's'
この警告はデフォルトでオフに設定されますが。-W+s でイネーブルす
ることができます。
-Wt
未使用の this 警告を抑制します。この警告は、暗示的な this 引数が
非スタティックメンバ関数で使用されていないときに通知され。C++ の
みに適用されます。この警告は、メンバ関数をスタティックメンバ関数
にすることで回避することも可能です。デフォルトではオフに設定され
ます。例:
struct T {
int f() { return 42; }
};
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-33
C および C++ コンパイラ
この結果、以下の警告が通知されます。
C2924W: 'this' unused in non-static member function
この警告を回避するには、static int f() ... を使用します。
-Wu
C コードでは、-Wu は C++ との上位互換性についての警告を抑制します。
警告はデフォルトで抑制されますが。-W+u でイネーブルすることがで
きます。例:
int *new(void *p) { return p; }
この結果、以下の警告が通知されます。
C2204W: C++ keyword used as identifier: 'new'
C2920W: implicit cast from (void *), C++ forbids
-Wv
以下のタイプの警告メッセージを抑制します。
C2218W: implicit 'int' return type for 'f' - 'void' intended?
これは通常、int を戻すと想定されていた関数からの復帰が原因で起こ
ります。他のタイプが指定されていなかったのにも関わらず、void 関数
として使用されているためです。この方法は、旧方式の C では幅広く使
用されています。このようなアクションは、C++ では常にエラーを発生
させます。
-Wx
このオプションは、以下のような未使用宣言に関する警告を抑制します。
C2870W: variable 'y' declared but not used
デフォルトでは、未使用宣言の警告は以下に対して通知されます。
•
変数、タイプ定義、関数のローカル(関数内の)宣言
•
ラベル(常に関数内)
•
トップレベルのスタティック関数およびスタティック変数
-Wy
2.3.11
廃止予定の機能に関する警告をオフにします。
追加チェックの指定
以下で説明するオプションを使用すると、チェックの範囲と厳正度を制御できるよう
になります。追加チェックを行うことで移植性が向上するため、コーディングする際
の習慣にしておくことを推奨します。
-fa
2-34
特定タイプのデータフロー異常をチェックします。コンパイラは、コー
ド生成の一環としてデータフロー分析を実行します。このチェックでは、
値が割り当てられる前に、いつ自動変数が使用されていた可能性がある
かを確認できます。このチェックは悲観的に行われるため、問題がない
場合でも異常を通知することがあります。一般的に、いずれかの段階で
-fa を使用してコード全体をチェックすると効果的です。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
-fh
以下をチェックします。
•
全ての外部オブジェクトが使用前に宣言されていること
•
ファイルを有効範囲とした全てのスタティックオブジェクトが使
用されていること
•
スタティック関数の全ての先行宣言が、宣言と定義の間で使用さ
れていること。例:
static int f(void);
static int f(void){return 1;}
line 2: Warning: unused earlier static declaration of 'f'
•
インクルードヘッダファイル内でのみ宣言されている外部オブ
ジェクトが、ソースファイルで使用されていること
これらのチェックにより、自ずと優れたモジュラをプログラミングでき
ます。
市販ソフトウェアを記述するときは、プログラム開発の後半でのみ -fh
オプションを使用して下さい。初期段階では余分な診断が煩雑に感じら
れることがあります。
-fp
ポインタへの整数の明示的なキャストを通知します。例:
char *cp = (char *) anInteger;
この警告は、潜在的な移植性の問題を示しています。ポインタと整数の
間の明示的なキャスティングは推奨できませんが、両者が 32 ビットタイ
プとなる ARM プロセッサ上では有害ではありません。また、このオプ
ションを指定すると同一タイプへのキャストが発生し、警告が生成され
ます。例:
int f(int i) {return (int)i;}
// Warning: explicit cast to same type.
ARM DUI0067DJ-00
-fv
全ての未使用宣言を通知します(標準ヘッダからの未使用宣言も含みま
す)。
-fx
このセクションで説明している追加チェックを例外として、デフォルト
で通常は抑制されている警告全てをイネーブルします。
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-35
C および C++ コンパイラ
2.3.12
エラーメッセージの制御
コンパイラはエラーを通知することで、コンパイルしようとしているコードにある重
大な問題を示します。次に示すコンパイラオプションを使用して、以下を行うことが
できます。
•
特定の回復可能なエラーをオフにする。
•
特定のエラーを警告に降格する。
注意
これらのオプションは、通常であればエラーを発生させる C および C++ ソースをコン
パイラが受け入れるよう強制します。エラーメッセージを無視するためにこれらのオ
プションのいずれかを使用している場合、ソースコードが適切な C または C++ 標準に
準拠しない恐れがあります。
これらのオプションは、開発段階や、他の環境からソースコードをインポートする場
合などに役立ちます。ただし、正しく機能しないコードの生成が許可されてしまうこ
ともあります。一般的には、オプションを使用してエラーメッセージの生成をオフに
するよりも、ソースを修正することが推奨されます。
-E コンパイラオプションの一般形式は以下の通りです。
-E[options][+][options]
options には、以下で説明しているように、a、c、f、i、l、p、z の 1 つ以上の文字の
組み合わせを指定できます。
-Eに続く文字の中に+が含まれている場合、それ以降の文字に対応したエラーメッセー
ジが抑制されずにイネーブルされます。
注
-E オプションは、その他のオプションを使用せずに単独で使用すると、プリプロセッ
サスイッチになります。P. 2-15「プリプロセッサオプションの設定」の設定を参照して
下さい。
複数のオプションを指定することができます。例:
-Eac
a および c で指定されるエラーメッセージをオフにします。
2-36
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラ
以下のオプションは、デフォルトでオンに設定されます。
-Ea
C++ のみを対象とし、アクセス制御エラーを警告に降格します。例:
class A { void f() {}; };// private member
A a;
void g() { a.f(); }
// erroneous access
C3032E: ’A::f’ is a non-public member
-Ec
ゼロ以外の int が pointer に暗示的にキャストされる場合など、暗示
的な全てのキャストエラー抑制します。
C3029E: ’=’: implicit cast of non-0 int to pointer
-Ef
short から pointer へのような、クリーンではないキャストに対する
エラーを抑制します。
-Ei
C++ のみを対象とし、const i; などの構造中の暗示的な int の使用に
関するエラーを警告に降格します。
C2225W: declaration lacks type/storage-class (assuming 'int'): 'i'
-El
関数が extern として暗示的に宣言され、その後 static で再宣言され
ている場合のリンケージの不一致に関するエラーを抑制します。
C2991E: linkage disagreement for ’f’ - treated as ’extern’
-Ep
プリプロセッサ行の最後の余分な文字によって生じるエラーを抑制し
ます。
-Ez
ゼロ長配列が原因で発生するエラーを抑制します。
C3017E: size of a [] array required, treated as [1]
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
2-37
C および C++ コンパイラ
2-38
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
第3章
ARM コンパイラリファレンス
本章では、ARM C および C++ コンパイラの ARM 固有の機能について説明します。本
章は以下のセクションから構成されています。
•
コンパイラ固有の機能:P. 3-2
•
•
•
言語拡張:P. 3-17
C および C++ の実装情報:P. 3-22
事前定義マクロ:P. 3-32
ARM C および C++ コンパイラに関する参考情報については、以下を参照して下さい。
ARM DUI0067DJ-00
•
付録 B「標準 C 実装定義」
•
付録 C「標準 C++ 実装定義」
•
付録 D「C および C++ コンパイラの実装に関する制限」
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-1
ARM コンパイラリファレンス
3.1
コンパイラ固有の機能
このセクションでは、ARM C および C++ コンパイラの ARM 固有のアスペクトを説明
します。
•
プラグマ
•
関数キーワード:P. 3-6
•
変数宣言キーワード:P. 3-10
注
ここで説明している機能は ANSI の仕様に沿ったものではないため、他のコンパイラへ
の移植が容易ではないこともあります。
3.1.1
プラグマ
ARM コンパイラは、以下の形式のプラグマを認識することができます。
#pragma [no_]feature-name
表 3-1 は、プラグマの一覧を示しています。以下のセクションではこれらのプラグマに
ついて詳しく説明します。
表 3-1 ARM コンパイラに認識されるプラグマ
プラグマ名
デフォルト 参照
arm section
オフ
P. 3-4「コード生成を制御するプラグマ」
check_printf_formats
オフ
P. 3-3「printf および scanf 引数チェックを制御するプラグマ」
check_scanf_formats
オフ
P. 3-3「printf および scanf 引数チェックを制御するプラグマ」
check_stack
オン
P. 3-4「コード生成を制御するプラグマ」
debug
オン
P. 3-3「デバッグを制御するプラグマ」
import
–
P. 3-4「コード生成を制御するプラグマ」
Ospace
–
P. 3-3「最適化を制御するプラグマ」
Otime
–
P. 3-3「最適化を制御するプラグマ」
Onum
–
P. 3-3「最適化を制御するプラグマ」
softfp_linkage
オフ
P. 3-4「コード生成を制御するプラグマ」
3-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
printf および scanf 引数チェックを制御するプラグマ
以下のプラグマは、printf や scanf に類似する引数のタイプチェックを制御します。
check_printf_formats
このプラグマは、リテラル形式ストリングが存在する場合、それに対す
るタイプチェックで printf に類似した関数をマーキングします。形式が
リテラルストリングではない場合、タイプチェックは行われません。形
式ストリングは、最後の固定引数とする必要があります。例:
#pragma check_printf_formats
extern void myprintf(const char * format,...);
//printf format
#pragma no_check_printf_formats
check_scanf_formats
このプラグマは、宣言された関数を scanf に類似した関数としてマーキン
グするため、引数のタイプチェックはそのリテラル形式ストリングに対
して行われます。形式がリテラルストリングではない場合、タイプチェッ
クは行われません。形式ストリングは、最後の固定引数とする必要があ
ります。例:
#pragma check_scanf_formats
extern void myformat(const char * format,...);
//scanf format
#pragma no_check_scanf_formats
デバッグを制御するプラグマ
以下のプラグマは、デバッグテーブルの生成におけるアスペクトを制御します。
debug
このプラグマは、デバッグテーブル生成のオン / オフを切り替えます。
#pragma no_debug が指定されている場合は、次の #pragma debug が
出現するまで、それ以降の宣言と関数に関するデバッグテーブルエント
リは生成されません。
最適化を制御するプラグマ
以下のプラグマは、最適化のアスペクトを制御します。
Ospace
このプラグマは、空間(大文字の O)を最適化します。
Otime
このプラグマは、時間を最適化します。
Onum
このプラグマは、最適化レベルを変更します。num の値には、0、1、2
のいずれかを指定します。最適化レベルの詳細については、P. 2-23「最
適化基準の定義」を参照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-3
ARM コンパイラリファレンス
コード生成を制御するプラグマ
以下のプラグマは、コードの生成方法を制御します。コンパイラのコマンドラインか
らは、この他に数多くのコード生成オプションを使用することができます。
check_stackこのプラグマは、スタックチェックが #pragma no_check_stack で
ディセーブルされ、-apcs /swst コマンドラインオプションが使用さ
れている場合に、スタックリミット違反をチェックする関数エントリ
コードの生成を再イネーブルします。
softfp_linkage
このプラグマは、次の #pragma no_softfp_linkage までの関数宣言
全てが、ソフトウェア浮動小数点リンケージを使用する関数を示してい
ることをアサートします。__softfp キーワードにはこれと同じ効果が
あり、こちらを使用することを推奨します(P. 3-6「関数キーワード」参
照)。このプラグマ形式は、ファイルを変更せずに、インタフェース仕様
(ヘッダファイル)全体に適用したい場合に便利です。
import(symbol_name)
このプラグマは、インポートする symbol_name への参照を生成します。
これは以下のアセンブラディレクティブと同じです。
IMPORT symbol_name
シンボル名は、そのイメージのシンボルテーブル内に外部シンボルとし
て配置されます。このように配置されない場合は使用されません。シン
ボルを定義したり、そのシンボルへの参照を作成したりすることはでき
ません。
このプラグマを使用すると、ヒープ実装やリアルタイム分割など、C ラ
イブラリの特定機能を選択することができます。この使用例については、
P. 4-10「セミホスティング SWI の回避」を参照して下さい。
arm section section_sort_list
このプラグマは、これ以降で使用される関数またはオブジェクトに使用
されるコードセクションまたはデータセクションの名前を指定します。
これには、初期化のためにコンパイラが作成する匿名オブジェクトの定
義が含まれます。このオプションは、以下に対しては作用しません。
•
宣言
•
インライン関数(およびそれらのローカルスタティック変数)
•
テンプレート例示(およびそれらのローカルスタティック変数)
•
未使用変数および未使用関数の削除
•
定義がオブジェクトファイルに書き込まれる順序
3-4
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
以下はプラグマの完全構文を示しています。
#pragma arm section [sort_type[[=]"name"]] [,sort_type="name"]*
name にはセクションに使用する名前を、sort_type には以下のいずれ
かを指定します。
•
code
•
rwdata
•
rodata
•
zidata
sort_type を指定し、name を指定していない場合は、sort_type のセ
クション名がデフォルト値にリセットされます。#pragma arm
section だけを入力すると、全てのオブジェクトセクションの名前をデ
フォルトに復元できます。例 3-1 を参照して下さい。
例 3-1 セクションの命名
int x1 = 5;
int y1[100];
int const z1[3] = {1,2,3};
// in .data (default)
// in .bss (default)
// in .constdata (default)
#pragma arm section rwdata = "foo", rodata = "bar"
int x2 = 5;
int y2[100];
int const z2[3] = {1,2,3};
char *s2 = "abc";
//
//
//
//
in
in
in
s2
foo (data part of region)
.bss
bar
in foo, "abc" in bar
#pragma arm section rodata
int x3 = 5;
int y3[100];
int const z3[3] = {1,2,3};
char *s3 = "abc";
//
//
//
//
in
in
in
s3
foo
.bss
.constdata
in foo, "abc" in .constdata
#pragma arm section code = "foo"
int add1(int x)
{
return x+1;
}
#pragma arm section code
// in foo (code part of region)
リンカに分散ローディング記述ファイルを使用すると、命名されたセクションをメモリ
内の特定アドレスに配置することができます(ADSリンカ/ユーティリティガイド参照)。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-5
ARM コンパイラリファレンス
3.1.2
関数キーワード
キーワードの中には、関数に特殊処理を施すようにコンパイラに要求するものがあり
ます。これらのキーワードは全て ANSI C に追加した ARM の拡張機能です。
関数内の宣言
関数内の宣言は、それ以降のステートメントの処理方法が異なることを示します。asm
キーワードによって周辺関数が修正されることはありませんが、このキーワード以降
のステートメントが異なることを示します。
__asm
コンパイラに対し、以降のコードがアセンブラ言語(P. 3-19「インライ
ンアセンブラ」参照)で記述されていることを通知します。
関数修飾子
関数修飾子は、関数のタイプに影響を及ぼします。修飾子は、C++ メンバ関数タイプ
の const および volatile と同じように、パラメータリストの後に配置されます。
__irq
これによって、C または C++ 関数は、IRQ または FIQ ベクタによって呼
び出される割り込みルーチンとして使用できます。浮動小数点レジスタ
を除き、更新されるレジスタは ATPCS で通常保存されるものだけではな
く全て保存されます。この場合はデフォルトの ATPCS モードを使用する
必要があります。この関数は、pc に lr-4 を、CPSR に SPSR の値に設定
することで使用できます。tcc や tcpp では使用できません。__irq 関数
に引数や戻り値を使用することはできません。
__irq の使用方法については、ADS デベロッパガイドの「プロセッサ例
外処理」を参照して下さい。
__pure
関数宣言がピュアであることをアサートします。ピュア関数は、共通部
分式の削除の対象になります。デフォルトでは、関数は非ピュア(副作
用がある)と想定されます。関数は、以下を満たす場合のみ、ピュアと
して適切に定義されます。
•
結果が引数の値のみに依存する。
•
副作用がない。例えば、非ピュア関数を呼び出さない。
したがって、コンパイラはピュア関数がメモリ(スタックメモリを除く)
にアクセスしないと想定しているため、ピュア関数はグローバル変数も
デリファレンスポインタも使用することができません。同じパラメータ
で 2 度呼び出される場合も、ピュア関数は毎回同じ値を戻す必要があり
ます。
__pure 宣言は、接頭宣言または接尾宣言として使用することもできます。
場合によっては、接頭形式は曖昧になることがあり、接尾形式を使用す
ることで可読性が向上します。
3-6
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
__pure void (*h(void))(void); /* declares 'h' as a (pure?)
function that returns a pointer to a (pure?) function. It is
ambiguous which of the two function types is pure. */
void (*h1(void) __pure)(void); /* 'h1' is a pure function
returning a pointer to a (normal) function */
__softfp
関数がソフトウェア浮動小数点リンケージを使用することをアサートし
ます。この関数への呼び出しにより、浮動小数点引数が整数レジスタに
渡されます。結果が浮動小数点値である場合、この値は整数レジスタに
戻されます。これにより、ソフトウェア浮動小数点のコンパイル対象化
動作が 2 度にわたって繰り返されます。
このキーワードを使用すると、ハードウェアおよびソフトウェア浮動小
数点を使用するようにコンパイルされるソースで、同一ライブラリを使
用できるようになります。
__swi
最高 4 つの整数ライクな引数を取り、最高 4 つの結果を value_in_regs
構造に戻す SWI 関数を宣言します。これにより、通常の関数呼び出しと
同じように動作する ATPCS 準拠の SWI として、関数の呼び出しがイン
ラインでコンパイルされます。
結果を戻さない SWI には以下を使用します。
void __swi(swi_num) swi_name(int arg1,…, int argn);
例:
void __swi(42) terminate_proc(int procnum);
結果を 1 つ戻す SWI には以下を使用します。
int __swi(swi_num) swi_name(int arg1,…, int argn);
複数の結果を戻す SWI には以下を使用します。
typedef struct res_type { int res1,…,resn;} res_type;
res_type __value_in_regs __swi(swi_num) swi_name(
int arg1,…,int argn);
__value_in_regs 修飾子を使用すると、4 ワード(16 バイト)までの小
さな構造体を、ATPCS で定義されている通常の構造体受け渡し方式に
よってではなく、レジスタに戻すことを指定できます。
詳細については、ADS デベロッパガイドの「プロセッサ例外処理」を参
照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-7
ARM コンパイラリファレンス
__swi_indirect
演算コードを r12 で SWI ハンドラに渡します。
int __swi_indirect(swi_num)
swi_name(int real_num,
int arg1, … argn);
各オプションの説明:
SWI 命令で使用されている SWI 番号
swi_num
real_num
r12 で SWI ハンドラに渡される値。この機能を使用
すると、間接的に SWI を実装することができます。
SWI ハンドラは、r12 を使用して、関数の実行を決
定することができます。
例:
int __swi_indirect(0) ioctl(int swino, int fn,
void *argp);
この SWI は以下のように呼び出すことができます。
ioctl(IOCTL+4, RESET, NULL);
この結果、r12 内の OICTL+4 を使用して SWI 0 にコンパイルされます。
間接 SWI 方式を使用するには、使用するシステムの SWI ハンドラが、r12
の値を使用して要求されている演算を選択する必要があります。
__value_in_regs
最大 4 つの整数ワードから成る構造体、または最大 4 つの float または
double を、メモリを使用するのではなく、それぞれ整数レジスタと浮動
小数点レジスタに戻すようコンパイラに命令します。例:
typedef struct int64_struct {
unsigned int lo;
unsigned int hi;
} int64_struct;
__value_in_regs extern
int64_struct mul64(unsigned a, unsigned b);
関数 __value_in_regs の宣言は、複数の結果を返すアセンブラ関数を
呼び出すときに便利です。構造体に使用されるデフォルトの受け渡し方
法と戻し方法については、AXD/armsd デバッガガイドを参照して下さい。
注
構造体のコピーを作成する必要がある場合、C++ 関数では
__value_in_regs 構造を戻すことはできません。
3-8
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
関数記憶域クラス修飾子
関数記憶域修飾子は、関数宣言キーワードのサブセットですが、関数のタイプには影
響を及ぼしません。
__inline
コンパイラに対し、必要に応じて C 関数をインラインでコンパイルする
ように命令します。__inline のセマンティクスは、以下のように C++
inline キーワードのそれと全く同じです。
__inline int f(int x) {return x*5+1;}
int g(int x, int y) {return f(x) + f(y);}
コンパイラは、__inline が使用されている場合に、関数がそれほど大
き過ぎるものでなければ、その関数をインラインでコンパイルします。
大きな関数は、コード密度とパフォーマンスに影響を及ぼすため、イン
ラインではコンパイルされません。インラインに影響を及ぼすコマンド
ラインオプションの詳細については、P. 2-23「最適化基準の定義」を参
照して下さい。
__weak
存在していない場合でも、リンカが未解決の参照として障害を引き起こ
さないような、extern 関数またはオブジェクトの宣言を指定します。リ
ンカは、他のコンパイルで関数またはオブジェクトを非 weak(弱)な状
態で使用している場合を除き、ライブラリからその関数またはオブジェ
クトをロードしません。参照が未解決のままであれば、その値は NULL
と想定されます。ライブラリ検索の詳細については、ADS リンカ / ユー
ティリティガイドを参照して下さい。
参照が、分岐または分岐リンク命令にコンパイルされるコードから作成
される場合、その参照は次の命令への分岐として解決されます。事実上
これによってその分岐は無効になります。
__weak void f(void);
...
f(); // call f weakly
関数またはオブジェクトは、同じコンパイルにおいて weak と非 weak の
両方で使用することはできません。例えば、以下のコードは、g() およ
び h() から f() を weakly(弱)で使用しています。
void f(void);
void g() {f();}
__weak void f(void);
void h() {f();}
関数またはオブジェクトを定義する同一のコンパイルから、その関数ま
たはオブジェクトを weakly(弱)で使用することはできません。以下の
コードは、h() から非 weakly(弱)で f() を使用しています。
__weak void f(void);
void h() {f();}
void f() {}
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-9
ARM コンパイラリファレンス
3.1.3
変数宣言キーワード
このセクションでは、標準および ARM 固有の変数宣言に使用できる様々なキーワード
の実装について説明します。ARM 固有の動作および制約条件をサポートしていない標
準 C/C++ キーワードについては、説明していません。volatile や __packed などの
修飾子の詳細については、P. 3-12「タイプ修飾子」を参照して下さい。
標準キーワード
以下のキーワードは、記憶域クラスを宣言します。
register
ARM コンパイラを使用すると、記憶域クラスを register に設定した
任意の数のローカルオブジェクト(自動変数)を宣言できます。
注
コンパイラは非常に効果的にコードの最適化を行うため、register の
使用は推奨しません。コンパイラは register キーワードを単なる候補
とみなします。register キーワードで宣言されていないその他の変数
はレジスタに保持することができ、レジスタ変数はメモリに保持するこ
とができます。register を使用すると、コンパイラが最適化を行う際
にそのレジスタの使用が制限されるため、コードサイズが大きくなるこ
とがあります。
使用する ATPCS のバリアントにより、5 ~ 7 個の整数レジスタと、4 個
の浮動小数点レジスタを使用できます。一般的に、4 つを超える整数レ
ジスタ変数と、2 つを超える浮動小数点レジスタ変数を宣言することは
推奨しません。
以下のオブジェクトタイプは、register 記憶域クラスをもつように宣
言することができます。
•
全ての整数タイプ(long long には 2 レジスタが使用されます)
•
•
•
3-10
全ての整数ライクな構造体。つまり、アドレス指定可能な全ての
フィールドが同じアドレスをもつ 1 ワードの struct または
union、あるいはビットフィールドのみで構成される 1 ワードの構
造体を指します。このような構造体は、32 ビットになるようにパ
ディングする必要があります。
任意のポインタタイプ
浮動小数点タイプ。ソフトウェア浮動小数点が使用されている場
合、倍精度浮動小数点タイプの double は 2 つの ARM レジスタを
占有します。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
ARM 固有のキーワード
このセクションのキーワードは、変数定義の宣言または修正に使用します。
__int64
このタイプ指定子は、タイプ long long の別名です。-strict を使用
しているときにも認識されます。
__global_reg(vreg)
この記憶域クラスは、宣言された変数をグローバル整数レジスタ変数に
割り当てます。この記憶域クラスを使用すると、extern、static、typedef
などの他の記憶域クラスは使用できなくなります。vreg は ATPCS 呼び
出し先保存レジスタ(v1 など)であり、実際のレジスタ番号(r4 など)
ではありません。C では、グローバルレジスタ変数を宣言時に修飾、初
期化することはできません。C++ では、全ての初期化が動的な初期化と
して処理されます。有効なタイプは、以下の通りです。
•
long long を除く任意の整数タイプ
•
任意のポインタタイプ
例えば、r5(ATPCS レジスタ v2)に割り当てられたグローバル整数レジ
スタ変数を宣言するには、以下を使用します。
__global_reg(2) int x;
このグローバルレジスタは、同じ変数の全ての宣言で指定する必要があ
ります。例えば、以下のコードからはエラーが生成されます。
int x;
__global_reg(1) int x; // error
また、C で記述した __global_reg 変数は、定義時に初期化することは
できません。例えば、以下は C++ ではエラーになりませんが、C ではエ
ラーになります。
__global_reg(1) int x=1; // error in C
使用している ATPCS により、グローバルレジスタ変数には 5 ~ 7 個の整
数レジスタと、4 個の浮動小数点レジスタを使用できます。実際は、ARM
コードでは 3 つを超えるグローバル整数レジスタ変数、Thumb コードで
は 1 つのグローバル整数レジスタ変数、それ以外では 2 つを超えるグロー
バル浮動小数点レジスタ変数の使用は推奨できません。
注
Thumb では __global_reg(4) は使用できません。
標準 register キーワードで宣言されたレジスタ変数とは異なり、コン
パイラはグローバルレジスタ変数を必要に応じてメモリに移動すること
は行いません。あまりに多くのグローバル変数を宣言すると、コードサ
イズは著しく大きくなります。場合によっては、プログラムをコンパイ
ルできないことがあります。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-11
ARM コンパイラリファレンス
注意
グローバルレジスタ変数を使用するときは、以下の理由で注意を払う必
要があります。
•
異なるコンパイルユニット間での直接呼び出しが適切であるかど
うかがリンク時にチェックされません。できるだけ、プログラム
で使用されているグローバルレジスタ変数は、プログラムの各コ
ンパイルユニットで定義して下さい。一般的に、定義はグローバ
ルヘッダファイルに配置するのが最も適切です。グローバルレジ
スタの値は、このレジスタが使用される前に、コードの最初の段
階で設定する必要があります。
•
グローバルレジスタ変数は呼び出し先保存レジスタにマッピング
されるため、その値をグローバルレジスタ変数として使用しない
ライブラリなどのコンパイルユニットでは、この値が関数への呼
び出しを介して保存・復元されます。
•
グローバルレジスタ変数を使用するコンパイルユニットへのコー
ルバックは危険です。例えば、関数を使用するグローバルレジス
タが、グローバルレジスタ変数を宣言しないコンパイルユニット
から呼び出されると、その関数は推測したグローバルレジスタ変
数から誤った値を読み出します。
•
このクラスは、ファイルの有効範囲のみで使用できます。
タイプ修飾子
このセクションでは、標準 C および ARM 固有の様々なタイプ修飾子の実装について
説明します。これらのタイプ修飾子を使用して、修飾されたタイプを特別な方法で処
理するようにコンパイラに指示することができます。ARM 固有の動作または制約条件
をサポートしてない標準修飾子については説明していません。
__align()
__align() 記憶域クラス修飾子は、トップレベルオブジェクトをバイト
境界で整列させます。LDRD または STRD 命令を使用する場合には 8 バイ
トアライメントに設定する必要があり、これによって VFP 命令を使用し
たときにパフォーマンスを大幅に向上させることができます。
例えば、LDRD または STRD 命令を使用して、ARM アセンブリ言語から
C または C++ で定義されたデータオブジェクトにアクセスする場合は、
__align(8) 記憶域クラス指定子を使用することによって、そのデータ
オブジェクトを正しく境界整列させる必要があります。
アライメント境界には 2 の累乗を指定することができますが、自動変数
に指定できる最大値は 8 です。指定できるのはオーバアライメントだけ
です。つまり、2 バイトオブジェクトを 4 バイト境界で整列させること
はできますが、4 バイトオブジェクトを 2 バイト境界で整列させること
はできません。
3-12
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
__align(8) は、記憶域クラス修飾子です。つまり、トップレベルオブ
ジェクトにのみ使用できます。以下には使用できません。
•
タイプ。typedef や構造体の定義を含む。
•
関数パラメータ
この修飾子は extern または static と組み合わせて使用することがで
きます。
__align(8)には、被修飾オブジェクトを8バイト境界で整列させる目的
しかありません。したがって、場合によっては構造体を明示的にパディ
ングするなどの操作が必要となります。
注
ARM-Thumb プロシージャコール標準では、全ての外部インタフェース
でスタックを 8 バイト境界で整列させることが要求されています。ARM
コンパイラおよび C ライブラリでは、スタックは常に 8 バイトアライメ
ントで保持されます。さらに、デフォルトの C ライブラリメモリモデル
は、ヒープを 8 バイトアライメントで保持します。
__packed
__packed修飾子は、
全ての有効タイプのアライメントを1に設定します。
つまり、以下のことを意味します。
•
パックオブジェクトを境界整列させるためのパディングの挿入は
行われません。
•
パックタイプのオブジェクトの読み出し / 書き込みは、非境界整列
アクセスを使用して行われます。
__packed 修飾子は、以下には使用できません。
•
•
•
浮動小数点タイプ
浮動小数点フィールドのある構造体または共用体
__packed を使用せずに以前宣言された構造体
注
厳密には、__packed はタイプ修飾子ではありません。このセクションで
説明しているのは、多くの点でタイプ修飾子のように動作するためです。
__packed 修飾子は、積分タイプのローカル変数に影響を及ぼしません。
__packed修飾子は、__packedを使用して宣言される構造体または共用
体の全てのメンバに適用されます。メンバ間にも構造体の終わりにもパ
ディングは挿入されません。パック構造の全てのサブ構造は、
__packed を使用して宣言する必要があります。非パック構造の積分サ
ブフィールドは個々にパックできます。
パック構造または共用体には、対応する非パック構造との代入互換性は
ありません。構造体によって使用されるメモリレイアウトは異なるため、
パック構造を非パック構造に割り当てるには、フィールドごとにコピー
するしかありません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-13
ARM コンパイラリファレンス
__packed のキャスティングの効果は定義されていません。非パック構
造をパック構造へキャスティングする影響は定義されていません。積分
タイプへのポインタは、明示的、暗示的を問わず、パック積分タイプへ
のポインタに適切にキャスティングすることができます。
ポインタは、パックタイプを指すことができます(例 3-2)。
例 3-2 パックへのポインタ
__packed int *p
パック配列タイプはありません。パック配列とは、パックタイプのオブ
ジェクトの配列を指します。配列はパディングされません。
注
ARM プロセッサでは、非境界整列データへのアクセスに最高 7 つの命令
と、3 つのワークレジスタを使用できます。パック構造を介したデータ
アクセスは、コードサイズの増大とパフォーマンスの低下を避けるため
に最小限に抑える必要があります。
__packed 修飾子は、構造体の外部データ構造へのマッピングや、非境界
整列データへのアクセスに使用すると効果的ですが、アクセスにかかる
コストが比較的高いため、一般的にデータサイズの節約には効果があり
ません。非境界整列アクセスの数は、パッキングを必要とする構造体に
フィールドをパッキングすることによってのみ減らすことができます。
ポインタを使用してパックオブジェクトにアクセスする場合、コンパイ
ラはポインタのアライメントに依存せずに機能するコードを生成します
(P. 3-15 例 3-3)。
3-14
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
例 3-3 パック構造
typedef __packed struct
{
char x;
// all fields inherit the __packed qualifier
int y;
}X;
// 5 byte structure, natural alignment = 1
int f(X *p)
{
return p->y;
// does an unaligned read
}
typedef struct
{
short x;
char y;
__packed int z; // only pack this field
char a;
}Y;
// 8 byte structure, natural alignment = 2
int g(Y *p)
{
return p->z + p->x;
}
// only unaligned read for z
volatile
標準 ANSI 修飾子 volatile は、被修飾タイプがプログラム外部から変
更可能なデータを保持することをコンパイラに通知します。コンパイラ
は、volatile タイプへのアクセスの最適化は試行しません。例えば、
揮発性構造はメモリマップされたペリフェラルレジスタにマップするこ
とができます。
/* define a memory-mapped port register */
volatile unsigned *port = (unsigned int *) 0x40000000;
/* to access the port */
*port = value
/* write to port */
value = *port
/* read from port */
ARM C および C++ では、オブジェクトに含まれる任意のワードまたは
バイト(あるいは、ハーフワードをサポートしている ARM アーキテク
チャではハーフワード)の読み出し / 書き込みを行う場合は、この
volatileオブジェクトがアクセスされます。volatileオブジェクトで
は、ソースコードによって自動的に定義される順番で、ソースコードが
自動的に定義するとおりに読み出しと書き込みが発生します。ハーフ
ワードをサポートしていない ARM アーキテクチャでは、volatile
short へのアクセスによる影響は定義されていません。揮発性 packed
データへのアクセスは定義されていません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-15
ARM コンパイラリファレンス
__weak
この記憶域クラスは、存在していなくてもリンカが未解決の参照で障害
を引き起こさないような extern オブジェクトの宣言を指定します。
参照が未解決のままである場合は、その値は NULL と想定されます。た
だし、未解決の参照は、それがコードから位置独立セクションへの参照
である場合、または検出されない __weak 関数への参照である場合には、
NULL にはなりません(例 3-4)。
例 3-4 非 NULL 未解決参照
__weak const int c;
// assume 'c' is not present in final link
const int* f1() { return &c; } // '&c' will be non-NULL if
// compiled and linked /ropi
__weak int i;
int* f2() { return &i; }
// assume 'i' is not present in final link
// '&i' will be non-NULL if
// compiled and linked /rwpi
__weak void f(void);
typedef void (*FP)(void);
FP g() { return f; }
// assume 'f' is not present in final link
// 'g' will return non-NULL if
// compiled and linked /ropi
P. 3-9「関数記憶域クラス修飾子」を参照して下さい。
3-16
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
3.2
言語拡張
このセクションでは、ARM コンパイラがサポートしている言語拡張について説明し
ます。
3.2.1
C 言語拡張
ARM コンパイラは、P. 3-22「C および C++ の実装情報」と以下で説明している ANSI
C 言語拡張をサポートしています。-strict コンパイラオプションの指定などにより、
厳密な ANSI C をコンパイルするようにコンパイラを制限している場合には拡張できま
せん。
// comments
文字シーケンス // は、コメントの開始を示します。C++ の場合と同様に、コメントは
次の復帰改行文字で終了します。
注
コメントの削除は、行の継続の後で行われます。
// this is a - \
single comment
コメントの文字は、コメント終止符を検出するためだけに検査されます。したがって:
•
// は、/* で始まるコメント内部では、特別な意味を持ちません。
•
/* は、// で始まるコメント内部では、特別な意味を持ちません。
定数式
イニシャライザには、以下に示すような拡張定数式を使用することができます。
int i;
int j = (int)&i; /* but not allowed by ANSI/ISO */
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-17
ARM コンパイラリファレンス
3.2.2
C/C++ 言語拡張
このセクションでは、ARM コンパイラに使用できる ANSI C 言語および ISO/IEC C++
言語の両方の拡張について説明します。C のみに適用される拡張については、P. 3-17
「C 言語拡張」を参照して下さい。これらの拡張は、厳密な ANSI C または ISO/IEC C++
をコンパイルするようにコンパイラを制限している場合には使用できません。例えば、
-strict コンパイラオプションを指定している場合などがこれに当てはまります。
識別子
$ は、識別子に使用できるリーガルな文字です。
Void:復帰および引数
:復帰および引数
void に対する typedef を含めた全ての void タイプは、関数宣言内の復帰タイプとし
て、または関数が引数を取らないことを示すインジケータとして使用できます。例え
ば以下のようなコードを使用できます。
typedef void VOID;
int fn(VOID);
VOID fn(int x);
// Error in -strict C and C++
// Error in -strict C
long long
ARM C/C++ コンパイラは、タイプ指定子 long long および unsigned long long
によって、64 ビット整数をサポートします。これらは、通常の算術変換において long
および unsigned long と類似した動作を示します。long long は __int64 の同義
語です。
整数定数には以下を設定することができます。
•
ll 接尾文字。定数のタイプに long long が適していれば long long を、これ
が不適切であれば unsigned long long に設定します。
•
llu(または ull)接尾文字。定数のタイプに unsigned long long を設定し
ます。
%lld や %llu のように、printf() および scanf() のフォーマット指定子に ll を含め
ることにより、それ以降の変換が long long 引数に適用されることを指定できます。
また、値が十分に大きいとき、プレーン整数定数は long long または unsigned long
long タイプになります。コンパイラから、変更を示す警告メッセージがあります。例
えば、厳密な ANSI C 2147483648 は unsigned long タイプです。ARM C および C++
では、これが long long タイプとなります。この影響の一つとして、以下のような式
の値が、
2147483648 > –1
厳密な C および C++ では 0、ARM C および C++ では 1 になります。
3-18
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
以下の制約条件が long long に適用されます。
•
long long 列挙子は使用できません。
•
switch ステートメントの制御式には (unsigned) long long タイプを使用で
きません。この結果、ケースラベルは、unsigned long タイプの変数に含める
ことのできる値も保持する必要があります。
インラインアセンブラ
ARM C++ コンパイラは ISO/IEC C++ 標準の構文をサポートしていますが、ストリング
リテラルは単一ストリングでなければならないという制約条件があります。
asm("instruction[;instruction]");
asm 宣言は、C++ 関数内に配置する必要があります。ストリングリテラルにコメントを
含めることはできません。
また、ARMC および C++ コンパイラは、asm キーワード(C++)、あるいは __asm キー
ワード(C および C++)で導入される、拡張インラインアセンブラ構文をサポートし
ています。
インラインアセンブラはアセンブラ指定子で呼び出し、その後に括弧で囲んだアセン
ブラ命令のリストを配置します。例:
__asm
{
instruction [; instruction]
...
[instruction]
}
同一行に 2 つの命令を記述する場合は、セミコロンで区切る必要があります。1 つの命
令が複数行にわたる場合には、行の継続を逆スラッシュ文字 \ で指定する必要があり
ます。C または C++ で記述したコメントは、インラインアセンブリ言語ブロック内で
あればどこにでも使用できます。
asmまたは__asmステートメントは、ステートメントが予想される場所であればどこに
でも使用できます。
BXおよびBLXを除き、ARMコンパイラは汎用コプロセッサ命令を含む全てのARM命令
をサポートしています。
Thumb コンパイラは、BX および BLX を除く全ての Thumb 命令をサポートしています。
ただし、インライン Thumb アセンブリルーチンは廃止予定であり、使用すると警告メッ
セージが生成されます。
インライン C/C++ アセンブラの詳細については、ADS デベロッパガイドの「C、C++、
アセンブリ言語の混合」を参照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-19
ARM コンパイラリファレンス
キーワード
ARM は、関数と変数に使用できるいくつかのキーワード拡張を実装しています。以下
を参照して下さい。
•
P. 3-6「関数キーワード」
•
•
変数宣言キーワード:P. 3-10
タイプ修飾子:P. 3-12
16 進数浮動小数点定数
ARM は、浮動小数点定数を IEEE ビットパタンとして明示的に指定できるように、C
の数値定数構文の拡張を実装しています。以下はこの構文を示しています。
0f_n
8 桁の 16 進数 n を float と解釈します。
0d_nn
16 桁の 16 進数 nn を double と解釈します。
float 定数は厳密に 8 桁である必要があります。double 定数は厳密に 16 桁である必要
があります。
読み出し / 書き込み定数
C++ では、外部定数にリンケージを指定すると、定数を動的に初期化できること、ま
たは定数に可変メンバを使用できることを意味します。
注
"C++:read/write"リンケージを使用する必要があるのは、/ropiまたは/rwpiでコ
ンパイルするコードだけです。これらのオプションのどちらかを使用して既存コード
を再コンパイルする場合は、動的に初期化される、または可変メンバを持つ外部定数
に対するリンケージ指定を変更する必要があります。
/ropiまたは/rwpiオプションのどちらかを使用してC++をコンパイルすると、C++標
準からは逸脱します。例 3-5 の宣言では、x が読み出し専用セグメント内にあることを
想定しています。
例 3-5 外部アクセス
extern const T x;
extern "C++" const T x;
extern "C" const T x;
3-20
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
この例が示す定数では x(ユーザ定義の構成子を含む)を動的に初期化することはでき
ず、また T が可変メンバを保持することはできません。例 3-6 の別のリンケージ指定
では、x が読み出し / 書き込みセグメント内(たとえこれが定数で初期化されたとして
も)にあることを宣言しています。この場合は x を動的に初期化することが可能であ
り、T は可変メンバを保持できます。x、y、z を別のファイル内で定義する場合も、同
じリンケージを指定する必要があります。
例 3-6 リンケージの指定
extern const int z;
/* in read-only segment, cannot
/* be dynamically initialized
*/
*/
extern "C++:read/write" const int y; /* in read/write segment */
/* can be dynamically initialized */
extern "C++:read/write" {
const int i=5;
/* placed in read-only segment, */
/* not extern because implicitly static */
extern const T x=6;
/* placed in read/write segment */
struct S {
static const T T x; /* placed in read/write segment */
};
}
定数オブジェクトは、他のリンケージで再宣言することはできません。例 3-7 のコード
は、コンパイルエラーを生成します。
例 3-7 コンパイルエラー
extern "C++" const T x;
extern "C++:read/write" const T x; /* error */
注
C にはリンケージを指定できないため、C++ で宣言された const オブジェクトを
extern "C++:read/write" として C から使用することはできません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-21
ARM コンパイラリファレンス
3.3
C および C++ の実装情報
このセクションでは、ARM コンパイラの実装について以下で詳しく説明します。
•
•
文字セットと識別子
基本データタイプ:P. 3-24
基本データタイプの演算:P. 3-25
構造体、共用体、列挙、ビットフィールド:P. 3-27
•
•
3.3.1
文字セットと識別子
ARM コンパイラに認識される文字セットと識別子には以下が適用されます。
•
全ての内部 / 外部識別子で、大文字と小文字が区別されます。-strict コンパイ
ラオプションが指定されていない限り、識別子にドル ($) 文字を含めることが
できます。
•
setlocale(LC_CTYPE, "ISO8859-1") を呼び出すと、isupper() 関数と
islower() 関数は、7 ビット ASCII サブセットではなく、8 ビット Latin-1 アルファ
ベットに対して予想通りに動作します。このロケールはリンク時に選択する必要
があります。
(P. 4-26「ロケールと CTYPE のカスタマイズ」を参照して下さい。)
•
ソース文字セットの文字は、ASCII文字セットのスーパーセットであるISO 8859-1
(Latin-1 アルファベット)とみなされます。印刷可能な文字は、32 ~ 126 と 160
~ 255 です。印刷可能な文字であれば、ストリング、文字定数、コメントで使用
することができます。
•
ARMコンパイラは、
Unicodeのようなマルチバイト文字をサポートしていません。
•
ソース文字のその他のプロパティは、ホストに依存します。
実行文字セットのプロパティは、ターゲットに依存します。ARM C および C++ ライブ
ラリは、ISO 8859-1(Latin-1 アルファベット)文字セットをサポートしているため、以
下の規則が適用されます。
•
実行文字セットは、ソース文字セットと同一です。
•
実行文字セットの 1 文字は 8 ビットで構成されます。
•
int は 4 文字(バイト)で構成されます。メモリシステムには以下のタイプがあ
ります。
リトルエンディアン バイトは、最下位アドレスの最下位バイトから、最上位ア
ドレスの最上位バイトに順序付けられます。
ビッグエンディアン バイトは、最上位アドレスの最下位バイトから、最下位ア
ドレスの最上位バイトに順序付けられます。
3-22
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
•
C では、全ての文字定数が int タイプとなります。C++ では、1 文字を含む文字
定数は char タイプに、複数の文字を含む文字定数は int タイプになります。定
数の 4 文字までは整数値で表現されます。定数の最後の文字は、整数値の最低位
バイトを占有します。先行文字 3 文字までは、高位バイトに配置されます。未使
用バイトは NULL (\0) で埋められます。
•
1 文字または文字エスケープシーケンス(表 3-2 参照)を含む全ての整数文字は、
ソース文字セットと実行文字セットの両方で表現されます。
•
ストリングリテラルおよび文字定数に使用されているソース文字セットの文字
は、実行文字セットにそのままマッピングされます。
•
char タイプのデータ項目は、デフォルトで符号なしに設定されます。これらの
項目は signed char または unsigned char として明示的に宣言することが
できます。-zcオプションを使用すると、charを符号付きにすることができます。
•
マルチバイト文字をワイド文字定数の対応するワイド文字(コード)に変換する
とき、ロケールは使用されません。これは一般的な実装には影響を及ぼしません。
表 3-2 文字エスケープコード
エスケープシーケンス
ARM DUI0067DJ-00
Char の値
説明
\a
7
注意(ベル)
\b
8
バックスペース
\t
9
水平タブ
\n
10
復帰改行(改行)
\v
11
垂直タブ
\f
12
書式送り
\r
13
キャリッジリターン
\xnn
0xnn
16 進 ASCII コード
\nnn
0nnn
8 進 ASCII コード
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-23
ARM コンパイラリファレンス
3.3.2
基本データタイプ
このセクションでは、ARM C および C++ を使用した基本データタイプの実装方法につ
いて説明します。
基本データタイプのサイズとアライメント
表 3-3 は、基本データタイプのサイズとナチュラルアライメントを示しています。各タ
イプのアライメントは、コンテキストによって異なります。
(P. 3-27「構造体、共用体、
列挙、ビットフィールド」参照。)
•
通常、ロケール変数はレジスタに保存されますが、ローカル変数がスタックにあ
ふれているときは、常にワード境界で整列します。例えば、あふれたローカル
char 変数のアライメントは 4 です。
•
パックタイプのナチュラルアライメントは 1 です。
表 3-3 データタイプのサイズとアライメント
タイプ
サイズ(ビット) ナチュラルアライメント(バイト)
char
8
1(バイト境界整列)
short
16
2(ハーフワード境界整列)
int
32
4(ワード境界整列)
long
32
4(ワード境界整列)
long long
64
4(ワード境界整列)
float
32
4(ワード境界整列)
double
64
4(ワード境界整列)
long double
64
4(ワード境界整列)
全てのポインタ
32
4(ワード境界整列)
bool(C++ のみ)
32
4(ワード境界整列)
整数
整数は、2 の補数形式で表現されます。long long の低位ワードは、リトルエンディ
アンモードでは下位アドレス、ビッグエンディアンモードでは上位アドレスに配置さ
れます。
3-24
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
Float
浮動小数点の数量は、IEEE 形式でストアされます。
•
float 値は、IEEE 単精度値で表現されます。
•
double および long double 値は、IEEE 倍精度値で表現されます。
softvfp、vfp、softvfp+vfp のいずれかが選択されている場合、double および long
double の数量では、符号、指数、仮数の最上位部分を含むワードが、ビッグエンディ
アンモードで下位マシンアドレスに、リトルエンディアンモードで上位アドレスにス
トアされます。詳細については、P. 3-26「浮動小数点タイプの演算」を参照して下さい。
ARM は、浮動小数点定数の ANSI 拡張を実装しています(P. 3-20「16 進数浮動小数点
定数」参照)。
配列とポインタ
以下は、メンバへのポインタを除き、C および C++ のオブジェクトを指す全てのポイ
ンタに適用されます。
•
隣接するバイトには、1 ずつ異なるアドレスが割り当てられます。
•
マクロ NULL は値 0 に展開します。
•
•
整数とポインタ間のキャスティングによって表現が変更されることはありませ
ん。
コンパイラは、関数へのポインタとデータへのポインタとの間のキャスティング
に対して警告を通知します。
size_t タイプは、unsigned int と定義されます。
•
ptrdiff_t タイプは、signed int と定義されます。
•
3.3.3
基本データタイプの演算
ARM コンパイラは、C および C++ 標準の関連セクションで説明されている通常の算術
変換を実行します。以下のセクションでは、算術演算に関する追加事項を説明します。
P. B-7「ステートメント」を参照して下さい。
整数タイプの演算
整数タイプの演算には以下の規則が適用されます。
ARM DUI0067DJ-00
•
全ての符号付き整数演算に 2 の補数表現が使用されます。
•
符号付き整数タイプのビットごとの演算は、2 の補数表現から自然に生じる規則
に従います。符号拡張は行われません。
•
符号付き数量の右シフトは算術演算です。
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-25
ARM コンパイラリファレンス
•
シフト量を指定する数量は、符号なし 8 ビット値として処理されます。
•
シフトされる値は、32 ビット値として処理されます。
•
31 を超える左シフトが行われると、ゼロが返されます。
•
31 を超える右シフトが行われる場合、符号なし値または正の符号付き値のシフト
ではゼロが返されます。この場合、負の符号付き値のシフトからは -1 が返され
ます。
•
整数除算の剰余には、除数と同じ符号が使用されます。
•
整数タイプの値が切り捨てられて短い符号付き整数タイプに短縮されると、適切
な数の最上位ビットを破棄することによって結果が求められます。正であるか負
であるかに関わらず、元の数字が大きすぎる場合には、結果の符号が元の符号と
同じになるとは限りません。
•
整数タイプ同士の変換では例外は発生しません。
•
整数のオーバフローによって例外が発生することはりません。
•
ゼロによる整数の除算では、SIGFPE 例外が発生します。
浮動小数点タイプの演算
以下の規則は、浮動小数点タイプの演算に適用されます。
•
通常の IEEE 754 の規則が適用されます。
•
•
デフォルトでは、最も近い表現可能な値に丸められます。
デフォルトでは浮動小数点例外はディセーブルされています。
注
浮動小数点の処理に関する IEEE 754 規格では、例外に対するデフォルトのアクション
は、トラップなしで続行することが定義されています。fenv.h 内の関数と定義をカス
タマイズすることで、浮動小数点エラーの処理方法を修正することができます。P. 4-50
「エラー通知、エラー処理、プログラム終了のカスタマイズ」および ADS デベロッパガ
イドの浮動小数点の章をを参照して下さい。
3-26
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
ポインタ減算
以下の規則は、C を使用した全てのポインタに適用されます。また、メンバへのポイン
タを除き、C++ を使用したポインタにも適用されます。
•
あるポインタが別のポインタから減算されるとき、その差はあたかも以下の式を
使用したように求められます。
((int)a - (int)b) / (int)sizeof(type pointed to)
3.3.4
•
ポインタが、1、2 あるいは 4 バイトで構成されるオブジェクトを指している場
合、パックオブジェクトでない限りは、このオブジェクトのナチュラルアライメ
ントによってその除算は必ず割り切れます。
•
double や struct などのパックタイプまたはロングタイプの場合には、どちら
のポインタも同一配列の要素を指している必要があります。
構造体、共用体、列挙、ビットフィールド
このセクションでは、構造化データタイプ union、enum、struct の実装について説
明します。また、構造体のパディングとビットフィールドの実装についても説明します。
共用体
union のメンバが、異なるタイプのメンバを使用してアクセスされるとき、結果の値
は元のタイプの表現から予想することができます。エラーは発生しません。
列挙
enum タイプのオブジェクトは、enum の範囲を含む最小積分タイプで実装されます。
enum のタイプには、enum の範囲に応じて以下のいずれかを使用できます。
•
unsigned char
•
signed char
•
unsigned short
•
signed short
•
unsigned int(C++ では常に、C では -strict を指定しているとき以外は使
用可)
•
signed int
このように enum を実装すると、データサイズを小さくすることができます。コマンド
ラインオプション -fy を使用して、enum の基礎タイプを signed int に設定するこ
とができます。-fy オプションの詳細については、P. 2-2「C および C++ コンパイラに
ついて」を参照して下さい。
-strict オプションを使用している場合を除き、enum 宣言では以下のように最後にカ
ンマを付けることができます。
enum { x = 1, };
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-27
ARM コンパイラリファレンス
構造体
ここで説明する内容は以下に適用されます。
•
全ての C 構造
•
仮想関数またはベースクラスを使用しない全ての C++ の構造体とクラス
構造体のアライメント
非パック構造のアライメントは、そのフィールドに要求される最大アラ
イメントとなります。
フィールドのアライメント
構造体は、命名された最初のコンポーネントが最下位アドレスにくるよ
うに配置されます。フィールドは以下のように整列されます。
•
char タイプのフィールドは、次の使用可能なバイトに合わせて整
列されます。
•
short タイプのフィールドは、次の偶数アドレス指定されたバイ
トに合わせて整列されます。
•
ビットフィールドのアライメントは、そのビットフィールドの宣
言の仕方によって異なります。詳細については、P. 3-31「パック構
造のビットフィールド」を参照して下さい。
•
その他の全てのタイプは、ワード境界で整列します。
フィールドが正しく整列し、かつ構造体自体が正しく整列するように、構造体にはパ
ディングを挿入することができます。図 3-1 は、一般的な非パック構造の例を示してい
ます。フィールドを正しく整列させるためにバイト 1、2、3 がパディングされていま
す。バイト 11 と 12 は、構造体を正しく整列させるためにパディングされています。
sizeof() 関数は、パディングを含めた構造体のサイズを返します。
コンパイラは、構造体の定義方法に応じ、以下のどちらかの方法でパディングを行い
ます。
•
static または extern として定義されている構造体は、ゼロでパディングされ
ます。
•
malloc() または auto で定義されているような、スタックまたはヒープ上の構
造体は、これらのメモリ位置に以前に保存されていた値でパディングされます。
memcmp() を使用して、この方法で定義されたパディング済み構造体を比較する
ことはできません(図 3-1)。-W+s オプションを使用すると、コンパイラが struct
にパディングを挿入する場合に警告を生成させることができます。
図 3-1 一般的な構造体の例
3-28
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
•
空イニシャライザを持つ構造体は C++ では許されますが、C では警告だけが生成
されます(C で -strict を指定している場合はエラーが生成されます)。
struct { int x; } X = { };
パック構造
パック構造とは、構造体とそのフィールドのアライメントが常に 1 である構造体です。
浮動小数点タイプをパック構造のフィールドに使用することはできません。
パック構造は、__packed 修飾子で定義されます。(P. 3-11「ARM 固有のキーワード」
参照。)デフォルトで使用される構造体パッキングを変更するコマンドラインオプショ
ンはありません。
ビットフィールド
非パック構造の場合、ARM コンパイラはビットフィールドをコンテナに割り当てます。
コンテナは、宣言されたタイプを持つ正しく整列したオブジェクトです。ビットフィー
ルドは、コンフィギュレーションに基づいて、指定された最初のフィールドがワード
内の最低位アドレスにあるビットを占有するように割り当てられます。
リトルエンディアン
最低位アドレスにあるものが最下位となります。
ビッグエンディアン
最低位アドレスにあるものが最上位となります。
ビットフィールドコンテナには、どの整数タイプでも指定できます。
注
コンパイラは、非 int ビットフィールドを検出すると警告を通知します。-Wb コンパ
イラオプションを使用すると、この警告をディセーブルすることができます。
signed 修飾子と unsigned 修飾子のどちらも使用せずに宣言されたプレーンビット
フィールドは、unsigned として処理されます。例えば、int x:10 では、10 ビット
の符号なし整数が割り当てられます。
ビットフィールドは、以下の例のように、未割り当てビットが十分にある、適切なタ
イプの最初のコンテナに割り当てられます。
struct X {
int x:10;
int y:20;
};
最初の宣言で整数コンテナを作成し、10 ビットを x に割り当てます。2 番目の宣言で、
コンパイラは、未割り当てビットが十分にある既存の整数コンテナを検出し、x と同じ
コンテナ内の y を割り当てます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-29
ARM コンパイラリファレンス
ビットフィールドは、そのコンテナ内に完全に包含されます。コンテナに入らないビッ
トフィールドは、同じタイプの次のコンテナ内に配置されます。例えば、上の構造体
で追加ビットフィールドが宣言されている場合、z を宣言することでコンテナがオーバ
フローします。
struct X {
int x:10;
int y:20;
int z:5;
};
コンパイラは、最初のコンテナの残り 2 ビットをパディングし、新しい整数コンテナ
を z に割り当てます。
ビットフィールドコンテナは、以下のように互いにオーバラップさせることができま
す。
struct X {
int x:10;
char y:2;
};
最初の宣言で整数コンテナを作成し、10 ビットを x に割り当てます。これらの 10 ビッ
トは、整数コンテナの先頭バイトと 2 番目のバイトの 2 ビットを占有します。2 番目の
宣言で、コンパイラは char タイプのコンテナをチェックします。適切なコンテナがな
いため、コンパイラは新たに正しく整列した char コンテナを割り当てます。
charのナチュラルアライメントは1であるため、コンパイラはビットフィールドを完全
に保持できだけの未割り当てビットがある先頭バイトを検索します。上の例では、int
コンテナの 2 番目のバイトのうち、2 ビットが x に割り当てられ、6 ビットがまだ割り
当てられていません。コンパイラは、char コンテナの割り当てを前の int コンテナ
の 2 番目のバイトから開始し、x に割り当てられている最初の 2 ビットをスキップし
て、2 ビットを y に割り当てます。
y が char y:8 と宣言されている場合、コンパイラは 2 番目のバイトをパディングし、新
しい char コンテナを 3 番目のバイトに割り当てます。これは、ビットフィールドがコ
ンテナをオーバフローさせてはならないためです(図 3-2)。
struct X {
int x:10;
char y:8;
};
図 3-2 ビットフィールドの割り当て 1
3-30
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
注
異なるコンテナタイプのビットフィールド宣言に対しても、同じ原則が適用されます。
例えば、上記の例に int ビットフィールドを追加すると以下のようになります。
struct X {
int x:10;
char y:8;
int z:5;
}
コンパイラは、int コンテナの割り当てを int x:10 コンテナと同じ位置から開始し、
バイト境界整列した char と 5 ビットのビットフィールドを割り当てます(図 3-3)。
図 3-3 ビットフィールドの割り当て 2
命名していないサイズゼロのビットフィールドを宣言することで、明示的にビット
フィールドコンテナをパディングすることができます。コンテナが空でなければ、サ
イズゼロのビットフィールドを宣言することによってコンテナが最後までコンテナを
埋められます。次のビットフィールドを宣言すると、新しい空のコンテナが割り当て
られます。
パック構造のビットフィールド
パック構造内のビットフィールドコンテナのアライメントは 1 です。したがって、パッ
ク構造内のビットフィールドにパディングされる最大ビット数は 7 ビットです。非パッ
ク構造では、最大パディングは 8*sizeof(container-type)–1 bits です。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-31
ARM コンパイラリファレンス
3.4
事前定義マクロ
表 3-4 は、ARM C および C++ コンパイラで事前定義されるマクロを示しています。値
フィールドが空の場合は、シンボルが定義されるだけです。
表 3-4 事前定義マクロ
名前
値
定義タイミング
__arm
–
armcc、tcc、armcpp,、tcpp を使用している場合
__ARMCC_VERSION
ver
コンパイラのバージョン番号を返します。この値は ARM
コンパイラも Thumb コンパイラも同じです。10 進数の値
で、リリースごとに増加します。PVtbbb 形式が使用され
ます。
P:プロダクト(ADS は 1)
V:マイナーバージョン(1.2 では 2)
t:パッチリリース(1.2 では 0)
bbb:ビルド(750 など)
この例では、120750 になります。
__APCS_INTERWORK
–
-apcs /interwork が使用されている場合、またはCPU
アーキテクチャが v5TE の場合
__APCS_ROPI
–
-apcs /ropi が使用されている場合
__APCS_RWPI
–
-apcs /rwpi が使用されている場合
__APCS_SWST
–
-apcs /swst が使用されている場合
__BIG_ENDIAN
–
ビッグエンディアンターゲット向けにコンパイルしてい
る場合
__cplusplus
–
C++ コンパイラモードの場合
__CC_ARM
–
コンパイラ名を返します
__DATE__
date
ソースファイルの変換の日付が必要な場合
__embedded_cplusplus
–
EC++ コンパイラモードの場合
__FEATURE_SIGNED_CHAR
–
-zc で設定されている場合(CHAR_MIN および
CHAR_MAX で使用)
__FILE__
name
現在のソースファイルで想定される完全なパス名
__func__
name
現在の関数の名前
__LINE__
num
現在のソースファイルの行番号が必要な場合
__MODULE__
mod
__FILE__ の値のファイル名部分を含みます。
3-32
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
ARM コンパイラリファレンス
表 3-4 事前定義マクロ(続き)
名前
値
定義タイミング
__OPTIMISE_SPACE
–
-Ospace が使用されている場合
__OPTIMISE_TIME
–
-Otime が使用されている場合
__prettyfunc__
name
現在の関数の復号化された名前
__sizeof_int
4
sizeof(int)対象、ただしプリプロセッサ式でも使用で
きます。
__sizeof_long
4
sizeof(long) 対象、ただしプリプロセッサ式でも使用
できます。
__sizeof_ptr
4
sizeof(void *) 対象、ただしプリプロセッサ式でも使
用できます。
__SOFTFP__
–
コンパイルでソフトウェア浮動小数点ライブラリを使用
する場合。ARM または Thumb の -fpu softfpa または
-fpu softvfp を使用する場合、または Thumb で -fpu
softvfp+vfp を使用する場合に設定されます。
__STDC__
–
全てのコンパイラモード
__STDC_VERSION__
–
標準バージョン情報
__STRICT_ANSI__
–
-strict で設定されます。
__TARGET_ARCH_xx
–
xx はターゲットアーキテクチャを表し、その値はター
ゲットアーキテクチャに依存します。例えば、コンパイ
ラオプション -cpu 4T または -cpu ARM7TDMI が指定
されていれば __TARGET_ARCH_4T が定義され、
_TARGET_ARCH_ で始まるその他のシンボルは定義され
ません。
__TARGET_CPU_xx
–
xx はターゲット CPU を表します。xx の値は -cpu コンパ
イラオプションから導出されるか、何も指定されていな
い場合はデフォルト値が使用されます。例えば、コンパ
イラオプション -cpu ARM7TM が指定されていれば
_TARGET_CPU_ARM7TM が定義され、_TARGET_CPU_ で
始まるその他のシンボルは定義されません。
ターゲットアーキテクチャが指定されていれば
_TARGET_CPU_generic が定義されます。
プロセッサ名にハイフン(-)文字が含まれる場合、これ
らは下線(_)にマップされます。例えば、-cpu SA-110
は __TARGET_CPU_SA_110 にマップされます。
__TARGET_FEATURE_DOUBLEWORD
–
ターゲットアーキテクチャが、PLD、LDRD、STRD、MCRR、
MRRC 命令をサポートしている場合
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
3-33
ARM コンパイラリファレンス
表 3-4 事前定義マクロ(続き)
名前
値
定義タイミング
__TARGET_FEATURE_DSPMUL
–
DSP 拡張乗算器が使用可能な場合
__TARGET_FEATURE_HALFWORD
–
ターゲットアーキテクチャがハーフワードおよび符号
付きバイトアクセス命令をサポートしている場合(v5TE
など)
__TARGET_FEATURE_MULTIPLY
–
ターゲットアーキテクチャが long 乗算命令 MULL および
MULAL をサポートしている場合
__TARGET_FEATURE_THUMB
–
ターゲットアーキテクチャが Thumb に対応している場合
(ARM アーキテクチャ v4T 以降)
__TARGET_FPU_xx
–
FPU の使用を示す以下のいずれかが設定されている場合
•
__TARGET_FPU_NONE
•
__TARGET_FPU_FPA
•
__TARGET_FPU_SOFTFPA
•
__TARGET_FPU_VFP
•
__TARGET_FPU_SOFTVFP
さらに、-fpu softvfp+vfp をコンパイルする場合は、
__TARGET_FPU_SOFTVFP_VFP も設定されます。
FPU オプションの詳細については、P. 2-19「ターゲット
プロセッサまたはアーキテクチャの指定」の -fpu vfp
オプションの説明を参照して下さい。
__thumb
–
tcc または tcpp を使用している場合
__TIME__
time
ソースファイルの変換の日付が必要な場合
3-34
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
第4章
C および C++ ライブラリ
本章では ARM C ライブラリおよび C++ ライブラリについて説明します。これらのラ
イプラリは C または C++ で記述されたプログラムをサポートします。本章は以下のセ
クションから構成されています。
•
ランタイムライブラリについて:P. 4-2
•
C ライブラリを使用するアプリケーションの作成:P. 4-6
•
C ライブラリを使用しないアプリケーションの作成:P. 4-13
•
新しい実行環境に合わせた C ライブラリのカスタマイズ:P. 4-20
スタティックデータアクセスのカスタマイズ:P. 4-25
ロケールと CTYPE のカスタマイズ:P. 4-26
エラー通知、エラー処理、プログラム終了のカスタマイズ:P. 4-50
記憶域管理のカスタマイズ:P. 4-57
ランタイムメモリモデルのカスタマイズ:P. 4-66
I/O 関数のカスタマイズ:P. 4-74
その他の C ライブラリ関数のカスタマイズ:P. 4-84
リアルタイム除算の選択:P. 4-89
ISO 実装定義:P. 4-90
ライブラリ命名規則:P. 4-104
•
•
•
•
•
•
•
•
•
•
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-1
C および C++ ライブラリ
4.1
ランタイムライブラリについて
C および C++ のコンパイルをサポートする以下のランタイムライブラリが収録されて
います。
ANSI C
C++
この C ライブラリは以下で構成されています。
•
ISO C ライブラリ標準で定義されている関数
•
セミホスティングされる実行環境で C ライブラリ関数を実装する
ときに使用するターゲット依存関数。これらの関数は作成するア
プリケーションで再定義することができます。
•
C/C++ コンパイラに使用されるヘルパ関数
C++ ライブラリには、ISO C++ ライブラリ標準で定義されている関数が
含まれています。C++ ライブラリは、ターゲット固有の C ライブラリの
サポートと、C++ ライブラリにターゲットへの依存性があるかどうかに
依存します。このライブラリは以下で構成されます。
•
Rogue Wave 標準 C++ ライブラリ Ver.2.01.01
•
C++ コンパイラ用ヘルパ関数
•
Rogue Wave ライブラリがサポートしていないその他の C++ 関数
ISO 標準に対するこれらのライブラリの適合性については、P. 4-90「ISO 実装定義」を
参照して下さい。
前述のように、ANSI C ライブラリは標準 ARM セミホステッド環境を使用して入出力
などの機能を提供します。この環境は、ARMulator®、Angel™、Multi-ICE でサポートさ
れています。ADS に収録されている ARM 開発ツールを使用してアプリケーションを
開発したら、すぐに ARMulator の下で、あるいは開発ボード上でそのアプリケーショ
ンの実行どデバッグを行うことができます。デバッグ環境の詳細については、ADS デ
バッグターゲットガイドの「セミホスティング」の説明を参照して下さい。
C ライブラリのどのターゲット依存関数も、作成するアプリケーションの一部として再
実装することが可能です。したがって、C ライブラリと C++ ライブラリは実行環境に
合わせてカスタマイズすることができます。
また、ターゲット依存関数の多くも、アプリケーション固有の要件に合わせてカスタ
マイズできます。例:
•
malloc ファミリ
•
ctype ファミリ
•
全てのロケール固有関数
C ライブラリ関数の多くは他のどの関数にも依存せず、ターゲットへの依存性もありま
せん。これらの関数はアセンブリ言語から簡単に使用することができます。
4-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.1.1
ビルドオプションとライブラリバリアント
アプリケーションをビルドするとき、いくつかの基本事項を選択する必要があります。
例:
バイト順序 「ビッグエンディアン」または「リトルエンディアン」
浮動小数点サポート
「FPA」、「VFP」、「ソフトウェア」、「なし」のいずれか
スタックリミット「チェックあり」または「チェックなし」
位置独立
データは読み出し / 書き込み「位置独立」または「非位置独立」に設定
できます。コードは読み出し専用「位置独立」または「非位置独立」に
設定できます。
アセンブリ言語、C あるいは C++ で記述されたコードをリンクするとき、リンカは指
定されたビルドオプションと互換性のある適切な C/C++ ライブラリバリアントを選択
します。主なビルドオプションの組み合わせごとに適した ANSI C ライブラリバリアン
トがあります。ビルドオプションについては以下で詳しく説明しています。
•
ADS デベロッパガイドの「ATPCS」の章
ARM DUI0067DJ-00
•
ADS リンカ / ユーティリティガイドの「ライブラリ」の章
•
コンパイラを説明した P. 2-12「プロシージャコール標準オプション」
•
アセンブラを説明した ADS アセンブラガイド
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-3
C および C++ ライブラリ
4.1.2
ライブラリのディレクトリ構造
ライブラリは、install_directory\lib 内の 2 つのサブディレクトリにインストー
ルされます。
armlib
このサブディレクトリには、ARM C ライブラリのバリアント、浮動小数
点算術ライブラリ、数学ライブラリが収録されています。関連ヘッダファ
イルは install_directory\include にインストールされます。
cpplib
このサブディレクトリには、Rouge Wave C++ ライブラリと支援 C++ 関
数が含まれています。Rogue Wave と支援 C++ 関数をまとめて ARM C++
ライブラリと呼びます。関連ヘッダファイルは
install_directory\include にインストールされます。
環境変数 ARMLIB は、この lib ディレクトリを指すように設定する必要があります。
あるいは -libpath 引数を使用して、ライブラリのサブディレクトリを保持するディ
レクトリをリンカに識別させることもできます。armlib と cpplib を別々に識別さ
せる必要はありません。リンカはこれらのサブディレクトリを lib の位置から自動的
に検出します。
注
4.1.3
•
ARM C ライブラリはバイナリ形式のみで提供しています。
•
ARM ライブラリは絶対に修正しないで下さい。ライブラリ関数の新しい実装を
作成したい場合は、その関数をオブジェクトファイル内または自分で作成したラ
イブラリ内に配置し、アプリケーションのリンク時にインクルードして下さい。
これにより、その関数の標準ライブラリバージョンの代わりにユーザバージョン
が使用されます。
•
通常、ターゲット依存アプリケーションの作成時に再実装する必要がある ANSI
C ライブラリの関数はほんのわずかしかありません。
•
Rouge Wave 標準 C++ ライブラリのソースは無断で配布できません。このソース
は別途ライセンス料金をお支払い頂いた上で Rogue Wave Software Inc., から、あ
るいは ARM 社を介して入手することが可能です。C++ ライブラリの詳しい情報
については、install_directory\Html に収録されている Rouge Wave のオン
ラインドキュメントを参照して下さい。
リエントランシとスタティックデータ
スタティックデータを使用するライブラリには 2 つのバリアントがあります。
4-4
•
位置依存方式でアドレス指定されるスタティックデータ。これらのバリアントか
らのコードは 1 つのスレッドに構成されます。例えば、ライブラリ c_a__un は
位置依存データを保持しています。
•
スタティックベースレジスタ sb(r9)からのオフセットを使用し、位置独立方式
でアドレス指定されるスタティックデータ。これらのバリアントからのコードは
多重スレッドを構成するリエントラントコードです。例えば、ライブラリ
c_a__ue は位置独立データを保持しています。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
ライブラリはスタティックデータを以下のように使用します。
•
浮動小数点算術ライブラリはスタティックデータを使用せず、常にリエントラン
トが可能です。
•
C ライブラリ内の静的に初期化されるデータは全て読み出し専用です。
•
全ての書き込み可能データが初期化されません。
•
ほとんどの C ライブラリ関数が書き込み可能なスタティックデータを使用せず、
ベースビルドオプション(-apcs /norwpi)またはリエントラントビルドオプ
ション(-apcs /rwpi)を指定してビルドしていれば必ずリエントラント可能
です。
•
いくつかの関数はスタティックデータを使用するものとして定義されています
(表 4-1)。-apcs /rwpi を指定してアプリケーションをビルドする場合を除い
ては、これらの関数または同様の他の関数をリエントラントアプリケーションで
使用してはなりません。
表 4-1 スタティックデータを使用するライブラリ関数
関数
説明
strtok()
暗黙のスタティックデータを保持します。
gamma()、lgamma()
math.h に含まれているこれらの関数は、signgam
と呼ばれるグローバル変数を使用します。
rand()、srand()
ランダムシードを必要とします。
stdin、stdout、stderr
スタティックデータです。
atexit()
スタティックデータにイグジットハンドラをストア
します。
setlocale()、asctime()、
localtime()、localeconv()、
tmpnam()
スタティックデータへの復帰ポインタです。
__user_libspace()
この関数は他の多くのルーチンに使用されます。
_sys_clock()
デフォルトの実装では、プログラム起動時の時刻を
ストアするスタティック変数を保持します。
fenv.h 関数
FP 例外トラップのインストールに使用されます。
signal.h 関数
シグナルハンドラのインストールに使用されます。
注意
スタティックデータを使用するものとして定義されている関数の数は、ADS の今後の
バージョンでは変更される可能性があります。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-5
C および C++ ライブラリ
4.2
C ライブラリを使用するアプリケーションの作成
このセクションでは、C ライブラリまたは C++ ライブラリの関数にリンクするアプリ
ケーションの作成について説明します。C ライブラリ内の関数には以下の機能があり
ます。
•
C または C++ のプログラムを実行できる環境の構築。この中には以下の作業が含
まれます。
—
スタックの作成
—
ヒープの作成(適宜)
—
プログラムが使用するライブラリ部分の初期化
•
main() の呼び出しによる実行の開始
•
プログラムにおける ISO 定義関数の使用のサポート
•
ランタイムエラーおよびシグナルの捕捉と、必要に応じ、エラー発生時またはプ
ログラム終了時の実行の終了
アプリケーションにライブラリを使用する方法には主に以下の 3 つがあります。
•
•
•
4.2.1
ARMulator、Angel、Multi-ICE などのセミホステッド環境でデバッグ可能なセミ
ホステッドアプリケーションを作成する(P. 4-6「セミホステッド環境で使用す
るアプリケーションの作成」参照)。
ROM などに組み込み可能な非ホステッドアプリケーションを作成する(P. 4-8
「非セミホステッド環境で使用するアプリケーションの作成」参照)。
main() を使用することも、ライブラリを初期化することもないアプリケーショ
ンを作成する。いくつかの関数を再実装しない限り、このアプリケーションに使
用できるライブラリの機能には制約があります。P. 4-13「C ライブラリを使用し
ないアプリケーションの作成」を参照して下さい。
セミホステッド環境で使用するアプリケーションの作成
デバッグを目的としてセミホステッド環境で実行するアプリケーションを開発する場
合には、ARM(および通常は Thumb も)セミホスティング SWI をサポートし、十分
なメモリを備えた実行環境が必要となります。
この実行環境は以下の方法で構築することが可能です。
•
ARMulator、Angel、Multi-ICE などにデフォルトで設定されている標準セミホス
ティング機能を使用する。
•
作成した SWI ハンドラをセミホスティング SWI に実装する(ADS デバッグター
ゲットガイド参照)。
セミホスティングを必要とする関数の一覧については、P. 4-9「セミホスティング依存
関数の概要」を参照して下さい。
ライブラリのデフォルトセミホスティング機能を使用する場合は、新しい関数を記述
したりファイルをインクルードする必要はありません。
4-6
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
ARMulator の使用
ARM 命令セットシミュレータ(ARMulator)はセミホスティング SWI をサポートし、
ライブラリの使用を可能にするメモリマップを保持しています。ARMulator はホストマ
シンのメモリを使用するため、アプリケーションには通常はこれで十分です。
Angel の使用
Angel デバッグモニタを実行する ARM ボードはセミホスティング SWI をサポートし、
ライブラリの使用を可能にするメモリマップを保持しています。しかし、アプリケー
ションが開発ボード上で使用できる以上のメモリを必要とし、デバッグするハード
ウェアに合わせてライブラリが予測するメモリマップをカスタマイズしなければなら
ない場合があります。
Angel 環境の定義は変更できます。Angel 環境の詳細については、ARM ファームウェア
スイートのマニュアルを参照して下さい。
Multi-ICE の使用
この ARM デバッグエージェントはセミホスティング SWI をサポートしていますが、デ
バッグするハードウェアに合わせてライブラリに予測されるメモリマップをカスタマ
イズしなければならない場合があります。しかし、C ライブラリが予測するメモリマッ
プのカスタマイズは簡単に行うことができます。詳細については、P. 4-66「ランタイム
メモリモデルのカスタマイズ」を参照して下さい。
セミホステッド環境における再実装関数の使用
セミホスティング機能は新しい I/O 関数と組み合わせることもできます。例えば
fputc() は、セミホスティングされる実装に加え、UART などのハードウェアに直接出
力するように実装することができます。各関数の再実装方法については、P. 4-8「非セ
ミホステッド環境で使用するアプリケーションの作成」を参照して下さい。
セミホステッドアプリケーションからスタンドアロンアプリケーションへの変換
セミホステッドデバッグ環境でアプリケーションを開発したら、以下の方法でこのア
プリケーションを非ホステッド環境に移行させることができます。
ARM DUI0067DJ-00
•
セミホステッド関数への全ての呼び出しを削除する(P. 4-10「セミホスティング
SWI の回避」参照)。
•
上記のセミホステッド関数を再実装する(P. 4-8「非セミホステッド環境で使用
するアプリケーションの作成」参照)。全てのセミホステッド関数を再実装する
必要はありません。ただし、アプリケーションで使用する関数は必ず再実装して
下さい。
•
セミホスティング SWI を処理する SWI ハンドラを実装する。
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-7
C および C++ ライブラリ
セミホスティング SWI サポートの実装
ユーザ定義にセミホスティング SWI サポートを実装することができます。このインタ
フェースはシンプルで、2 つの SWI 番号だけに対応したハンドラが必要となります。
ARM 状態では 0x123456 が、Thumb 状態では 0xab が使用されます。ADS デバッグ
ターゲットガイドのセミホスティングSWI の定義と、インクルードファイルrt_sys.h
を参照して下さい。
4.2.2
非セミホステッド環境で使用するアプリケーションの作成
セミホスティング機能を使用したくない場合は、セミホスティングを使用する関数へ
の呼び出しが発生しないように、またこのような関数が作成した非セミホステッド関
数に置き換えられないようにする必要があります。
セミホスティング機能を使用しないアプリケーションを作成するには:
1.
ターゲット依存機能を実装するソースファイルを作成します。
2.
このソースに __use_no_semihosting_swi 保護関数を追加します(P. 4-10
「セミホスティング SWI の回避」参照)。
3.
新しいオブジェクトをアプリケーションにリンクさせます。
4.
ターゲット依存アプリケーションを作成するときに、新しいコンフィギュレー
ションを使用します。
Cライブラリが自らをターゲット依存関数から切り離すために使用する関数は再実装す
る必要があります。例えば、printf() を使用する場合は、fputc() を再実装する必
要があります。printf() などの高レベル入出力関数を使用しない場合には、fputc()
などの低レベル関数を再実装する必要はありません。
異なる実行環境で使用するアプリケーションを作成する場合は、ターゲット依存関数
(セミホスティング SWI を使用する関数、またはターゲットのメモリマップに依存する
関数)を再実装する必要があります。C++ ライブラリには、ターゲット依存関数はあ
りません。
再実装しなければならない可能性のある関数については、以下を参照して下さい。
•
スタティックデータアクセスのカスタマイズ:P. 4-25
•
•
•
•
•
ロケールと CTYPE のカスタマイズ:P. 4-26
エラー通知、エラー処理、プログラム終了のカスタマイズ:P. 4-50
ランタイムメモリモデルのカスタマイズ:P. 4-66
I/O 関数のカスタマイズ:P. 4-74
その他の C ライブラリ関数のカスタマイズ:P. 4-84
ホステッド環境を使用しない組み込みアプリケーションのサンプルは、
install_directory\Examples\embedded\embed に収録されています。
ROM に組み込むアプリケーションの作成方法については、ADS デベロッパガイドを参
照して下さい。
4-8
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
セミホスティング依存関数の概要
表 4-2 が示す関数は、セミホスティング SWI に直接依存します。
表 4-2 直接依存関数
関数
説明
__user_initial_stackheap()
P. 4-66「ランタイムメモリモデルのカスタ
マイズ」参照。分散ローディングを使用
するときは、この関数を再実装する必要
があります。
_sys_exit()
_ttywrch()
P. 4-50「エラー通知、エラー処理、プログ
ラム終了のカスタマイズ」参照。
_sys_command_string()
P. 4-74「I/O 関数のカスタマイズ」参照。
_sys_close(), _sys_ensure(),
_sys_iserror(), _sys_istty(),
_sys_flen(), _sys_open(), _sys_read(),
_sys_seek(), _sys_write()
_sys_tmpnam()
time()
remove()
P. 4-84「その他の C ライブラリ関数のカ
スタマイズ」参照。
rename()
system()
clock(), _clock_init()
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-9
C および C++ ライブラリ
表 4-3 の関数は、P. 4-9 表 4-2 が示す 1 つ以上の関数に間接的に依存します。
表 4-3 間接依存関数
関数
使用されるケース
__raise()
C ライブラリ例外の捕捉、処理、診断に使用されます。C
シグナルのサポートはありません。P. 4-50「エラー通知、
エラー処理、プログラム終了のカスタマイズ」参照。
__default_signal_handler() C ライブラリ例外の捕捉、処理、診断に使用されます。C
シグナルをサポートします。P. 4-50「エラー通知、エラー
処理、プログラム終了のカスタマイズ」参照。
__Heap_Initialize()
メモリ割り当ての選択または再定義に使用されます。
P. 4-57「記憶域管理のカスタマイズ」参照。
ferror(), fputc(), __stdout
printf ファミリの再対象化に使用されます。P. 4-74「I/O
関数のカスタマイズ」参照。
__backspace(), fgetc(),
__stdin
scanf ファミリの再対象化に使用されます。P. 4-74「I/O
関数のカスタマイズ」参照。
fwrite(), fputs(), puts(),
fread(), fgets(), gets(),
ferror()
ストリーム出力ファミリの再対象化に使用されます。
P. 4-74「I/O 関数のカスタマイズ」参照。
セミホスティング SWI の回避
C でアプリケーションを記述する場合は、このアプリケーションが C ライブラリ関数
を直接的に使用しない場合でも、C ライブラリとリンクさせる必要があります。C ライ
ブラリにはコンパイラのヘルパ関数と初期化コードが含まれています。一部の C ライ
ブラリ関数はセミホスティング SWI を使用します。このセミホスティング SWI の使用
は、以下のどちらかの方法で回避することができます。
•
これらの関数を作成するアプリケーションで再実装する。
•
セミホステッド関数を呼び出さないようにアプリケーションを記述する。
セミホスティング SWI を使用する関数がアプリケーションに含まれないようにするに
は、以下のどちらかを使用して下さい。
•
IMPORT __use_no_semihosting_swi(アセンブリ言語の場合)
•
#pragma import(__use_no_semihosting_swi)(C の場合)
このシンボルには、セミホスティングSWIを使用する関数がライブラリからインクルー
ドされるときにリンクタイムエラーを発生させる以外の作用はありません。リンカは
以下のエラーメッセージを生成します。
Error : L6200E: Symbol __semihosting_swi_guard multiply defined
(by use_semi.o and use_no_semi.o).
4-10
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
リンカシンボルテーブルと相互参照リストを使用して、直接的または間接的に呼び出
した関数、あるいはセミホスティングを使用する関数を識別することができます。こ
の情報は、リンカオプション -map、-xref、-verbose を使用して表示させることが
できます。セミホステッド関数を削除するか再実装し、アプリケーションを再ビルド
します。
API の定義
P. 4-9 表 4-2 と P. 4-10 表 4-3 の関数に加え、異なる環境に合わせてビルドするときは表
4-4 の関数が便利な場合があります。
表 4-4 公式 API の定義
ARM DUI0067DJ-00
ファイルまたは関数
説明
__main() および __rt_entry()
ランタイム環境を初期化し、ユーザアプリケー
ションを実行します。
__rt_lib_init()、__rt_exit()、
__rt_lib_shutdown()
ランタイムライブラリを初期化 / 終了します。
locale()、CTYPE
ローカルアルファベットの文字プロパティを
定義します。P. 4-26「ロケールと CTYPE のカ
スタマイズ」参照。
rt_sys.h
デフォルト(セミホステッド)実装でセミホス
ティング SWI を使用する全ての関数を記述し
た C ヘッダファイルです。
rt_heap.h
記憶域管理の抽象データタイプを記述した C
ヘッダファイルです。
rt_locale.h
5 つのロケールカテゴリファイリングシステム
を記述し、ロケールカテゴリの内容の記述に役
立ついくつかのマクロを定義した C ヘッダ
ファイルです。
rt_misc.h
C ライブラリへのその他の非関連一般インタ
フェースを記述した C ヘッダファイルです。
rt_memory.s
空ですが、コメントが付されたメモリモデルの
プロトタイプ実装です。このファイルの詳細に
ついては、P. 4-67「ユーザメモリモデルの記述」
を参照して下さい。
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-11
C および C++ ライブラリ
標準 ARM ライブラリにある関数を再実装する場合、リンカは標準 ARM ライブラリか
らではなく、ユーザプロジェクトからオブジェクトまたはライブラリを使用します。プ
ロジェクトに追加するライブラリの名前は、ARM ライブラリ命名規則に準拠している
必要はありません。
注意
ARM が提供しているライブラリを置き換えたり削除したりしないように注意して下さ
い。ADS 付属ライブラリファイルは決して上書きしないで下さい。再実装する関数は
別のライブラリに保存して下さい。
4-12
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.3
C ライブラリを使用しないアプリケーションの作成
main() 関数を含むアプリケーションを作成すると、C ライブラリ初期化関数がインク
ルードされます。
アプリケーションに main() 関数が含まれていなければ C ライブラリは初期化されず、
アプリケーションで以下の機能を使用できなくなります。
•
ソフトウェアスタックチェック
•
低レベル stdio
•
signal.h 内のシグナル処理関数 signal() および raise()
•
atexit()
•
alloca()
このセクションでは、ライブラリを使用せずに作成するアプリケーションをベアマシ
ン C と呼びます。このようなアプリケーションは、C ライブラリに提供される完全 C
ランタイム環境を自動的に使用しません。ライブラリを使用せずにアプリケーション
を作成する場合でも、ライブラリ内のいくつかのヘルパ関数はインクルードする必要
があります。他にも、簡単な再実装を行うだけで使用できるようになる数多くの関数
があります。
4.3.1
整数 /FP ヘルパ関数
短い等価なマシンコードのない演算を処理するためにコンパイラが使用する、いくつ
かのコンパイラヘルパ関数があります。例えば、整数除算の場合には、ARM 命令セッ
トと Thumb 命令セットに除算命令がないため、ヘルパ関数が使用されます。
整数除算と全ての浮動小数点関数には、数学エラーを処理する __rt_raise() を使用
する必要があります。__rt_raise() を再実装することによって全ての数学ヘルパ関
数を使用することができます。
4.3.2
ベアマシン整数 C
環境の初期化を一切行わずに実行するプログラムを C で記述する場合、以下を守る必
要があります。
ARM DUI0067DJ-00
•
__rt_raise() を自分で実装する。理由は、このエラー処理関数がコンパイル
されたコード内の多くの場所から呼び出される可能性があるからです。
•
ライブラリ初期化コードへのリンクを避けるために main() を定義しない。
•
ビルドオプションでソフトウェアスタックチェックを選択しない。
•
C の実行に必要なレジスタ状態を確立するアセンブリ言語ベニアを記述する。こ
のベニアは、アプリケーション内のエントリ関数に分岐させる必要があります。
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-13
C および C++ ライブラリ
•
初期化ベニアをリセットハンドラ内に配置するなどして必ず実行されるように
する。
•
-fpu none を使用してアプリケーションをビルドし、通常通りにリンクさせる。
リンカは適切な C ライブラリバリアントを使用して、必要なヘルパ関数を検出し
ます。
ライブラリ機能の多くは、スタティックデータ用の __user_libspace() を必要と
します。main() 関数によって活性化する初期化コードを使用しない場合でも、
__user_libspace() は自動的に作成され、ZI セグメント内の 96 バイトが使用され
ます。
4.3.3
浮動小数点を使用したベアマシン C
アプリケーション内で浮動小数点処理を行いたい場合には、以下を守る必要があります。
•
「ベアマシン整数 C」で前述した、整数 C に必要なステップを実行する(P. 4-13
「ベアマシン整数 C」参照)。
•
アプリケーションのビルド時に適切な FPU オプションを使用する。
•
浮動小数点演算を実行する前に、_fp_init() を呼び出して浮動小数点ステータ
スレジスタを初期化する。
ソフトウェア浮動小数点を使用する場合は、浮動小数点ステータスレジスタの代わり
に使用する書き込み可能データワードのアドレスを戻すように
__rt_fp_status_addr() を定義することも可能です。これを行わない場合は、90 バ
イト以上を占有する user_libspace エリアが作成されます。
4.3.4
C ライブラリの利用
main() 関数を含むアプリケーションを作成する場合、リンカは実行環境に必要な初期
化コードを自動的にインクルードします(P. 4-6「C ライブラリを使用するアプリケー
ションの作成」参照)。状況によっては、このことが望ましくない、または不可能な場
合があります。
カスタマイズした起動コードで構成されていても、なお多くのライブラリ関数を使用
するアプリケーションを作成することができます。この場合は以下のどちらかを守る
必要があります。
•
初期化を必要とする関数を使用しない。
•
初期化および低レベルサポート関数を使用する。
4-14
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
プログラム設計
再実装しなければならない関数は、以下のようにどの程度のライブラリ機能を必要と
するかによって異なってきます。
•
除算、構造体コピー、FP 算術演算に使用するコンパイラサポート関数だけを必
要とする場合は、__rt_raise() を使用する必要があります。これにより
errno.h や setjmp.h に含まれているような非常に簡単なライブラリ関数と、
string.h のほとんどの関数を機能させることができます。
•
setlocale() を明示的に呼び出すと、ロケール依存関数が機能します。これに
より、atoi ファミリ、sprintf()、sscanf()、ならびに ctype.h 内の関数
を使用できるようになります。
•
浮動小数点を使用するプログラムは _fp_init() を呼び出す必要があります。ソ
フトウェア浮動小数点を選択する場合、そのプログラムは
__rt_fp_status_addr() も定義する必要があります(デフォルト動作では、
ユーザ libspace エリアを作成する目的でのこの関数の再実装は行われません)。
•
fprintf() または fputs() を使用する関数には、高レベル I/O サポートを実装
する必要があります。高レベル出力関数は fputc() と ferror() に依存します。
高レベル入力関数は fgetc() と __backspace() に依存します。
•
上記の関数とヒープを実装することにより、ライブラリのほぼ全てを使用するこ
とができます。
低レベル関数の使用
main() 関数のないアプリケーションでライブラリを使用する場合は、ライブラリ内の
いくつかの関数を再実装する必要があります。使用不可能な関数、修正せずに使用で
きる関数、他の低レベル関数の再実装後に使用できる関数については、P. 4-16「スタン
ドアロン C ライブラリ関数」を参照して下さい。
__rt_raise() は最も重要です。この関数は全ての FP 関数に必要であり、また「ゼロ
による除算」を通知できるようにするには整数除算にも、他のいくつかのライブラリ
ルーチンにも必要となります。__rt_raise() を必要としないような演算だけで優れ
たプログラムを記述することはまず不可能でしょう。
注
rand() を呼び出すときは、srand() を必ず先に呼び出す必要があります。この呼び出
しはライブラリの初期化中に自動的に行われますが、ライブラリの初期化を無効にし
ている場合は自動的に行われません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-15
C および C++ ライブラリ
高レベル関数の使用
fprintf()などの高レベルI/O関数は、fputc()などの低レベル関数が再実装されてい
れば使用することができます。フォーマット済みの出力関数のほとんどは、
setlocale() への呼び出しも必要とします。詳細については、P. 4-74「I/O 関数のカス
タマイズ」を参照して下さい。
ロケールを使用するものは全て、それを初期化する setlocale() の呼び出し、例え
ば setlocale(LC_ALL, "C") の呼び出しなどの前に呼び出す必要があります。ロ
ケールを使用する関数については、P. 4-16「スタンドアロン C ライブラリ関数」を参
照して下さい。この中には、ctype.h および locale.h 内の関数に加え、printf()
ファミリ、scanf() ファミリ、ato*、strto*、strcoll/strxfrm、ならびに time.h
のほとんどの関数が含まれます。
malloc() の使用
ベアマシン C にヒープのサポートが必要とされる場合には、最初に _init_alloc()
を 呼 び 出 し て 初 期 ヒ ー プ 境 界 を 設 定 し、た と え エ ラ ー を 戻 す 結 果 と な っ て も
__rt_heap_extend() は必ず設定する必要があります。この 2 つの関数のプロトタイ
プは rt_heap.h に収録されています。
4.3.5
スタンドアロン C ライブラリ関数
これ以降のセクションでは、ライブラリを初期化しなくても使用できるインクルード
ファイルと、それらのファイルに含まれる関数について説明します。別の状況では使
用できない関数の中にも、それが依存するライブラリ関数が再実装されていれば使用
できるものもあります。
alloca.h
このファイルに含まれる関数は、ライブラリを初期化せずに使用することはできませ
ん。詳細については、P. 4-6「C ライブラリを使用するアプリケーションの作成」を参
照して下さい。
assert.h
このファイルに含まれる関数は、高レベルの stdio、__rt_raise()、_sys_exit()
を必要とします。詳細については、P. 4-50「エラー通知、エラー処理、プログラム終了
のカスタマイズ」を参照して下さい。
ctype.h
このファイルに含まれる関数は、locale 関数を必要とします。
4-16
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
errno.h
このファイルに含まれる関数は、ライブラリを初期化しなくても、また関数を再実装
しなくても機能します。
fenv.h
このファイルに含まれる関数は、ライブラリを初期化しなくても、__rt_raise() を
再実装するだけで機能します。
float.h
このファイルにはコードは含まれていません。このファイル内の定義に、ライブラリ
の初期化も関数の再実装も必要ありません。
inttypes.h
このファイルに含まれる関数は、locale 関数を必要とします。
limits.h
このファイルに含まれる関数は、ライブラリを初期化しなくても、また関数を再実装
しなくても機能します。
locale.h
setlocale() は、locale 関数を使用するどの関数よりも先に呼び出されます。例:
setlocale(LC_ALL, "C")
以下の関数とデータ構造の詳細については、locale.h の内容を参照して下さい。
setlocale()
指定されているカテゴリおよびロケール引数に従って、適切なロ
ケールを選択します。
lconv
現ロケールの規則に基づいて数値量をフォーマットするために、
locale 関数によって使用される構造体です。
localeconv()
lconv 構造を作成し、この構造体へのポインタを戻します。
_get_lconv()
このパラメータが指す lconv 構造を充填します。この ANSI 拡張
により、ライブラリ内にスタティックデータを配置する必要がな
くなります。
locale.h には、ロケール関数に使用される定数宣言も含まれています。詳細について
は、P. 4-26「ロケールと CTYPE のカスタマイズ」を参照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-17
C および C++ ライブラリ
math.h
このファイルに含まれる関数は、ライブラリを初期化しなくても、__rt_raise() を
再実装するだけで機能します。浮動小数点関数を使用するには _fp_init() を呼び出
す必要があります。
setjmp.h
このファイルに含まれる関数は、ライブラリを初期化しなくても、また関数を再実装
しなくても機能します。
signal.h
このファイルに含まれる関数は、ライブラリを初期化せずに使用することはできませ
ん。ライブラリ初期化コードを使用するアプリケーションの作成については、P. 4-6「C
ライブラリを使用するアプリケーションの作成」を参照して下さい。
エラー処理と終了処理の目的で __rt_raise() を再実装することができます。詳細に
ついては、P. 4-50「エラー通知、エラー処理、プログラム終了のカスタマイズ」を参照
して下さい。
stdarg.h
このファイルに含まれる関数は、ライブラリを初期化しなくても、また関数を再実装
しなくても機能します。
stddef.h
このファイルにはコードは含まれていません。このファイル内の定義に、ライブラリ
の初期化も関数の再実装も必要ありません。
stdint.h
このファイルにはコードは含まれていません。このファイル内の定義に、ライブラリ
の初期化も関数の再実装も必要ありません。
stdio.h
このファイルには以下の依存性または制限が適用されます。
4-18
•
printf()、scanf()、puts()、fgets()、fread()、fwrite()、perror()
などの高レベル関数には高レベル stdio が必要です。詳細については、P. 4-74「I/O
関数のカスタマイズ」を参照して下さい。
•
printf() および scanf() ファミリの関数には locale が必要です。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
•
remove() 関数と rename() 関数はシステム固有の関数であるため、ユーザア
プリケーションでは恐らく使用できません。
stdlib.h
このファイルに含まれるほとんどの関数は、ライブラリを初期化しなくても、また関
数を再実装しなくても機能します。以下の関数は使用不可能、あるいはサポート関数
の再実装を必要とします。
ato*()
locale を必要とします。
strto*()
locale を必要とします。
malloc()
malloc()、calloc()、realloc()、free() はヒープ関数を必要とし
ます。
atexit()
使用不可能です。
string.h
このファイルに含まれる関数は、locale を必要とする strcoll() および strxfrm()
を除き、ライブラリを初期化しなくても機能します。
time.h
mktime() と localtime() はそのまま使用できます。
time()とclock()はシステム固有の関数であるため、再実装しない限りは恐らく使用
できません。
asctime()、ctime()、strftime() は locale を必要とします。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-19
C および C++ ライブラリ
4.4
新しい実行環境に合わせた C ライブラリのカスタマイズ
このセクションでは、ROM に組み込んだり RTOS で使用する場合など、異なる実行環
境に合うアプリケーションを生成する場合の関数の再実装方法を説明します。
1 本下線(_)または 2 本下線(__)の付いたシンボルは、低レベル実装の一部として使
用される関数を指しています。これらの関数のいくつかは再実装することが可能です。
これらのライブラリ関数についての補足情報については、rt_heap.h、
rt_locale.h、rt_misc.h、rt_sys.h のインクルードファイルと、rt_memory.s
のアセンブラファイルを参照して下さい。
4.4.1
C/C++ プログラムによるライブラリ関数の使用方法
このセクションでは、実行環境とアプリケーションの初期化に使用される特定のライ
ブラリ関数、ライブラリ終了関数、ならびにアプリケーション自らが実行中に呼び出
す可能性のあるターゲット依存ライブラリ関数について説明します。
実行環境の初期化とアプリケーションの実行
プログラムのエントリポイントは C ライブラリ内の __main であり、ライブラリコー
ドはこの位置で以下を行います。
1.
非ルート(RO および RW)実行領域をそれぞれのロードアドレスから実行アド
レスにコピーします。
2.
ZI 領域がゼロで埋められます。
3.
__rt_entry に分岐します。
ライブラリに上記を行わせたくない場合は、__rt_entry に分岐する __main を自分
で定義することができます(例 4-1 参照)。
例 4-1 __main と __rt_entry
IMPORT __rt_entry
EXPORT __main
ENTRY
__main
B
__rt_entry
END
4-20
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
ライブラリ関数 __rt_entry() は、以下の手順でプログラムを実行します。
1.
__rt_stackheap_init() を呼び出し、スタックとヒープを設定します。
2.
__rt_lib_init() を呼び出し、参照されたライブラリ関数とロケールを初期化
し、必要に応じて main() の argc と argv を設定します。C++ の場合は、全て
のトップレベルオブジェクトの構成子を呼び出します。
3.
アプリケーションのユーザレベルのルートである main() を呼び出します。
作成したプログラムがmain()からライブラリ関数を優先的に呼び出す場合があ
「main() からのライブラリ関数の呼び出し」を参照し
ります。詳細については、
て下さい。
4.
main() から戻された値で exit() を呼び出します。
main() からのライブラリ関数の呼び出し
関数 main() は、アプリケーションのユーザレベルのルートです。この関数は実行環
境の初期化を要求するため、I/O 関数を呼び出せる必要があります。プログラムは
main() において、C ライブラリ内のカスタマイズ可能な関数を呼び出す以下のいずれ
かのアクションを実行する可能性があります。
ARM DUI0067DJ-00
•
スタックまたはヒープを展開する。P. 4-66「ランタイムメモリモデルのカスタマ
イズ」参照。
•
__rt_fp_status_addr() や clock() などのユーザ定義関数へのコールアウ
トを要求するライブラリ関数を呼び出す。P. 4-84「その他の C ライブラリ関数の
カスタマイズ」参照。
•
LOCALE または CTYPE を使用するライブラリ関数を呼び出す。P. 4-26「ロケール
と CTYPE のカスタマイズ」参照。
•
fpu または fp ライブラリを必要とする浮動小数点計算を実行する。
•
putc() などの低レベル関数を介して直接に、あるいは fprintf() や
sys_open() などの高レベル I/O 関数と I/O サポート関数を介して間接的に、入力
または出力する。P. 4-74「I/O 関数のカスタマイズ」参照。
•
ferror などのエラーシグナルまたは他のシグナルを発生させる。P. 4-50「エラー
通知、エラー処理、プログラム終了のカスタマイズ」参照。
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-21
C および C++ ライブラリ
4.4.2
プログラムから終了
通常、プログラムは main() の終わりで終了しますが、エラーの発生によりその前に
終了することもあります。以下を参照して下さい。
•
__rt_entry
•
__rt_exit():P. 4-23
•
エラー通知、エラー処理、プログラム終了のカスタマイズ:P. 4-50
アサートからの終了
以下はアサートからのイグジットシーケンスです。
1.
assert() が stderr のメッセージを印字します。
2.
assert() が abort() を呼び出します。
3.
abort() が __rt_raise() を呼び出します。
4.
__rt_raise() が復帰すると、abort() がライブラリの終了を試行します。
ライブラリを使用しないアプリケーションを作成する場合、assert() は abort() 関
数と stdio 関数を再対象化していれば機能します。
再対象化の 1 つの方法は、assert() 関数自体を再対象化することです。以下はその
関数のプロトタイプです。
void __assert(const char *expr, const char *file, int line);
上記において:
4.4.3
•
expr は、TRUE にならなかった式のストリング表現を指しています。
•
file と line は、アサートのソース位置を識別します。
__rt_entry
これは C 関数ではありません。シンボル __rt_entry は、ARM C ライブラリを使用
するプログラムの開始位置を示します。
実装
__rt_entry が呼び出される時点ではスタックがまだ設定されていないため、この関
数を C で実装することはできません。制御は、全ての分散ロード領域が実行アドレス
に再配置された後で __rt_entry に渡されます。
4-22
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
以下は __rt_entry のデフォルトの実装です。
1.
ヒープとスタックを設定します。
2.
C ライブラリを初期化します。
3.
main() を呼び出します。
4.
C ライブラリを遮断します。
5.
終了します。
__rt_entry は、以下のいずれかの関数への呼び出しで終わる必要があります。
4.4.4
exit()
atexit() を完全処理し、ライブラリを遮断するときに使用しま
す。
__rt_exit()
atexit() の処理をバイパスし、ライブラリを正しく遮断すると
きに使用します。
_sys_exit()
atexit() をバイパスし、実行環境に直接イグジットします。
__rt_exit()
この関数はライブラリを遮断しますが、
atexit()に登録された関数は呼び出しません。
構文
void __rt_exit(int code)
標準関数には使用されません。
code
実装
イグジット関数は、ライブラリ関数と atexit() 関数の処理では異なります。
exit()
atexit() 登録関数を呼び出し、ライブラリを遮断します。
__rt_exit() ライブラリは遮断しますが、atexit() 関数は呼び出しません。
_sys_exit() ライブラリを遮断することも、atexit() 関数を呼び出すこともありま
せん。
戻り値
この関数は復帰しません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-23
C および C++ ライブラリ
4.4.5
__rt_lib_init()
__rt_lib_shutdown() と対をなすライブラリ初期化関数です。
構文
extern value_in_regs struct __argc_argv __rt_lib_init(unsigned heapbase,
unsigned heaptop)
heapbase
ヒープメモリブロックの開始位置です。
heaptop
ヒープメモリブロックの終了位置です。
実装
このライブラリ初期化関数は __rt_stackheap_init() の直後に呼び出され、ヒー
プとして使用する初期メモリチャンクに渡されます。この関数は標準 ARM ライブラリ
初期化関数であるため、再実装することはできません。
戻り値
この関数は、main() に渡される argc と argv を戻します。この構造体は以下のよう
にレジスタに戻されます。
struct __argc_argv {
int argc;
char **argv;
};
4.4.6
__rt_lib_shutdown()
__rt_lib_init() と対をなすライブラリ遮断関数です。
構文
void __rt_lib_shutdown(void )
実装
このライブラリ遮断関数は、ユーザがこれを直接呼び出す必要がある場合に備えて用
意されています。この関数は標準 ARM ライブラリ遮断関数であるため、再実装するこ
とはできません。
4-24
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.5
スタティックデータアクセスのカスタマイズ
このセクションでは、スタティックデータにアクセスするための C ライブラリからの
コールアウトを使用する方法について説明します。スタティックデータを使用する C
ライブラリ関数は、以下のように分類することができます。
•
どのような種類のスタティックデータも一切使用しない関数(例:fprintf())
•
スタティック状態を管理する関数(例:malloc()、rand()、strtok())
•
スタティック状態は管理しないが、ARM 実装に固有の方法でスタティックデー
タを使用する関数(例:isalpha())
C ライブラリは、自動的に定義されたスタティックデータを必要とする何らかの動作を
するときに、ユーザ側で置換できる関数へのコールアウトを使用します。表 4-5 はこれ
らの関数を示しています。
表 4-5 コールアウト
関数
説明
__rt_errno_addr()
変数 errno のアドレスを取得するために呼び出され
ます。P. 4-52「__rt_errno_addr()」参照。
__rt_fp_status_addr()
浮動小数点ステータスワードのアドレスを取得する
ために、浮動小数点サポートコードによって呼び出
されます。P. 4-56「__rt_fp_status_addr()」参照。
locale 関数
__user_libspace() 関数は、ライブラリの専用ス
タティックデータブロックを作成します。P. 4-26「ロ
ケールと CTYPE のカスタマイズ」参照。
上記の関数はセミホスティングを使用しません。
メモリの使用については、P. 4-66「ランタイムメモリモデルのカスタマイズ」を参照し
て下さい。
__user_libspace() のデフォルト実装では、ZI セグメント内に 96 バイトのブロック
が作成されます。アプリケーションに main() 関数が含まれていない場合でも、一般
的には __user_libspace() 関数を再定義する必要はありません(ただし、オペレー
ティングシステムもしくはプロセススイッチャーを記述する場合には、この関数を再
対象化する必要があります)。
注意
定義の中でスタティックデータを使用する関数の数は、ADS の今後のバージョンでは
変更される可能性があります。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-25
C および C++ ライブラリ
4.6
ロケールと CTYPE のカスタマイズ
このセクションでは、ロケールに関連する関数について説明します。アプリケーショ
ンは、文字順序、通貨記号、10 進小数点、時刻、日付など、ローカルな言語または領
域に依存するデータを表示もしくは処理するときに、ロケールを使用します。
ロケール関連関数の詳細については、rt_locale.h インクルードファイルを参照して
下さい。
4.6.1
リンク時におけるロケールの選択
C ライブラリの locale サブシステムは、リンク時に選択することも、ランタイムに
選択できるように拡張することもできます。ライブラリは以下のようにロケールカテ
ゴリを使用します。
4-26
•
各ロケールカテゴリのデフォルト実装は、C ロケールに基づいています。これに
加え、ライブラリは各ロケールカテゴリの ISO8859-1(Latin 1 アルファベット)
実装も備えており、ユーザはこれをリンク時に選択することができます。
•
C と ISO8859-1 のどちらのデフォルト実装においても、ランタイムに選択できる
ロケールは 1 つだけです。
•
各ロケールカテゴリは個々に置き換えることが可能です。
•
各カテゴリのロケールは選択しただけインクルードすることが可能であり、これ
らのロケールは自由に命名することができます。
•
各ロケールカテゴリは、ライブラリの専用スタティックデータ内の 1 ワードを使
用します。
•
ロケールカテゴリのデータは読み出し専用かつ位置独立データです。
•
scanf() は LC_CTYPE ロケールカテゴリのインクルードを強制しますが、どち
らのデフォルトロケールにおいても、これによって数キロバイトのコードに 260
バイトの呼び出し専用データが追加されます。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
実装
ISO8859-1(Latin-1 アルファベット)ロケールカテゴリを選択するには、アプリケー
ションから表 4-6 に示す関数への呼び出しをインクルードします。
表 4-6 デフォルトロケール
関数
説明
__use_iso8859_ctype()
ISO8859-1(Latin-1)の文 字区 分を 選択します
(これは実質的に 7 ビットの ASCII ですが、トッ
プビットセット文字コード 160 ~ 255 が実用的
なヨーロッパ言語の句読点、文字、アクセント
文字を表します)。
__use_iso8859_collate()
Latin-1 アルファベットに適した strcoll/strxfrm 照
合テーブルを選択します。デフォルトのCロケー
ルは照合テーブルを必要としません。
__use_iso8859_monetary()
Latin-1 コーディングを使用する Sterling 貨幣カ
テゴリを選択します。
__use_iso8859_numeric()
数値の印字で、カンマによる千単位の区切りを
選択します。
__use_iso8859_locale()
上記の iso8859 の全ての設定を選択します。
LC_TIME カテゴリの ISO8859-1 バージョンはありません。
C ライブラリは、コールアウト関数を呼び出す前に、この関数の有無をチェックしま
す。この関数が存在しなければ、デフォルトのアクションが取られます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-27
C および C++ ライブラリ
4.6.2
ランタイムにおけるロケールの選択
C ライブラリ関数 setlocale() は、ランタイムにおけるロケールカテゴリのロケー
ル、あるいはその引数に指定されたカテゴリのロケールを選択します。これは要求さ
れたロケールを各ロケールカテゴリ内で個々に選択することによって行われます。事
実、各ロケールカテゴリは、各ロケールのエントリを保持する小さなファイリングシ
ステムです。
各ロケールカテゴリは、_get_lc_category などの関数によって処理されます。例:
void const *_get_lc_time (void *null, char const *locale_name)
_get_lc_time() は、locale_name と命名されたロケールの time ファイリングシス
テムのアドレスを戻すか、そのエントリが検出されなかった場合は NULL を戻します。
各ロケールカテゴリの実装には、表 4-7 が示す選択関数を含める必要があります。
表 4-7 ロケールカテゴリ
関数
説明
_get_lc_ctype()
文字属性を保持するユーザ定義配列内の最初の要素へ
のポインタを戻します。P. 4-30「_get_lc_ctype()」参照。
_get_lc_collate()
ソート属性を保持するユーザ定義配列内の最初の要素
へのポインタを戻します。P. 4-32「_get_lc_collate()」参照。
_get_lc_monetary()
ユーザ定義の __lc_monetary_blk 構造へのポインタ
を戻します。P. 4-36「_get_lc_monetary()」参照。
_get_lc_numeric()
ユーザ定義の __lc_numeric_blk 構造へのポインタを
戻します。P. 4-37「_get_lc_numeric()」参照。
_get_lc_time()
ユーザ定義の__lc_time_blk構造へのポインタを戻し
ます。P. 4-38「_get_lc_time()」参照。
どれを実装する必要があるかを記述し、いくつかの便利なサポートマクロを含んだ C
ヘッダファイルが locale.h および rt_locale.h に収録されています。
実装
カテゴリごとに、ロケールの変更はそのロケールカテゴリの読み出し専用データにポ
インタを変更することで行われます。デフォルトロケールを使用する場合を除き、こ
のデータはユーザが設定する必要があります。
4-28
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
あるカテゴリの全てのロケールブロックは、読み出し専用、位置独立のインメモリファ
イルシステム構造にまとめられます。C ライブラリには、これらのブロックを作成する
マクロセットと、そのファイルシステムを検索する _findlocale() 関数があります。
ランタイムに選択可能なロケールセットは、付属の再実装関数を足掛かりにして定義
することができます。作成するアプリケーションで _get_lc_category 関数を直接
呼び出すことがないかもしれません。_get_lc_category 関数は setlocale() お
よび __rt_lib_init() に呼び出されます。新しいロケールは、setlocale() に対
して _get_lc_category の新しいロケール定義ブロックと再実装を記述することに
よって実装します(例 4-2 参照)。
例 4-2 get_lc_ctype
void const *_get_lc_ctype(void const *null, char const *name) {
return _findlocale(&lcctype_c_index, name);
}
4.6.3
マクロとユーティリティ関数
表 4-8 が示すマクロとユーティリティ関数を使用すれば、ロケールブロックの作成・使
用プロセスを簡素化することができます。詳細については rt_locale.h ファイルを
参照して下さい。
表 4-8 ロケールマクロ
ARM DUI0067DJ-00
関数またはマクロ
説明
__LC_CTYPE_DEF
このマクロを使用して、文字セット値のブロックを作成
できます。P. 4-30「_get_lc_ctype()」参照。
__LC_COLLATE_DEF
このマクロを使用して、文字セットソート値のブロック
を作成できます。P. 4-32「_get_lc_collate()」参照。
__LC_TIME_DEF
このマクロを使用して、時刻フォーマット値のブロック
を作成できます。P. 4-38「_get_lc_time()」参照。
__LC_NUMERIC_DEF
このマクロを使用して、数値フォーマット値のブロック
を作成できます。P. 4-37「_get_lc_numeric()」参照。
__LC_MONETARY_DEF
このマクロを使用して、貨幣フォーマット値のブロック
を作成できます。P. 4-36「_get_lc_monetary()」参照。
__LC_INDEX_END
このマクロを使用して、フォーマット値のインデクスの
終わりを宣言できます。P. 4-30「マクロの使用」参照。
_findlocale()
この関数を使用して、ロケールブロックのアドレスを戻
すことができます。P. 4-42「_findlocale()」参照。
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-29
C および C++ ライブラリ
マクロの使用
1 つのロケールカテゴリのデータブロックは隣接していなければならず、
LC_INDEX_END マクロはそのシーケンスの中で最後のマクロでなければなりません。
各ロケールカテゴリのサンプルでは、以下のように定義される 2 つのテストマクロを
使用しています。
#define EQI(i,j) assert(i==j)
#define EQS(s,t) assert(!strcmp(s,t))
4.6.4
_get_lc_ctype()
ctype の実装は、以下のどちらかになるようにリンクタイムに選択されます。
•
C ロケールのみ。これがデフォルトです。
•
ISO 8859(Latin-1)ロケール
以下の特性を持つ ctype 属性を定義することができます。
•
読み出し専用
•
-1 ~ 255(255 を含む。合計 257 バイト)の範囲のインデクスを持つバイト配列
•
各バイトが 8 個の属性ビットとして解釈される。これらの値は ctype.h 内で以
下のように定義されています。
__S
ホワイトスペース文字
__P
句読文字
__B
空白文字
__L
小文字
__U
大文字
__N
10 進数
__C
制御文字
__X
16 進文字 A ~ F および a ~ f
配列内の最初の要素、つまり -1 に位置している要素は、常にゼロである必要がありま
す。例 4-3 は、CTYPE データを戻す関数の骨組み実装を示しています。
例 4-3 LC_CTYPE_DEF テーブル
__LC_CTYPE_DEF(lcctype_c, "C")
{
__C, __C, __C, __C, __C, __C, __C, __C, __C,
/* 0x00-0x08 */
__C+__S,__C+__S,__C+__S,__C+__S,__C+__S,
/* 0x09-0x0D (BS,LF,VT,FF,CR) */
4-30
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
__C, __C, __C, __C, __C, __C, __C, __C, __C,
__C, __C, __C, __C, __C, __C, __C, __C, __C,
__B+__S,
__P, __P, __P, __P, __P, __P, __P, __P,
__P, __P, __P, __P, __P, __P, __P,
__N, __N, __N, __N, __N, __N, __N, __N, __N, __N,
__P, __P, __P, __P, __P, __P, __P,
__U+__X, __U+__X, __U+__X, __U+__X, __U+__X, __U+__X,
__U, __U, __U, __U, __U, __U, __U, __U, __U, __U,
__U, __U, __U, __U, __U, __U, __U, __U, __U, __U,
__P, __P, __P, __P, __P, __P,
__L+__X, __L+__X, __L+__X, __L+__X, __L+__X, __L+__X,
__L, __L, __L, __L, __L, __L, __L, __L, __L, __L,
__L, __L, __L, __L, __L, __L, __L, __L, __L, __L,
__P, __P, __P, __P,
__C,
/* the whole of the top half is illegal characters */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
__LC_CTYPE_DEF(lcctype_iso8859_1, "ISO8859-1")
{
__C, __C, __C, __C, __C, __C, __C, __C, __C,
__C+__S,__C+__S,__C+__S,__C+__S,__C+__S, /*
__C, __C, __C, __C, __C, __C, __C, __C, __C,
__C, __C, __C, __C, __C, __C, __C, __C, __C,
__B+__S,
__P, __P, __P, __P, __P, __P, __P, __P,
__P, __P, __P, __P, __P, __P, __P,
__N, __N, __N, __N, __N, __N, __N, __N, __N,
__P, __P, __P, __P, __P, __P, __P,
__U+__X, __U+__X, __U+__X, __U+__X, __U+__X,
__U, __U, __U, __U, __U, __U, __U, __U, __U,
__U, __U, __U, __U, __U, __U, __U, __U, __U,
__P, __P, __P, __P, __P, __P,
__L+__X, __L+__X, __L+__X, __L+__X, __L+__X,
__L, __L, __L, __L, __L, __L, __L, __L, __L,
__L, __L, __L, __L, __L, __L, __L, __L, __L,
__P, __P, __P, __P,
__C,
/* ISO8859-1 top half:
* - 0x80-0x9f are control chars
* - 0xa0 is nonbreaking space (whitespace)
* - 0xa1-0xbf are punctuation chars
ARM DUI0067DJ-00
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
0x0E-0x16 */
0x17-0x1F */
space */
!"#$%&'( */
)*+,-./ */
0-9 */
:;<=>?@ */
A-F */
G-P */
Q-Z */
[\]^_` */
a-f */
g-p */
q-z */
{|}~ */
0x7F */
/* 0x00-0x08 */
0x09-0x0D (BS,LF,VT,FF,CR) */
/* 0x0E-0x16 */
/* 0x17-0x1F */
/* space */
/* !"#$%&'( */
/* )*+,-./ */
__N,
/* 0-9 */
/* :;<=>?@ */
__U+__X, /* A-F */
__U,
/* G-P */
__U,
/* Q-Z */
/* [\]^_` */
__L+__X, /* a-f */
__L,
/* g-p */
__L,
/* q-z */
/* {|}~ */
/* 0x7F */
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-31
C および C++ ライブラリ
* - 0xc0-0xdf are uppercase chars except
* - 0xe0-0xff are lowercase chars except
__C,__C,__C,__C,__C,__C,__C,__C,
/*
__C,__C,__C,__C,__C,__C,__C,__C,
/*
__C,__C,__C,__C,__C,__C,__C,__C,
/*
__C,__C,__C,__C,__C,__C,__C,__C,
/*
__B+__S,__P,__P,__P,__P,__P,__P,__P, /*
__P,__P,__P,__P,__P,__P,__P,__P,
/*
__P,__P,__P,__P,__P,__P,__P,__P,
/*
__P,__P,__P,__P,__P,__P,__P,__P,
/*
__U,__U,__U,__U,__U,__U,__U,__U,
/*
__U,__U,__U,__U,__U,__U,__U,__U,
/*
__U,__U,__U,__U,__U,__U,__U,__P,
/*
__U,__U,__U,__U,__U,__U,__U,__U,
/*
__L,__L,__L,__L,__L,__L,__L,__L,
/*
__L,__L,__L,__L,__L,__L,__L,__L,
/*
__L,__L,__L,__L,__L,__L,__L,__P,
/*
__L,__L,__L,__L,__L,__L,__L,__L,
times sign at 0xd7
divide sign at 0xf7 */
0x80 - 0x87 */
0x88 - 0x8f */
0x90 - 0x97 */
0x98 - 0x9f */
0xa0 - 0xa7 */
0xa8 - 0xaf */
0xb0 - 0xb7 */
0xb8 - 0xbf */
0xc0 - 0xc7 */
0xc8 - 0xcf */
0xd0 - 0xd7 */
0xd8 - 0xdf */
0xe0 - 0xe7 */
0xe8 - 0xef */
0xf0 - 0xf7 */
/* 0xf8 - 0xff */
};
_LC_INDEX_END(lcctype_dummy)
void const *_get_lc_ctype(void const *null, char const *name) {
return _findlocale(&lcctype_c_index, name);
}
void test_lc_ctype(void) {
EQS(setlocale(LC_CTYPE, NULL), "C"); /* verify starting point */
EQI(!!isalpha('@'), 0);
/* test off-by-one */
EQI(!!isalpha('A'), 1);
EQI(!!isalpha('\xc1'), 0);
/* C locale: isalpha(Aacute)==0 */
EQI(!setlocale(LC_CTYPE, "ISO8859-1"), 0); /* setlocale should work */
EQS(setlocale(LC_CTYPE, NULL), "ISO8859-1");
EQI(!!isalpha('@'), 0);
/* test off-by-one */
EQI(!!isalpha('A'), 1);
EQI(!!isalpha('\xc1'), 1);
/* ISO8859 locale: isalpha(Aacute)!=0
*/
EQI(!setlocale(LC_CTYPE, "C"), 0);
/* setlocale should work */
EQS(setlocale(LC_CTYPE, NULL), "C");
EQI(!!isalpha('@'), 0);
/* test off-by-one */
EQI(!!isalpha('A'), 1);
EQI(!!isalpha('\xc1'), 0);
/* C locale: isalpha(Aacute)==0 */
}
4.6.5
_get_lc_collate()
_get_lc_collate() は、インデクス範囲 0 ~ 255(255 を含む。合計 256 バイト)の符
号なしバイト配列に含まれる 0 番目のエントリへのポインタを戻す必要があります。
4-32
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
各要素は、要素のインデクスで表現される文字の照合シーケンス内の位置を示します。
例えば、strcoll() を使用して、A で始まるストリングと B で始まるストリングの間
で、Z で始まるストリングをソートしたい場合には、array['A'] < array['Z']
and array['Z'] < array['B'] となるように LC_COLLATE テーブルを設定するこ
とができます。
_get_lc_collate() は照合構造へのポインタを戻す必要があります。この構造体は、
例 4-4 のマクロを使用して作成することができます。
例 4-4 LC_COLLATE_DEF テーブル
__LC_COLLATE_TRIVIAL_DEF(lccoll_c, "C")
__LC_COLLATE_DEF(lccoll_iso8859_1, "ISO8859-1")
{
/* Things preceding letters have normal ASCII ordering */
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, /* @ */
0x41, /* A - then 7 A variants */
0x49, /* B */
0x4a, /* C - then 1 C variant */
0x4c, /* D */
0x4d, /* E - then 4 E variants */
0x52, /* F */
0x53, /* G */
0x54, /* H */
0x55, /* I - then 4 I variants */
0x5a, /* J */
0x5b, /* K */
0x5c, /* L */
0x5d, /* M */
0x5e, /* N - then 1 N variant */
0x60, /* O - then 6 O variants */
0x67, /* P */
0x68, /* Q */
0x69, /* R */
0x6a, /* S */
0x6b, /* T */
0x6c, /* U - then 4 U variants */
0x71, /* V */
0x72, /* W */
0x73, /* X */
0x74, /* Y - then 1 Y variant */
0x76, /* Z - then capital Eth & Thorn */
0x79, /* [ */
0x7a, /* \ */
0x7b, /* ] */
0x7c, /* ^ */
0x7d, /* _ */
0x7e, /* ` */
0x7f, /* a - then 7 a variants */
0x87, /* b */
0x88, /* c - then 1 c variant */
0x8a, /* d */
0x8b, /* e - then 4 e variants */
0x90, /* f */
0x91, /* g */
0x92, /* h */
0x93, /* i - then 4 i variants */
0x98, /* j */
0x99, /* k */
0x9a, /* l */
0x9b, /* m */
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-33
C および C++ ライブラリ
0x9c, /* n - then 1 n variant */
0x9e, /* o - then 6 o variants */
0xa5, /* p */
0xa6, /* q */
0xa7, /* r */
0xa8, /* s - then 1 s variant */
0xaa, /* t */
0xab, /* u - then 4 u variants */
0xb0, /* v */
0xb1, /* w */
0xb2, /* x */
0xb3, /* y - then 2 y variants */
0xb6, /* z - then eth & thorn */
0xb9, /* { */
0xba, /* | */
0xbb, /* } */
0xbc, /* ~ */
0xbd, /* del */
/* top bit set control characters */
0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd,
/* other non_alpha */
0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed,
0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd,
0x42, /* A grave */
0x43, /* A acute */
0x44, /* A circumflex */
0x45, /* A tilde */
0x46, /* A umlaut */
0x47, /* A ring */
0x48, /* AE */
0x4b, /* C cedilla */ 0x4e, /* E grave */
0x4f, /* E acute */
0x50, /* E circumflex */
0x51, /* E umlaut */ 0x56, /* I grave */
0x57, /* I acute */
0x58, /* I circumflex */
0x59, /* I umlaut */ 0x77, /* Eth */
0x5f, /* N tilde */
0x61, /* O grave */
0x62, /* O acute */
0x63, /* O circumflex */
0x64, /* O tilde */
0x65, /* O umlaut */
0xfe, /* multiply */ 0x66, /* O with line */
0x6d, /* U grave */
0x6e, /* U acute */
0x6f, /* U circumflex */ 0x70, /* U umlaut */
0x75, /* Y acute */
0x78, /* Thorn */
0xa9, /* german sz */ 0x80, /* a grave */
0x81, /* a acute */
0x82, /* a circumflex */
0x83, /* a tilde */
0x84, /* a umlaut */
0x85, /* a ring */
0x86, /* ae */
0x89, /* c cedilla */ 0x8c, /* e grave */
0x8d, /* e acute */
0x8e, /* e circumflex */
0x8f, /* e umlaut */ 0x94, /* i grave */
0x95, /* i acute */
0x96, /* i circumflex */
0x97, /* i umlaut */ 0xb7, /* eth */
0x9d, /* n tilde */
0x9f, /* o grave */
0xa0, /* o acute */
0xa1, /* o circumflex */
0xa2, /* o tilde */
0xa3, /* o umlaut */
0xff, /* divide */
0xa4, /* o with line */
4-34
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
0xac,
0xae,
0xb4,
0xb5
/*
/*
/*
/*
u
u
y
y
grave */
0xad, /* u acute */
circumflex */ 0xaf, /* u umlaut */
acute */
0xb8, /* thorn */
umlaut */
};
__LC_INDEX_END(lccollate_dummy)
void const *_get_lc_collate(void const *null, char const *name) {
return _findlocale(&lccoll_c_index, name);
}
void test_lc_collate(void) {
char buf[5];
/* test both strxfrm and strcoll here*/
EQS(setlocale(LC_COLLATE, NULL), "C");
/* verify starting point */
EQS((strxfrm(buf, "\xEF", 4), buf), "\xEF");
EQI(strcoll("\xEF", "j") < 0, 0);
EQI(!setlocale(LC_COLLATE, "ISO8859-1"), 0); /* setlocale should work */
EQS(setlocale(LC_COLLATE, NULL), "ISO8859-1");
EQS((strxfrm(buf, "\xEF", 4), buf), "\x97");
EQI(strcoll("\xEF", "j") < 0, 1);
EQI(!setlocale(LC_COLLATE, "C"), 0);
/* setlocale should work */
EQS(setlocale(LC_COLLATE, NULL), "C");
EQS((strxfrm(buf, "\xEF", 4), buf), "\xEF");
EQI(strcoll("\xEF", "j") < 0, 0);
}
__LC_COLLATE_TRIVIAL_DEF マクロは、インデクス番号と同じ値の要素を持つ配列
を定義します。__LC_COLLATE_TRIVIAL_DEF(lccoll_c, "C") は、例 4-5 が示す
コードと等価です。
例 4-5 LC_COLLATE_DEF
__LC_COLLATE_DEF(lccoll_c, "C")
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
...
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd,
};
ARM DUI0067DJ-00
0x06, 0x07,
0x0e, 0x0f,
0xf6, 0xf7,
0xfe, 0xff
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-35
C および C++ ライブラリ
4.6.6
_get_lc_monetary()
_get_lc_monetary() は、__lc_monetary_blk 構造へのポインタを戻す必要があ
ります。この構造体は、例 4-6 のマクロを使用して作成することができます。
例 4-6 LC_MONETARY_DEF
__LC_MONETARY_DEF(lcmonetary_c, "C",
"","","","","","","",
255,255,255,255,255,255,255,255)
__LC_MONETARY_DEF(lcmonetary_iso8859_1, "ISO8859-1",
"STG ", "\243", ".", ",", "\3", "", "-",
2, 2, 1, 0, 1, 0, 1, 2)
__LC_INDEX_END(lcmonetary_dummy)
void const *_get_lc_monetary(void const * nullpara, char const *name) {
return _findlocale(&lcmonetary_c_index, name);
}
void test_lc_monetary(void) {
struct lconv lc;
/*Test changing currency string as we change locales.*/
EQS(setlocale(LC_MONETARY, NULL), "C");
/* verify starting point */
_get_lconv(&lc); EQS(lc.currency_symbol, "");
EQI(!setlocale(LC_MONETARY, "ISO8859-1"), 0); /* setlocale should work */
EQS(setlocale(LC_MONETARY, NULL), "ISO8859-1");
_get_lconv(&lc); EQS(lc.currency_symbol, "\243");
EQI(!setlocale(LC_MONETARY, "C"), 0);
/* setlocale should work */
EQS(setlocale(LC_MONETARY, NULL), "C"); _get_lconv(&lc);
EQS(lc.currency_symbol, "");
}
4-36
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.6.7
_get_lc_numeric()
_get_lc_numeric() は、__lc_numeric_blk 構造へのポインタを戻す必要があり
ます。この構造体は、例 4-7 のマクロを使用して作成することができます。
例 4-7 LC_NUMERIC_DEF
__LC_NUMERIC_DEF(lcnumeric_c, "C",".","","")
__LC_NUMERIC_DEF(lcnumeric_iso8859_1, "ISO8859-1",
".", ",", "\3")
__LC_NUMERIC_DEF(lcnumeric_fr, "fr", ",", ".", "\3")
__LC_INDEX_END(lcnumeric_dummy)
void const *_get_lc_numeric(void const *null, char const *name) {
return _findlocale(&lcnumeric_c_index, name);
}
void test_lc_numeric(void) {
double pi = 4*atan(1.);
char buf[20];
/* Test changing decimal point as we shift in and out of French
* numeric locale. */
EQS(setlocale(LC_NUMERIC, NULL), "C");
snprintf(buf, sizeof(buf), "%g", pi); EQS(buf,
EQI(!setlocale(LC_NUMERIC, "ISO8859-1"), 0);
EQS(setlocale(LC_NUMERIC, NULL), "ISO8859-1");
snprintf(buf, sizeof(buf), "%g", pi); EQS(buf,
EQI(!setlocale(LC_NUMERIC, "fr"), 0);
EQS(setlocale(LC_NUMERIC, NULL), "fr");
snprintf(buf, sizeof(buf), "%g", pi); EQS(buf,
EQI(!setlocale(LC_NUMERIC, "C"), 0);
EQS(setlocale(LC_NUMERIC, NULL), "C");
snprintf(buf, sizeof(buf), "%g", pi); EQS(buf,
/* verify starting point */
"3.14159");
/* setlocale should work */
"3.14159");
/* setlocale should work */
"3,14159");
/* setlocale should work */
"3.14159");
}
オフセットフィールドは、__lc_monetary_blk と同じように解釈されます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-37
C および C++ ライブラリ
4.6.8
_get_lc_time()
_get_lc_time() は、__lc_time_blk 構造へのポインタを戻す必要があります。こ
の構造体は、例 4-8 のマクロを使用して作成することができます。
例 4-8 時間構造
__LC_TIME_DEF(lctime_c, "C",
"Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat",
"Sunday\0xxx" "Monday\0xxx" "Tuesday\0xx" "Wednesday\0"
"Thursday\0x" "Friday\0xxx" "Saturday\0",
"Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec",
"January\0xx" "February\0x" "March\0xxxx" "April\0xxxx"
"May\0xxxxxx" "June\0xxxxx" "July\0xxxxx" "August\0xxx"
"September\0" "October\0xx" "November\0x" "December\0",
"AM", "PM",
"%x %X", "%d %b %Y", "%H:%M:%S")
__LC_TIME_DEF(lctime_fr, "fr",
"dim\0lun\0mar\0mer\0jeu\0ven\0sam",
"dimanche\0" "lundi\0xxx" "mardi\0xxx" "mercredi\0"
"jeudi\0xxx" "vendredi\0" "samedi\0x",
"jan\0xfev\0xmars\0avr\0xmai\0xjuin\0"
"juil\0aout\0sep\0xoct\0xnov\0xdec\0",
"janvier\0xx" "fevrier\0xx" "mars\0xxxxx" "avril\0xxxx"
"mai\0xxxxxx" "juin\0xxxxx" "juillet\0xx" "aout\0xxxxx"
"septembre\0" "octobre\0xx" "novembre\0x" "decembre\0",
"AM", "PM", "%A, %d %B %Y, %X", "%d.%m.%y", "%H:%M:%S")
__LC_INDEX_END(lctime_dummy)
void const *_get_lc_time(void const *null, char const *name) {
return _findlocale(&lctime_c_index, name);
}
void test_lc_time(void) {
struct tm tm;
char timestr[256];
tm.tm_sec = 13;
tm.tm_min = 13;
tm.tm_hour = 23;
tm.tm_mday = 12;
tm.tm_mon = 1;
tm.tm_year = 98;
tm.tm_wday = 4;
tm.tm_yday = 42;
tm.tm_isdst = 0;
EQS(setlocale(LC_TIME, NULL), "C");
4-38
/* verify starting point */
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
strftime(timestr, sizeof(timestr), "%c", &tm);
EQS(timestr, "12 Feb 1998 23:13:13");
EQI(!setlocale(LC_TIME, "fr"), 0);
/* setlocale should work */
EQS(setlocale(LC_TIME, NULL), "fr");
strftime(timestr, sizeof(timestr), "%c", &tm);
EQS(timestr, "jeudi, 12 fevrier 1998, 23:13:13");
EQI(!setlocale(LC_TIME, "C"), 0);
/* setlocale should work */
EQS(setlocale(LC_TIME, NULL), "C");
strftime(timestr, sizeof(timestr), "%c", &tm);
EQS(timestr, "12 Feb 1998 23:13:13");
}
オフセットフィールドは、__lc_monetary_blk と同じように解釈されます。
4.6.9
_get_lconv()
_get_lconv() は、数値数量のフォーマットに適した値を使用して、lconv 構造のコ
ンポーネントを設定します。
構文
void _get_lconv(struct lconv* lc)
実装
この ANSI 拡張はスタティックデータを使用しません。ANSI C 標準に厳密に準拠して
いなければならないアプリケーションを作成する場合は、代わりに localeconv() を
使用する必要があります。
戻り値
既存の lconv 構造体 lc は、フォーマットデータで埋められます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-39
C および C++ ライブラリ
4.6.10
localeconv()
localeconv() は、現ロケールの規則に従い、数値数量のフォーマットに適した値を
使用して、lconv 構造のコンポーネントの作成と設定を行います。
構文
struct lconv * localeconv(void)
実装
char タイプの構造体のメンバはストリングであり、decimal_point を除くどのメン
バも、現ロケールでその値を使用できない、つまり長さがゼロであることを示す "" を
指すことができます。
char タイプのメンバは負の数にはなりません。どのメンバも、その値が現ロケールで
使用不可能なことを示す CHAR_MAX にすることができます。
lconv に含まれるメンバについては、P. 4-47「lconv 構造」を参照して下さい。
戻り値
この関数は、フィルインオブジェクトへのポインタを戻します。この戻り値が指す構
造体はプログラムによって変更されませんが、それ以降の localeconv() 関数への呼
び出しによって上書きされる可能性があります。また、LC_ALL、LC_MONETARY ある
いは LC_NUMERIC カテゴリの setlocale() 関数への呼び出しが、この構造体の内容
を上書きすることがあります。
4-40
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.6.11
setlocale()
引数 category および locale に指定された通りに適切なロケールを選択します。
構文
char* setlocale(int category, const char* locale)
実装
setlocale() 関数は変更点、すなわちクエリ部分もしくはカレントロケールに使用さ
れます。各値のカテゴリ引数の作用を以下に説明します。locale の "C" の値は、C 変換
の最小環境を指定します。locale の空ストリング "" は、実装定義のネイティブ環境を
指定します。プログラム起動時には、setlocale(LC_ALL, "C") と等価な関数が実
行されます。
category の値は以下の通りです。
LC_COLLATE
strcoll() の動作に作用します。
LC_CTYPE
文字処理関数の動作に作用します。
LC_MONETARY
localeconv() が戻す貨幣フォーマット情報に作用します。
LC_NUMERIC
フォーマットされた I/O 関数とストリング変換関数の 10 進小数点文字、
ならびに localeconv() が戻す数値フォーマット情報に作用します。
LC_TIME
strftime() の動作に作用することがあります。現在サポートされてい
るロケールに対しては、このオプションは作用しません。
LC_ALL
全てのロケールカテゴリに作用します。上記カテゴリのビットごとの OR
が実行されます。
戻り値
locale にストリングへのポインタが渡され、その選択が有効であるときは、新しいロ
ケールに指定されたカテゴリに関連付けられたストリングが戻されます。その選択が
不適切な場合には、NULL ポインタが戻され、ロケールは変更されません。
locale に NULL ポインタが渡されると、現ロケールのカテゴリに関連付けられたスト
リングが戻され、そのロケールは変更されません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-41
C および C++ ライブラリ
category が LC_ALL の場合に、最も最近の正常なロケール設定呼び出しで LC_ALL 以
外のカテゴリが使用されると、合成ストリングが戻される可能性があります。その後
の呼び出しは、このとき戻されるストリングと、これに関連付けられたカテゴリを使
用して、プログラムのロケール部分を復元します。戻されるストリングがプログラム
によって変更されることはありませんが、setlocale() へのそれ以降の呼び出しに
よって上書きされる可能性があります。
4.6.12
_findlocale()
_findlocale() はロケールデータベースを検索し、要求されたカテゴリとロケール
のデータブロックへのポインタを戻します。
構文
void const* _findlocale(void const* index, char const *name)
戻り値
要求されたデータブロックへのポインタを戻します。
4.6.13
__LC_CTYPE_DEF
このマクロは CTYPE ブロックの作成に使用します。例 4-9 は、rt_locale.h におけ
る定義とサンプルコードを示しています。
例 4-9 LC_CTYPE_DEF
#define __LC_CTYPE_DEF(sym,ln) \
static const int sym##_index = ~3 & (3 + (268+(~3 & (3 +
sizeof(ln))))); \
static const char sym##_lname[~3 & (3 + sizeof(ln))] = ln; \
static const int sym##_pname = -4-(~3 & (3 + sizeof(ln))); \
static const char sym##_start = 0; \
static const char sym##_table[256] =
全てのマクロで、最初の 2 つの引数はシンボルの接頭文字とロケール名を示していま
す。求められるロケールブロックは、式 &symprefix_start でアドレス指定され、そ
のインデクスエントリは式 &symprefix_index でアドレス指定されます。
用法
P. 4-30「_get_lc_ctype()」参照。
4-42
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
注
コンパイラはデータセグメントを最適化するため、ロケール定義の一部の再順序付け
や削除を行い、データ構造を破壊します。例 4-9 のサンプルコードは、単に説明を分か
りやすくするためのものに過ぎません。実際には、この定義には最適化をディセーブ
ルするためのプラグマを追加する必要があります。
4.6.14
__LC_COLLATE_DEF
このマクロを使用して、ASCII 文字のソート時に使用される照合ブロックを作成できま
す。例 4-10 および例 4-11 は、rt_locale.h にある定義と空テーブルを作成するマク
ロの定義、ならびにサンプルコードを示しています。
全てのマクロで、最初の 2 つの引数はシンボルの接頭文字とロケール名を示していま
す。求められるロケールブロックは、式 &symprefix_start でアドレス指定され、そ
のインデクスエントリは式 &symprefix_index でアドレス指定されます。
例 4-10 配列に使用するマクロ
#define __LC_COLLATE_DEF(sym,ln) \
static const int sym##_index = ~3&(3+(268+(~3&(3+sizeof(ln))))); \
static const char sym##_lname[~3 & (3 + sizeof(ln))] = ln; \
static const int sym##_pname = -4-(~3 & (3 + sizeof(ln))); \
static const int sym##_start = 4; \
static const char sym##_table[] =
例 4-11 デフォルトテーブルを生成するマクロ
#define __LC_COLLATE_TRIVIAL_DEF(sym,ln) \
static const int sym##_index = ~3&(3+(12+(~3&(3+sizeof(ln))))); \
static const char sym##_lname[~3 & (3 + sizeof(ln))] = ln; \
static const int sym##_pname = -4-(~3 & (3 + sizeof(ln))); \
static const int sym##_start = 0;
用法
P. 4-32「_get_lc_collate()」参照。また、コンパイラの最適化による副作用については、
P. 4-42「__LC_CTYPE_DEF」を参照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-43
C および C++ ライブラリ
4.6.15
__LC_TIME_DEF
このマクロを使用して、時刻または日付の値をフォーマットするときに使用されるブ
ロックを作成できます。例 4-12 は、rt_locale.h にある定義とサンプルコードを示
しています。
全てのマクロで、最初の 2 つの引数はシンボルの接頭文字とロケール名を示していま
す。求められるロケールブロックは、式 &symprefix_start でアドレス指定され、そ
のインデクスエントリは式 &symprefix_index でアドレス指定されます。
例 4-12 LC_TIME_DEF
#define __LC_TIME_DEF(sym,ln,wa,wf,ma,mf,am,pm,dt,df,tf) \
static const int sym##_index = ~3 & (3 + (sizeof(wa)+sizeof(wf)+sizeof(ma)+ \
sizeof(mf)+sizeof(am)+sizeof(pm)+ \
sizeof(dt)+sizeof(df)+sizeof(tf)+ \
60+(~3 & (3 + sizeof(ln))))); \
static const char sym##_lname[~3 & (3 + sizeof(ln))] = ln; \
static const int sym##_pname = -4-(~3 & (3 + sizeof(ln))); \
static const int sym##_start = 52; \
static const int sym##_wfoff = (sizeof(wa)+52); \
static const int sym##_maoff = (sizeof(wa)+sizeof(wf)+52); \
static const int sym##_mfoff = (sizeof(wa)+sizeof(wf)+sizeof(ma)+52); \
static const int sym##_amoff = (sizeof(wa)+sizeof(wf)+sizeof(ma)+ \
sizeof(mf)+52); \
static const int sym##_pmoff = (sizeof(wa)+sizeof(wf)+sizeof(ma)+ \
sizeof(mf)+sizeof(am)+52); \
static const int sym##_dtoff = (sizeof(wa)+sizeof(wf)+sizeof(ma)+ \
sizeof(mf)+sizeof(am)+sizeof(pm)+52); \
static const int sym##_dfoff = (sizeof(wa)+sizeof(wf)+sizeof(ma)+ \
sizeof(mf)+sizeof(am)+sizeof(pm)+ \
sizeof(dt)+52); \
static const int sym##_tfoff = (sizeof(wa)+sizeof(wf)+sizeof(ma)+ \
sizeof(mf)+sizeof(am)+sizeof(pm)+ \
sizeof(dt)+sizeof(df)+52); \static const int sym##_wasiz = (sizeof(wa)/7); \
static const int sym##_wfsiz = (sizeof(wf)/7); \
static const int sym##_masiz = (sizeof(ma)/12); \
static const int sym##_mfsiz = (sizeof(mf)/12); \
static const char sym##_watxt[] = wa; \
static const char sym##_wftxt[] = wf; \
static const char sym##_matxt[] = ma; \
static const char sym##_mftxt[] = mf; \
static const char sym##_amtxt[] = am; \
static const char sym##_pmtxt[] = pm; \
static const char sym##_dttxt[] = dt; \
static const char sym##_dftxt[] = df; \
static const char sym##_tftxt[] = tf;
4-44
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
用法
P. 4-38「_get_lc_time()」参照。また、コンパイラの最適化による副作用については、
P. 4-42「__LC_CTYPE_DEF」を参照して下さい。
4.6.16
__LC_NUMERIC_DEF
このマクロを使用して、数値のフォーマットに使用されるブロックを作成できます。例
4-13 は、rt_locale.h にある定義とサンプルコードを示しています。
全てのマクロで、最初の 2 つの引数はシンボルの接頭文字とロケール名を示していま
す。求められるロケールブロックは、式 &symprefix_start でアドレス指定され、そ
のインデクスエントリは式 &symprefix_index でアドレス指定されます。
例 4-13 LC_NUMERIC_DEF
#define __LC_NUMERIC_DEF(sym,ln,dp,ts,gr) \
static const int sym##_index = ~3 & (3 + (sizeof(dp)+sizeof(ts)+sizeof(gr)+ \
20) + (~3 & (3 + sizeof(ln)))); \
static const char sym##_lname[~3 & (3 + sizeof(ln))] = ln; \
static const int sym##_pname = -4-(~3 & (3 + sizeof(ln))); \
static const int sym##_start = 12; \
static const int sym##_tsoff = (sizeof(dp)+12); \
static const int sym##_groff = (sizeof(dp)+sizeof(ts)+12); \
static const char sym##_dptxt[] = dp; \
static const char sym##_tstxt[] = ts; \
static const char sym##_grtxt[] = gr;
用法
P. 4-37「_get_lc_numeric()」参照。また、コンパイラの最適化による副作用については、
P. 4-42「__LC_CTYPE_DEF」を参照して下さい。
4.6.17
__LC_MONETARY_DEF
このマクロを使用して、貨幣値のフォーマットに使用されるブロックを作成できます。
P. 4-46 例 4-14 は、rt_locale.h にある定義とサンプルコードを示しています。
全てのマクロで、最初の 2 つの引数はシンボルの接頭文字とロケール名を示していま
す。求められるロケールブロックは、式 &symprefix_start でアドレス指定され、そ
のインデクスエントリは式 &symprefix_index でアドレス指定されます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-45
C および C++ ライブラリ
例 4-14 LC_MONETARY_DEF
#define __LC_MONETARY_DEF(sym,ln,ic,cs,md,mt,mg,ps,ns, \
id,fd,pc,pS,nc,nS,pp,np) \
static const int sym##_index = ~3 & (3 + (sizeof(ic)+sizeof(cs)+sizeof(md)+ \
sizeof(mt)+sizeof(mg)+sizeof(ps)+ \
sizeof(ns)+44) \
+ (~3 & (3 + sizeof(ln)))); \
static const char sym##_lname[~3 & (3 + sizeof(ln))] = ln; \
static const int sym##_pname = -4-(~3 & (3 + sizeof(ln))); \
static const char sym##_start = id; \
static const char sym##_fdchr = fd; \
static const char sym##_pcchr = pc; \
static const char sym##_pSchr = pS; \
static const char sym##_ncchr = nc; \
static const char sym##_nSchr = nS; \
static const char sym##_ppchr = pp; \
static const char sym##_npchr = np; \
static const int sym##_icoff = 36; \
static const int sym##_csoff = (sizeof(ic)+36); \
static const int sym##_mdoff = (sizeof(ic)+sizeof(cs)+36); \
static const int sym##_mtoff = (sizeof(ic)+sizeof(cs)+sizeof(md)+36); \
static const int sym##_mgoff = (sizeof(ic)+sizeof(cs)+sizeof(md)+ \
sizeof(mt)+36); \
static const int sym##_psoff = (sizeof(ic)+sizeof(cs)+sizeof(md)+ \
sizeof(mt)+sizeof(mg)+36); \
static const int sym##_nsoff = (sizeof(ic)+sizeof(cs)+sizeof(md)+ \
sizeof(mt)+sizeof(mg)+sizeof(ps)+36); \
static const char sym##_ictxt[] = ic; \
static const char sym##_cstxt[] = cs; \
static const char sym##_mdtxt[] = md; \
static const char sym##_mttxt[] = mt; \
static const char sym##_mgtxt[] = mg; \
static const char sym##_pstxt[] = ps; \
static const char sym##_nstxt[] = ns;
用法
P. 4-36「_get_lc_monetary()」参照。また、コンパイラの最適化による副作用について
は、P. 4-42「__LC_CTYPE_DEF」を参照して下さい。
4-46
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.6.18
__LC_INDEX_END
このマクロを使用してインデクスの終わりを宣言することができます。symprefixは、
必ず一意の名前が付けられるように与えられています。例 4-15 は、rt_locale.h に
ある定義とサンプルコードを示しています。
例 4-15 LC_INDEX_END
#define __LC_INDEX_END(symprefix)
4.6.19
static const int symprefix##_index = 0;
lconv 構造
lconv構造は、
数値フォーマット情報を保持します。この構造体は、
関数_get_lconv()
および localeconv() によって充填されます。
lconv 構造を他の関数で使用する前に、
setlocale() 関数を呼び出してこの構造体を初期化する必要があります。
例 4-16 は、locale.h にある lconv の定義を示しています。
例 4-16 lconv 構造
struct lconv {
char *decimal_point;
/* The decimal point character used to format non-monetary quantities */
char *thousands_sep;
/* The character used to separate groups of digits to the left of the */
/* decimal point character in formatted non-monetary quantities.
*/
char *grouping;
/* A string whose elements indicate the size of each group of digits */
/* in formatted non-monetary quantities. See below for more details. */
char *int_curr_symbol;
/* The international currency symbol applicable to the current locale.*/
/* The first three characters contain the alphabetic international
*/
/* currency symbol in accordance with those specified in ISO 4217.
*/
/* Codes for the representation of Currency and Funds. The fourth
*/
/* character (immediately preceding the null character) is the
*/
/* character used to separate the international currency symbol from */
/* the monetary quantity.
*/
char *currency_symbol;
/* The local currency symbol applicable to the current locale.
*/
char *mon_decimal_point;
/* The decimal-point used to format monetary quantities.
*/
char *mon_thousands_sep;
/* The separator for groups of digits to the left of the decimal-point*/
/* in formatted monetary quantities.
*/
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-47
C および C++ ライブラリ
char *mon_grouping;
/* A string whose elements indicate the size of each group of digits */
/* in formatted monetary quantities. See below for more details.
*/
char *positive_sign;
/* The string used to indicate a non-negative-valued formatted
*/
/* monetary quantity.
*/
char *negative_sign;
/* The string used to indicate a negative-valued formatted monetary */
/* quantity.
*/
char int_frac_digits;
/* The number of fractional digits (those to the right of the
*/
/* decimal-point) to be displayed in an internationally formatted
*/
/* monetary quantities.
*/
char frac_digits;
/* The number of fractional digits (those to the right of the
*/
/* decimal-point) to be displayed in a formatted monetary quantity. */
char p_cs_precedes;
/* Set to 1 or 0 if the currency_symbol respectively precedes or
*/
/* succeeds the value for a non-negative formatted monetary quantity. */
char p_sep_by_space;
/* Set to 1 or 0 if the currency_symbol respectively is or is not
*/
/* separated by a space from the value for a non-negative formatted */
/* monetary quantity.
*/
char n_cs_precedes;
/* Set to 1 or 0 if the currency_symbol respectively precedes or
*/
/* succeeds the value for a negative formatted monetary quantity.
*/
char n_sep_by_space;
/* Set to 1 or 0 if the currency_symbol respectively is or is not
*/
/* separated by a space from the value for a negative formatted
*/
/* monetary quantity.
*/
char p_sign_posn;
/* Set to a value indicating the position of the positive_sign for a */
/* non-negative formatted monetary quantity. See below for more details*/
char n_sign_posn;
/* Set to a value indicating the position of the negative_sign for a */
/* negative formatted monetary quantity. */
};
4-48
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
grouping と non_grouping の要素は以下のように解釈されます。
CHAR_MAX
それ以上のグルーピングが実行されないことを示します。
0
その前の要素が、残りの桁数分だけ繰り返されることを示します。
その他
この値は、現在のグループを満足させる桁数を示します。次の要素が検
査され、現在のグループの左に位置する次の桁数グループのサイズが決
定されます。
p_sign_posn と n_sign_posn の値は以下のように解釈されます。
ARM DUI0067DJ-00
0
数量と通貨記号を囲む括弧( )
1
数量と通貨記号の前にある符号ストリング
2
数量と通貨記号の後にある符号ストリング
3
通貨記号の直前にある符号ストリング
4
通貨記号の直後にある符号ストリング
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-49
C および C++ ライブラリ
4.7
エラー通知、エラー処理、プログラム終了のカスタマイズ
C ライブラリによって発生する全てのトラップシグナルまたはエラーシグナルは、
__raise() 関数を介して通知されます。この関数またはこの関数が使用する低レベル
関数は、再実装することが可能です。
注意
浮動小数点処理に関する IEEE 754 規格では、例外に対するデフォルトの応答は、トラッ
プを発生させずに処理を続行することと定義されています。浮動小数点エラー処理は、
fenv.h 内の関数と定義をカスタマイズすることによって修正できます。第 5 章「浮動
小数点サポート」を参照して下さい。
エラー関連関数の詳しい情報については、rt_misc.h インクルードファイルを参照し
て下さい。
表 4-9 は、トラップとエラーの処理関数を示しています。アプリケーションの初期化と
終了については、P. 4-20「新しい実行環境に合わせた C ライブラリのカスタマイズ」を
参照して下さい。
表 4-9 トラップおよびエラー処理
関数
説明
_sys_exit()
最終的に、ライブラリからの全てのイグジットに
よって呼び出されます。P. 4-51「_sys_exit()」参照。
errno
エラー処理に使用されるスタティック変数です。
P. 4-51「errno」参照。
__raise()
ランタイム変則性を通知するシグナルを発生さ
せます。P. 4-52「__raise()」参照。
__rt_errno_addr()
この関数は、変数 errno のアドレスを取得する
ために呼び出されます。P. 4-52「__rt_errno_addr()」
参照。
__rt_fp_status_addr()
この関数は、fp ステータスワードのアドレスを取
得するために呼び出されます。P. 4-56
「__rt_fp_status_addr()」参照。
__default_signal_handler() ユーザへのエラー通知を表示します。P. 4-54
「__default_signal_handler()」参照。
_ttywrch()
4-50
_ttywrch() のデフォルト実装はセミホスティ
ングされるため、セミホスティング SWI が使用さ
れます。P. 4-56「_ttywrch()」参照。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.7.1
_sys_exit()
ライブラリイグジット関数です。ライブラリからの全てのイグジットは最終的に
_sys_exit() を呼び出します。
構文
void _sys_exit(int return_code)
実装
この関数が復帰することはありません。アプリケーションのイグジットは、以下のど
ちらかの方法を使用して上位レベルで傍受する必要があります。
•
C ライブラリ関数 exit() をアプリケーションの一部として実装する。この場合
は、atexit() の処理とライブラリの遮断が行われません。
•
関数 __rt_exit(int n) をアプリケーションの一部として実装する。この場合
はライブラリの遮断が行われませんが、exit() が呼び出されるとき、あるいは
main() が復帰するときは、atexit() の処理は依然として実行されます。
注意
この関数は、スタックオーバフローが発生すると呼び出されます。この関数を再実装
し、コードの一部としてスタックチェックを含めると、オーバフローによってすぐに
_sys_exit() への復帰が発生し、さらに悪いスタックオーバフローが発生します。こ
の関数でスタックチェックを実行することは推奨しません。
戻り値
復帰コードは使用しないことを推奨します。実装によっては、このコードを実行環境
に渡そうとする場合があります。
4.7.2
errno
C ライブラリの errno 変数は、このライブラリで暗示的スタティックデータエリア内
で定義されます。このエリアは __user_libspace() によって識別されます。このエ
リアは、ランタイムスタックを確立する関数に使用される初期スタック空間の一部を
占有します。以下は errno の定義を示しています。
(*(volatile int *) __rt_errno_addr())
__user_libspace() によって識別されるデフォルト位置ではなく、ユーザ定義位置
に errno を配置したい場合には、__rt_errno_addr() を定義することが可能です。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-51
C および C++ ライブラリ
戻り値
デフォルト実装は、ステータスワードのアドレスを戻す __user_libspace() 上のベ
ニアです。適切なデフォルト定義は、C ライブラリ標準ヘッダに記述されています。
4.7.3
__rt_errno_addr()
この関数は、C ライブラリが errno の読み出しまたは書き込みを試行したときに、C
ライブラリの errno 変数のアドレスを取得する目的で呼び出されます。デフォルト実
装は C ライブラリによって定義されます。この関数を再実装しなければならないこと
はまずありません。
構文
volatile int *__rt_errno_addr(void)
4.7.4
__raise()
この関数は、ランタイム変則性を通知するシグナルを発生させます。
構文
int __raise(int major, int minor)
major
シグナル番号を保持する整数です。
minor
整数、ストリング定数、変数のいずれかを指定します。
実装
この関数は、通常の C シグナルメカニズムまたはデフォルトのシグナルハンドラを呼
び出します。詳細については、P. 4-56「_ttywrch()」を参照して下さい。
__raise() 関数は、以下を定義することによって置換できます。
int __raise(int signal, int argument)
これによって C シグナルメカニズムと、大量のデータを必要とするシグナルハンドラ
ベクタをバイパスできますが、他の点では実質的に以下と同じインタフェースが使用
されます。
void __default_signal_handler(int signal, int arg)
4-52
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
戻り値
__raise() の復帰条件には以下の 3 つが考えられます。
4.7.5
戻り値なし
ハンドラがロングジャンプまたは再起動を実行するとき
0
シグナルが処理されたとき
非ゼロ
呼び出しコードが戻り値をイグジットコードに渡す必要があります。デ
フォルトライブラリ実装では、__raise() が非ゼロ復帰コード rc を戻
すと、_sys_exit(rc) が呼び出されます。
__rt_raise()
この関数は、ランタイム変則性を通知するシグナルを発生させます。
構文
void __rt_raise(int signal, int type)
signal
シグナル番号を保持する整数です。
type
整数、ストリング定数、変数のいずれかを指定します。
実装
この関数を再定義することにより、ライブラリのシグナル処理メカニズム全体を更新
することができます。デフォルト実装は __raise() を呼び出します。詳細について
は、P. 4-52「__raise()」を参照して下さい。
__raise() から戻される値には、以下が考えられます。
ARM DUI0067DJ-00
戻り値なし
ハンドラがロングジャンプまたは再起動を実行し、__rt_raise() が制
御を再取得しないとき
0
シグナルが処理され、__rt_raise() が終了したとき
非ゼロ
デフォルトライブラリ実装では、__raise() が非ゼロ復帰コード rc を
戻すと、_sys_exit(rc) が呼び出されます。
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-53
C および C++ ライブラリ
4.7.6
__default_signal_handler()
この関数は発生したシグナルを処理します。デフォルトではエラーメッセージを印字
して終了します。
構文
void __default_signal_handler(int signal, int arg)
実装
このデフォルトのシグナルハンドラは、_ttywrch() を使用してメッセージを印字し、
_sys_exit() を呼び出して終了します。このシグナルハンドラは、以下を定義するこ
とによって更新できます。
void __default_signal_handler(int signal, int argument)
インタフェースは __raise() と同じですが、この関数は C シグナル処理メカニズム
でシグナルを処理できない場合にのみ呼び出されます。
定義されているシグナルの全一覧は signal.h に収録されています。表 4-10 は、ライ
ブラリに使用されるシグナルを示しています。
注
ライブラリに使用されるシグナルは、ADS の今後のバージョンで変更される可能性が
あります。signal() 関数によって処理されるシグナルについては、P. 4-93 表 4-18 を
参照して下さい。
表 4-10 C/C++ ライブラリに使用されるシグナル
4-54
シグナル
番号
シグナル名
説明
1
SIGABRT
このシグナルは、アプリケーションによって abort() または
assert() が呼び出された場合にのみ使用されます。
2
SIGFPE
例えばゼロによる除算等の全ての算術例外の通知に使用され
ます。ハードウェア / ソフトウェア浮動小数点と、整数除算で
使用されます。
7
SIGSTAK
スタックオーバフローが検出されたことを通知します(ただ
し、ソフトウェアスタックチェックを ON にしてコンパイルさ
れたコードの場合のみ)。
8
SIGRTRED
ランタイムリダイレクションエラーを通知します。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
表 4-10 C/C++ ライブラリに使用されるシグナル
シグナル
番号
シグナル名
説明
9
SIGRTMEM
ランタイムメモリエラーを通知します。
12
SIGPVFN
純仮想関数が C++ から呼び出されたことを通知します。
13
SIGCPPL
C++ ライブラリからの例外を通知します。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-55
C および C++ ライブラリ
4.7.7
_ttywrch()
この関数はコンソールに文字を書き込みます。コンソールはリダイレクトされている
可能性があります。この関数は、エラー処理ルーチンの最後の手段として使用するこ
とができます。
構文
void _ttywrch(int ch)
実装
この関数のデフォルト実装はセミホスティング SWI を使用します。
この関数もしくは __raise() は、他に入出力がない場合でも再定義することができま
す。例えば、この関数を使用して不揮発性メモリに保存しておくログにエラーメッセー
ジを書き込むことも可能です。
4.7.8
__rt_fp_status_addr()
この関数は、浮動小数点ステータスレジスタのアドレスを戻します。
構文
unsigned* _rt_fp_status_addr(void)
実装
__rt_fp_status_addr() が定義されていない場合は、C ライブラリからのデフォル
ト実装が使用されます。この値は、__rt_lib_init() が _fp_init() を呼び出すと
初期化されます。ステータスワードの定数については fenv.h を参照して下さい。デ
フォルトの fp ステータスは 0 です。
4-56
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.8
記憶域管理のカスタマイズ
このセクションでは、メモリ管理をカスタマイズするときに定義可能な rt_heap.h 内
の関数について説明します。この他、ヒープ実装から呼び出せる 2 つのヘルパ関数が
あります。
メモリ関連の関数については、rt_heap.h および rt_memory.s インクルードファイ
ルを参照して下さい。
注
限られた RAM で組み込みシステムを開発する場合は、ヒープも、ヒープを使用する関
数も使用しないシステムが必要となる可能性があります。その他の場合は、ユーザ定
義のヒープ関数が必要となることがあります。ヒープを使用すると警告メッセージを
発生させる目的でインクルードすることが可能な 2 つのライブラリ関数があります。
__use_no_heap()
malloc()、realloc()、free() ならびにこれに似た関数(calloc()
や stdio など)を使用する全ての関数の使用を監視します。
__use_no_heap_region()
__use_no_heap() と同じ特性を持っていますが、これに加えてヒープ
メモリ領域を使用するものも監視します。例えば、引数を取る関数とし
て main() を宣言すると、argc と argv の収集にヒープ領域が使用さ
れます。
4.8.1
malloc のサポート
malloc()、realloc()、calloc()、free() は、ヒープの抽象データタイプに基づ
いてビルドされます。ユーザは以下のどちらかを行うことができます。
•
ヒープ実装を定義したヒープ 1 またはヒープ 2 のどちらかを選択する。
•
ヒープの抽象データタイプのヒープ実装を自分で記述する(P. 4-60「記憶域管理
システムの作成」参照)。
malloc()、realloc()、calloc() のデフォルト実装は、ヒープを 8 バイト境界整列
で保持します。
ヒープ 1:標準ヒープ実装
:標準ヒープ実装
デフォルト実装であるヒープ 1 は、最も小さくかつ単純なヒープマネージャを実装し
ます。ヒープは、1 つに結合された、昇順アドレスで保持されるフリーブロックのリス
トとして管理されます。割り当て方式はアドレスごとの先頭一致方式です。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-57
C および C++ ライブラリ
この実装ではオーバヘッドが低いものの、malloc() と free() にかかるコストがフ
リーブロックの数に対して直線的に増加します。割り当て可能な最小ブロックは 4 バ
イトであり、さらに 4 バイトのオーバヘッドがかかります。100 を超える未割り当てブ
ロックを必要とする場合は、ヒープ 2 の使用を推奨します。
ヒープ 2:代替ヒープ実装
:代替ヒープ実装
ヒープ 2 は、malloc() または free() のコストがフリーブロックの数に対して対数
的に増加するコンパクトな実装を定義しています。割り当て方式はアドレスごとの先
頭一致方式です。割り当て可能な最小ブロックは 12 バイトであり、さらに 4 バイトの
オーバヘッドがかかります。
ヒープ 2 は、何百ものフリーブロックが存在するときに、ほぼ一定のパフォーマンス
を必要とする場合に推奨します。この代替標準実装を選択するには、以下のどちらか
を使用します。
•
IMPORT __use_realtime_heap(アセンブリ言語の場合)
•
#pragma import(__use_realtime_heap)(C の場合)
ユーザヒープ実装を定義することもできます。詳細については、P. 4-60「記憶域管理シ
ステムの作成」を参照して下さい。
ヒープ 2 の使用
ヒープ 2 のリアルタイムヒープ実装で、ヒープがどのくらいのアドレス空間に展開す
るかを知っておく必要があります。アドレス範囲が狭くなるにしたがって、このアル
ゴリズムの効率性が上がります。
デフォルトでは、ヒープの先頭(__rt_initial_stackheap() または
__rt_heap_extend() によって、ヒープマネージャに渡される最初のメモリチャンク
の開始位置として定義されます)から 16MB のヒープ範囲が設定されます。
ヒープ境界は以下によって指定されます。
struct __heap_extent {
unsigned base, range;};
__value_in_regs struct __heap_extent __user_heap_extent(
unsigned defaultbase, unsigned defaultsize);
__user_heap_extent() の関数プロトタイプは rt_misc.h に収録されています。
ヒープ 1 のアルゴリズムではヒープ範囲の境界を必要としないため、この関数が呼び
出されることはありません。
4-58
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
以下の場合は、__user_heap_extent() を再定義する必要があります。
•
16MB を超えるアドレス空間にヒープを展開させる必要があるとき
•
メモリモデルが、指定されている最初のアドレスよりも下位のアドレスにメモリ
ブロックを配置できるとき
ヒープのアドレス空間範囲が小さいことが事前に分かっていれば
__user_heap_extent() を再定義する必要はありませんが、再定義することでヒー
プアルゴリズムの処理速度を上げることができます。
このルーチンが定義されていない場合の入力パラメータにはデフォルト値が使用され
ます。例えば、デフォルトのベース値を変更せずに、サイズだけを調整することも可
能です。
注
戻されるサイズフィールドは 2 の累乗でなければなりません。size にゼロを戻すと、
ヒープ範囲に 4GB が設定されます。
ベアマシン C からのヒープ実装の使用
main() を定義しておらず、かつ C ライブラリを初期化しないアプリケーションでヒー
プ実装を使用するには:
1.
_init_alloc(base, top) を呼び出し、ヒープとして管理するメモリのベー
スとトップを定義します。
2.
ヒープが一杯になったときにヒープを拡張するための呼び出しを処理するよう
に、関数unsigned __rt_heap_extend(unsigned size, void ** block)
を定義します。
alloca()
alloca() の動作は、自動的にゴミを収集する点を除いては、malloc() と全く同じ
です(P. 4-101「alloca()」参照)。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-59
C および C++ ライブラリ
4.8.2
記憶域管理システムの作成
表 4-11 のヒープ関数を実装し、新しい記憶域管理システムを作成することができます。
表 4-11 ヒープ関数
関数
説明
__Heap_Descriptor
ヒープの抽象データタイプの実装を定義する必要
があります。P. 4-61「__Heap_Descriptor」参照。
__Heap_Initialize()
ヒープを初期化します。P. 4-61「__Heap_Initialize()」
参照。
__Heap_DescSize()
__Heap_Descriptor 構造のサイズを戻します。
P. 4-61「__Heap_DescSize()」参照。
__Heap_ProvideMemory()
ヒープのサイズを増やすために呼び出されます。
P. 4-62「__Heap_ProvideMemory()」参照。
__Heap_Alloc()
ヒープからアプリケーションにメモリを割り当て
ます。P. 4-62「__Heap_Alloc()」参照。
__Heap_Free()
以前に割り当てられた空間をヒープに戻します。
P. 4-63「__Heap_Free()」参照。
__Heap_Realloc()
割り当て済みのブロックのサイズを調整します。
P. 4-63「__Heap_Realloc()」参照。
__Heap_Stats()
__Heap_Valid()
ヒープの一貫性チェックを実行するために呼び出
されます。P. 4-64「__Heap_Valid()」参照。
__Heap_Full()
システムからの新しいブロックの取得を試行しま
す。こ の 関 数 は 再 実 装 し な い で 下 さ い。P. 4-65
「__Heap_Full()」参照。
__Heap_Broken()
4-60
ヒープ状態に関する統計を印字するために
__heapstats() から呼び出されます。P. 4-64
「__Heap_Stats()」参照。
ヒープ内の矛盾が検出されると呼び出されます。
P. 4-65「__Heap_Broken()」参照。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.8.3
__Heap_Descriptor
ヒープの抽象データタイプの実装を定義する必要があります。この抽象データタイプ
を記述した C ヘッダファイルが rt_heap.h に収録されています。他の関数がヒープ
データを検出できるように、この構造体の内部定義を記述する必要があります。例 4-17
は、一般的な内容を示しています。
例 4-17 ヒープ記述子
struct __Heap_Descriptor {
void *my_first_free_block;
void *my_heap_limit;
}
ヒープ記述子は __Heap_Initialize() によって設定され、__Heap_Alloc() や
__Heap_Free() などの他のヒープ関数に渡されます。
4.8.4
__Heap_Initialize()
ヒープを初期化します。
構文
void __Heap_Initialize(struct __Heap_Descriptor*h)
実装
この関数は初期化時に呼び出されます。初期値を修正してヒープ記述子構造内の
フィールドを設定するには、この関数を再定義する必要があります。典型的なリスト
連結ヒープは、first_free_block ポインタを NULL に初期化して、ヒープ内にフリーブ
ロックがないことを通知します。
4.8.5
__Heap_DescSize()
__Heap_Descriptor 構造のサイズを戻します。
構文
int __Heap_DescSize(int 0)
実装
この関数は初期化時に呼び出されます。この関数で、作成したヒープ記述子構造のサ
イズを戻す必要があります。ほぼ全ての場合において、P. 4-62 例 4-18 が示す実装で十
分です。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-61
C および C++ ライブラリ
例 4-18 Heap_DescSize
extern int __Heap_DescSize(int zero) {return sizeof(__Heap_Descriptor);}
このルーチンは、ライブラリ初期化関数がヒープ記述子として十分な容量の初期メモ
リ片を検出するために必要となります。
4.8.6
__Heap_ProvideMemory()
ヒープのサイズを増やすために呼び出されます。
構文
void __Heap_ProvideMemory(struct __Heap_Descriptor* h,
void* base, size_t size)
実装
この関数は、システムがヒープに使用するメモリチャンクを割り当てるときに呼び出
されます。パラメータは以下の通りです。
•
ユーザ定義のヒープ記述子
•
8 バイト境界整列の新しいメモリブロックへのポインタ
•
そのブロックのサイズ
__Heap_ProvideMemory()は、入力ブロックが8バイト境界整列であると仮定するこ
とができます。典型的な __Heap_ProvideMemory() の実装では、新しいメモリブ
ロックをフリーリストのエントリとして設定し、これをフリーチェインに追加するこ
とがあります。
4.8.7
__Heap_Alloc()
ヒープからアプリケーションにメモリを割り当てます。
構文
void __Heap_Alloc(struct __Heap_Descriptor* h, size_t size)
実装
この関数は malloc() から呼び出され、ヒープから割り当てられたメモリの size バ
イトに対するポインタを、あるいは割り当てられるメモリがなければ NULL を戻す必要
があります。このブロックのサイズは、これを開放するときに決定できるようにして
おく必要があります。通常、戻されたブロックサイズは、その開始アドレス直前のワー
4-62
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
ドにストアされます。この関数のデフォルト実装は、8 バイト境界整列のメモリブロッ
クを割り当てます。この関数を再実装する場合には、8 バイト境界整列のメモリブロッ
クを戻すようにすることを推奨します。
4.8.8
__Heap_Free()
以前に割り当てられた空間をヒープに戻します。
構文
void __Heap_Free(struct __Heap_Descriptor* h, void* _blk)
実装
この関数は free() から呼び出され、__Heap_Alloc() または __Heap_Realloc()
から以前に戻されたポインタが渡されます。これにより、以前に割り当てられた空間
をヒープ内のフリーブロックの集合に戻します。
4.8.9
__Heap_Realloc()
割り当て済みのブロックのサイズを調整します。
構文
void __Heap_Realloc(struct __Heap_Descriptor* h, void* _blk, size_t size)
実装
この関数は realloc() から呼び出されます。この関数に、blk = NULL や、size =
ゼロような単純な値が渡されることはありません。この関数は、割り当てられたブロッ
ク blk のサイズを size になるように調整します。この再割り当てにより、ブロックの
移動、旧サイズと新サイズに共通するデータのコピー、新しいアドレスの戻しが行わ
れる可能性があります。この関数のデフォルト実装は、8 バイト境界整列のヒープブ
ロックを保持します。この関数を再実装する場合には、8 バイト境界整列を保持するこ
とを推奨します。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-63
C および C++ ライブラリ
4.8.10
__Heap_Stats()
__heapstats() から呼び出され、ヒープ状態に関する統計を印字します。
構文
void *__Heap_Stats(__Heap_Descriptor *h, int(*print) (void*, char const
*format,...), void *printparam)
実装
この関数は、以下の形式の呼び出しにより、指定された printf タイプの print ルーチ
ンを使用して結果を出力する必要があります。
print(printparam, "%d free blocks\n", nblocks);
統計データの形式は実装定義であるため、これについてできることはありません。こ
のルーチンはユーザプログラムが __heapstats() を呼び出さない限りは呼び出され
ないため、実質的にはオプションです。
4.8.11
__Heap_Valid()
__heapvalid() から呼び出されてヒープデータ構造の一貫性チェックを実行し、無
効なヒープ、または破損したヒープの識別を試行します。
構文
int __Heap_Valid(struct __Heap_Descriptor *h, int(*print) (void*, char const
*format,...), void *printparam, int verbose)
実装
この関数は、指定された printf タイプの print ルーチンを使用して、エラーメッセー
ジと診断結果を出力する必要があります。例えば、以下の形式の呼び出しを使用でき
ます。
print(printparam, "free block at %p is corrupt\n",block_addr);
このルーチンはユーザプログラムが __heapvalid() を呼び出さない限りは呼び出さ
れないため、実質的にはオプションです。
戻り値
この関数は、ヒープが有効な場合は非ゼロを、ヒープが破損している場合はゼロを戻
す必要があります。ヒープ内に問題を検出した場合は、print を使用してエラーメッ
セージを出力します。verbose パラメータが非ゼロの場合は、診断データを出力する
こともできます。
4-64
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.8.12
__Heap_Full()
システムから少なくとも size バイトの新しいブロックを取得しようと試みます。この
関数は再実装できません。
構文
int __Heap_Full(struct __Heap_Descriptor *h, size_t size)
実装
__Heap_Alloc() または __Heap_Realloc() は、ヒープに使用されているメモリか
ら必要なサイズのブロックを割り当てられない場合に、割り当てを諦めて NULL を戻す
前にこのルーチンの呼び出しを試行します。
ヒープのハウスキーピングデータの空間を割り当てる必要があります。ユーザが 1000
バ イ ト を 要 求 し、全 て の 割 り 当 て ブ ロ ッ ク の 前 に ワ ー ド を ス ト ア す る 場 合、
__Heap_Full() には 1000 バイトではなく 1004 バイトを要求する必要があります。
__Heap_Full() を呼び出す前に、ヒープデータ構造が一貫した状態にあり、
__Heap_ProvideMemory() が新しいブロックをヒープに正しく追加できるようにし
ておく必要があります。
戻り値
__Heap_Full() が正しく処理されれば、新しいブロックをヒープに追加する
__Heap_ProvideMemory() が呼び出され、非ゼロが戻されます。この関数の処理に
失敗すると、0 が戻されます。
4.8.13
__Heap_Broken()
ヒープ内に矛盾が検出されると呼び出されます。この関数は再実装できません。
構文
int __Heap_Broken(struct __Heap_Descriptor *h)
実装
__Heap_Alloc()、__Heap_Realloc()、__Heap_Free()、
__Heap_ProvideMemory() のいずれかがヒープ構造内の矛盾を検出すると、この関
数を呼び出してプログラムを終了し、適切なエラーメッセージを出力することができ
ます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-65
C および C++ ライブラリ
4.9
ランタイムメモリモデルのカスタマイズ
このセクションでは以下について説明します。
4.9.1
•
C ライブラリによって、スタティックデータ、ヒープ、スタックとして書き込み
可能なメモリの管理
•
書き込み可能メモリの管理方法を変更するために再定義することが可能な関数
メモリモデル
以下のどちらかのメモリモデルを選択することができます。
1 メモリ領域
スタックはメモリ領域の最上部から下向けに展開し、ヒープはこの領域
の最下部から上向きに展開します。これがデフォルトです。
2 メモリ領域
一方のメモリ領域をスタックに、他方をヒープに使用します。ヒープ領
域のサイズはゼロにすることができます。スタック領域は割り当て済み
のメモリ内に配置するか、実行環境から継承することができます。
デフォルトの 1 領域モデルではなく、2 領域モデルを使用するには、以
下のどちらかを使用します。
•
IMPORT __use_two_region_memory(アセンブリ言語の場合)
•
#pragma import(__use_two_region_memory)(C の場合)
注意
2 領域メモリモデルを使用するときにヒープメモリを指定しない場合には、malloc()
の呼び出し、stdio の使用、main() のコマンドライン引数の取得、が全て不可能に
なります。
ヒープ領域のサイズをゼロに設定し、ヒープを拡張できる関数として
__user_heap_extend() を定義すると、このヒープは必要に応じて作成されます。
ヒープまたはヒープ領域が使用されるときに警告メッセージを発行する方法について
は、P. 4-57「記憶域管理のカスタマイズ」の __use_no_heap() の説明を参照して下
さい。
4-66
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.9.2
ランタイムメモリモデルの制御
ヒープ / スタックマネージャの動作は、表 4-12 の関数を再定義することによって修正
できます。
表 4-12 メモリモデルの初期化
関数
説明
__user_initial_stackheap()
__user_heap_extend()
__user_stack_slop()
初期ヒープの位置を戻します。P. 4-68
「__user_initial_stackheap()」参照。
ヒープ追加ブロックのサイズとベースアドレスを
戻します。P. 4-69「__user_heap_extend()」参照。
追加スタックの容量を戻します。P. 4-70
「__user_stack_slop()」参照。
ライブラリ用の隠蔽されたスタティックデータは、__user_libspace() によって与
えられます。このスタティックデータエリアは、ライブラリ初期化プロセスではスタッ
クとしても使用されます。通常、この関数の再実装は必要ありません。P. 4-25「スタ
ティックデータアクセスのカスタマイズ」を参照して下さい。
4.9.3
ユーザメモリモデルの記述
用意されているメモリモデルが要件に合わない場合には、自分で記述することができ
ます。メモリモデルは、表 4-13 の関数を定義するものでなくてはなりません。全ての
関数は ARM 状態の関数です。Thumb 状態が要求される場合、Thumb 状態からのエン
トリはライブラリが処理します。このモデルの不完全なプロトタイプ実装が、Include
ディレクトリ内の rt_memory.s に収録されています。
このプロトタイプは実装の足掛かりとして使用して下さい。
表 4-13 メモリモデル関数
関数
説明
__rt_stackheap_init()
アプリケーションのスタックと初期ヒープを設定します。P. 4-71
「__rt_stackheap_init()」参照。
__rt_heap_extend()
ヒープに追加する新しいメモリブロックを戻します。P. 4-72
「__rt_heap_extend()」参照。
__rt_stack_postlongjmp()
ロングジャンプへの呼び出し後に、スタックポインタとスタックリミットポ
インタに正しい値を自動的に設定します。P. 4-73「__rt_stack_postlongjmp()」
参照。
__rt_stack_overflow()
スタックオーバフローを処理します(この関数は、スタックチェックを行う
バリアントにのみ必要です)。P. 4-71「__rt_stack_overflow()」参照。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-67
C および C++ ライブラリ
4.9.4
__user_initial_stackheap()
初期スタックおよびヒープの位置を戻します。
構文
__value_in_regs struct __initial_stackheap __user_initial_stackheap (unsigned
R0, unsigned SP, unsigned R2, unsigned SL)
実装
注
リンカに分散ローディングファイルを使用する場合には、この関数を再実装する必要
があります。デフォルト実装では、シンボル Image$$ZI$$Limit の値が使用されま
す。このシンボルは、リンカが分散ローディングファイル(-scatter コマンドライ
ンオプション)を使用する場合には定義されません。
この関数を再定義する場合は、以下を守る必要があります。
•
96 バイト以下のスタックを使用すること
•
r12(ip)以外のレジスタを更新しないこと
•
r0 ~ r3 のそれぞれに、ヒープベース、スタックベース、ヒープリミット、スタッ
クリミットを戻すこと
ヒープを 8 バイト境界整列で保持すること
•
デフォルトの 1 領域モデルを使用する場合は、r2 と r3 の値が無視され、r0 ~ r1 の全て
のメモリをヒープに使用することができます。2 領域モデルの場合は、ヒープリミット
が r2 によって、スタックリミットが r3 によって設定されます。
実行環境から継承した sp と sl の値は、それぞれ r1 と r3 に引数として渡されます。セミ
ホスティング SWI SYS_HEAPINFO を使用する __user_initial_stackheap() のデ
フォルト実装は、ライブラリによってモジュール sys_stackheap.o に与えられます。
実行環境からspとslを継承し、ヒープを使用しない__user_initial_stack_heap()
のバージョンを作成するには、r0 と r2 に、r3 の値と戻り値を設定します。
以下は、rt_misc.h に含まれている __initial_stackheap の定義です。
struct __initial_stackheap{
unsigned heap_base, stack_base, heap_limit, stack_limit;}
この関数の再実装については、\Examples\Embedded\embed\retarget.c を参照
して下さい。
4-68
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
戻り値
r0 と r3 に戻される値は、1 領域モデルと 2 領域モデルのどちらを使用するかによって
異なります。
4.9.5
1 領域
(r0,r1)が 1 つのスタック領域とヒープ領域に使用されます。r1>r0 です。
r2 と r3 は無視されます。
2 領域
(r0, r2)が初期ヒープに、
(r3, r1)が初期スタックに使用されます。
r2 ≧ r0、r3<r1 です。
__user_heap_extend()
この関数は、初期ブロックとは別に、ヒープに使用される追加メモリブロックを戻す
ように定義することができます。定義する場合、この関数は 8 バイト境界整列のヒー
プ拡張ブロックのサイズとベースアドレスを戻す必要があります。
構文
unsigned __user_heap_extend(int 0, unsigned requested_size, void **base)
実装
この関数のデフォルト実装はありません。この関数を定義する場合は、以下の特性を
持たせる必要があります。
•
ARM DUI0067DJ-00
戻されるサイズが以下のどちらかであること
—
要求されたサイズ以上の 8 バイトの倍数
—
0。要求が受け入れられないことを示します。
•
サイズがバイト単位で計算されること
•
この関数が ATPCS の制約条件だけに準拠していること
•
エントリ時の最初の引数がゼロであること。ベースはこの引数を保持するレジス
タに戻されます。
•
戻されるベースアドレスが 8 バイト境界で整列していること
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-69
C および C++ ライブラリ
4.9.6
__user_heap_extent()
定義されていれば、この関数はヒープのベースアドレスと最大範囲を戻します。
構文
__value_in_regs struct __heap_extent __user_heap_extent(unsigned ignore1,
unsigned ignore2)
実装
この関数のデフォルト実装はありません。パラメータ ignore1 および ignore2 の値
は、この関数には使用されません。
4.9.7
__user_stack_slop()
定義されていれば、この関数はシステムが要求する sl 未満の追加スタックのサイズを
戻します。ATPCS には、256 バイトの他に追加スタックが要求されます。この追加空
間を使用することにより、スタックに対して実行する割り込みハンドラを、あるいは
チェックされない関数呼び出しのチェインをイネーブルできる可能性があります。
構文
__stack_slop __user_stack_slop(unsignedignore, unsignedignore)
実装
この関数のデフォルト実装はありません。
戻り値
この関数を定義する場合は、以下の値をレジスタに戻す必要があります。
4-70
r0
スタックに対して任意に割り込みハンドラを実行できるように常に使用
可能でなければならない追加スタックの容量(バイト単位)。
r1
オーバフローからの回復をサポートするために、スタックオーバフロー
後に使用可能でなければならない追加スタックの容量(バイト単位)。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.9.8
__rt_stackheap_init()
この関数は、有効なスタックを指す sp と sl を設定し、ヒープとして使用可能なメモリ
チャンクの下限と上限を r0 と r1 に戻す必要があります。(r1 と等しい r0 を戻すことに
よって、後者を拒否する場合があります。この場合は、malloc() への最初の呼び出
しによって __rt_heap_extend() への呼び出しが発生します。P. 4-72
「__rt_heap_extend()」を参照して下さい。)不完全なプロトタイプ実装が
rt_memory.s に収録されています。この関数はエントリから呼び出される最初の関数
であるため、他のレジスタを保存する必要はありません。この関数へのエントリにお
ける sp と sl は、アプリケーション全体へのエントリ時と全く同じ値を保持するため、
必要であれば有効なスタックを実行環境から継承することができます(sl はスタック
チェックの使用時にのみ必要です)。
4.9.9
__rt_stack_overflow()
この関数は、スタックオーバフローの発生時に呼び出されます。不完全なプロトタイ
プ実装が rt_memory.s に収録されています。
実装
この関数は、r12(ip)が指定した新しい sp と等しくなるように設定し、sp を sl 未満の
最大 256 バイトまでに設定して呼び出します。
作成したメモリモデルをスタックチェックなしのデフォルト ATPCS だけに使用する場
合には、この関数を実装する必要はありません。
スタックリミットチェックに失敗すると、スタックオーバフロールーチンがこの関数
のエントリで呼び出されます。これらのルーチンは、スタックオーバフロールーチン
に関する通常のレジスタ使用規則に従います。つまり、r0 ~ r3 にはまだ引数が保持さ
れているため、これらのルーチンが r0 ~ r3 を使用することはできず、ルーチンが r4 ~
r11 を保存していなかった場合はこれらのレジスタを使用することもできません。
戻り値
この関数は lr に復帰しません。この関数は、__rt_stack_overflow_return への
分岐によって復帰させる必要があります。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-71
C および C++ ライブラリ
4.9.10
__rt_heap_extend()
この関数は、可能な場合に限り、ヒープに追加する新しい 8 バイト境界整列のメモリブ
ロックを戻します。他のメモリモデル関数を再実装する場合は、この関数を再実装する
必要があります。不完全なプロトタイプ実装が rt_memory.s に収録されています。
実装
呼び出し規則には通常の ATPCS が使用されます。エントリ時、r0 は追加ブロックの最
小サイズを保持し、r1 はベースアドレスをストアする位置へのポインタを保持します。
デフォルト実装には以下の特性があります。
•
戻されるサイズは以下のどちらかです。
—
要求されたサイズ以上の 8 バイトの倍数
—
0。要求が受け入れられないことを示します。
•
戻されるベースアドレスが 8 バイト境界で整列している。
•
サイズがバイト単位で計算される。
•
この関数が ATPCS の制約条件だけに準拠している。
戻り値
デフォルト実装では、十分なフリーヒープメモリがある場合に、ヒープを拡張します。
この関数が実装されていれば、ヒープを拡張できない場合に__user_heap_extend()
を呼び出します(P. 4-69「__user_heap_extend()」参照)。イグジットにおいて、r0 は取
得されたブロックのサイズを保持するか、何も取得できなかった場合は 0 を保持し、エ
ントリで r1 が指したメモリ位置がこのブロックのベースアドレスを保持します。
4-72
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.9.11
__rt_stack_postlongjmp()
この関数は、longjmp() への呼び出し後の値を修正して sp と sl を設定します。アセ
ンブラコードの不完全なプロトタイプ実装が rt_memory.s に収録されています。
実装
この関数は、r0 が sl の setjmp() 前の値を保持し、r1 が sp の setjmp() 前の値を保
持した状態で呼び出されます。
作成したメモリモデルをスタックチェックなしの ATPCS だけに使用する場合には、こ
の関数を実装する必要はありません。
戻り値
この関数は、sl と sp に有効な longjmp() 後の値を設定する必要があります。割り込
み問題を回避するため、レジスタはアトミックに設定する必要があります。メモリモ
デルが特別な処理を要求しない最小実装の場合と同じように、r0とr1をスタックにプッ
シュし、その次に LDM を使用して、sl と sp に新しい値をアトミックにロードして下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-73
C および C++ ライブラリ
4.10
I/O 関数のカスタマイズ
fscanf() や fprintf() などの高レベル I/O 関数はターゲットに依存しません。しか
しながら、高レベル関数は、ターゲットに依存する低レベル関数の呼び出しによって
入出力を実行します。入出力を再ターゲットするには、これらの高レベル関数を使用
しないか、または低レベル関数を再定義する必要があります。
I/O 関数の詳細については、rt_sys.h インクルードファイルを参照して下さい。
4.10.1
低レベル関数への依存性
表 4-14 は、低レベル関数に対する高レベル関数の依存性を示しています。低レベル関
数のユーザバージョンを定義する場合は、高レベル関数のライブラリバージョンをそ
のまま使用することができます。fgetc() は __FILE を使用しますが、fputc() は
__FILE と ferror() を使用します。
低レベル
オブジェクト
説明
fprintf
printf
fwrite
fputs
puts
fscanf
scanf
fread
read
fgets
gets
表 4-14 入力 / 出力の依存性
__FILE
ファイル構造
x
x
x
x
x
x
x
x
x
x
x
__stdin
__FILE タイプの標準入力オブジェクト
-
-
-
-
-
-
x
-
x
-
x
__stdout
__FILE タイプの標準出力オブジェクト
-
x
-
-
x
-
-
-
-
-
-
fputc()
文字をファイルに出力します。
x
x
x
x
x
-
-
-
-
-
-
ferror()
ファイル入出力中に蓄積されたエラース x
テータスを戻します。
x
x
-
-
-
-
-
-
-
-
fgetc()
ファイルから文字を取得します。
-
-
-
-
-
x
x
x
x
x
x
__backspace()
ファイルポインタを前の文字に移動します。 -
-
-
-
-
x
x
-
-
-
-
低レベル関数の構文については、ANSI C リファレンスを参照して下さい。
4-74
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
printf ファミリ
printf ファミリは、_printf()、printf()、_fprintf()、fprintf()、
vprintf()、vfprintf() で構成されます。これら全ての関数が __FILE を不透明に
使用し、関数 fputc() および ferror() だけに依存します。関数 _printf() および
_fprintf() は、浮動小数点値をフォーマットできない点を除き、printf() および
fprintf() と同じです。
_printf(...) 形式の標準出力関数は、以下と等価です。
fprintf(& __stdout, ...)
上記の __stdout は __FILE タイプです。
scanf ファミリ
scanf() ファミリは、scanf() および fscanf() で構成されます。これらの関数は、
関数 fgetc()、__FILE、__backspace() だけに依存します。
標準入力形式 scanf(...) は、以下と等価です。
fscanf(& __stdin, ...)
上記の __stdin は __FILE タイプです。
fwrite()、
、fputs、
、puts
__FILE のユーザバージョンと、fputc() および ferror() 関数、__stdout オブジェ
クトを定義する場合は、printf() ファミリの全てを使用することが可能であり、
fwrite()、fputs()、puts() はライブラリにあるものを変更せずに使用します。
P. 4-76 例 4-19 は、この方法を示しています。実ファイル処理を必要とする場合は、シ
ステムルーチンを修正することを検討して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-75
C および C++ ライブラリ
例 4-19 printf() および __FILE
#include <stdio.h>
struct __FILE {
int handle;
/* Whatever you need here (if the only files you are using
is the stdoutput using printf for debugging, no file
handling is required) */
};
FILE __stdout;
int fputc(int ch, FILE *f)
{
/* Your implementation of fputc */
return ch;
}
int ferror(FILE *f)
{
/* Your implementation of ferror */
return EOF;
}
void test(void)
{
printf("Hello world\n"); /* This works ... */
}
デフォルトでは、fread() と fwrite() は ARM ストリーム実装の一部である高速ブ
ロック I/O 関数の全てを呼び出します。ARM ストリーム実装を使用する代わりにユー
ザ __FILE 構造を定義すると、fread() と fwrite() はブロック I/O 関数を呼び出す
代わりに fgetc() を呼び出します。\Examples\Embedded\embed\retarget.c に
収録されている実装も参照して下さい。
fread()、
、fgets()、
、gets()
関数 fread()、fgets()、gets() は、fgetc() と ferror() にわたるループとし
て実装されます。それぞれが FILE 引数を不透明に使用します。
__FILE、
(gets() の)__stdin、fgetc()、ferror() のユーザ実装を定義する場合
は、これらの関数をライブラリから直接使用することができます。
4-76
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.10.2
ターゲット依存 I/O サポート関数
rt_sys.h は、タイプ FILEHANDLE を定義しています。FILEHANDLE の値は
_sys_open() によって戻され、ホストシステム上のオープンファイルを識別します。
表 4-15 は、ターゲット依存 I/O 関数と、これらのライブラリメンバを示しています。
表 4-15 I/O サポート関数
関数
説明
_sys_open()
P. 4-78「_sys_open()」参照
_sys_close()
P. 4-78「_sys_close()」参照
_sys_read()
P. 4-82「_sys_seek()」参照
_sys_write()
P. 4-80「_sys_write()」参照
_sys_seek()
P. 4-79「_sys_read()」参照
_sys_ensure()
P. 4-81「_sys_ensure()」参照
_sys_flen()
P. 4-81「_sys_flen()」参照
_sys_istty()
P. 4-82「_sys_istty()」参照
_sys_tmpnam()
P. 4-83「_sys_tmpnam()」参照
_sys_command_string()
P. 4-83「_sys_command_string()」参照
これらの関数のデフォルト実装はセミホスティングされます。つまり、どの関数もセ
ミホスティング SWI を使用します。いずれかの関数を再定義する場合は、全てのスト
リームサポート関数を再定義する必要があります。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-77
C および C++ ライブラリ
4.10.3
_sys_open()
この関数はファイルを開きます。
構文
FILEHANDLE _sys_open(const char *name, int openmode)
実装
_sys_open関数はfopen()およびfreopen()によって要求されます。同様にこれら2
つの関数は、何らかのファイル I/O 関数が使用されれるときに要求されます。
openmode パラメータはビットマップであり、このビットはほぼ ANSI モード仕様に直
接対応しています。詳細については rt_sys.h を参照して下さい。ターゲット依存の
拡張は可能ですが、その場合は freopen() も拡張する必要があります。
戻り値
エラー発生時の戻り値は -1 です。
4.10.4
_sys_close()
この関数は、前に _sys_open() で開かれたファイルを閉じます。
構文
int _sys_close(FILEHANDLE fh)
実装
何らかの I/O 関数を使用する場合は、この関数を定義する必要があります。
戻り値
処理に成功したときの戻り値は0です。
非ゼロの値はエラーが発生したことを示します。
4-78
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.10.5
_sys_read()
この関数は、ファイルの内容をバッファに読み出します。
構文
int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode)
実装
mode 引数は、_sys_write() の場合と同様に、
fh に接続されたファイルの状態を記述
するビットマップです。
戻り値
以下のいずれかの値を戻します。
ARM DUI0067DJ-00
•
読み出されなかった文字の数(つまり、len - result が読み出されたことを示
します)
•
エラー通知
•
EOF インジケータ。EOF を通知するとき、正常な結果であれば 0x80000000 が
設定されます。ターゲット非依存コードは、以下のどちらでも処理することが可
能です。
初期 EOF
ファイルからの最後の読み出しによって、EOF インジケー
タに加えて数文字が戻されます。
後期 EOF
最後の読み出しによって EOF だけが戻されます。
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-79
C および C++ ライブラリ
4.10.6
_sys_write()
_sys_open() で前に開いたファイルに、バッファの内容を書き込みます。
構文
int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
実装
mode パラメータは、バイナリファイルであるかどうかや、バッファリングの方法など、
fh に接続されたファイルの状態を記述するビットマップです。ファイルが端末装置に
接続されている場合には、その機器をロウで使用するかどうか(例えば、その端末入
力をエコーする必要があるかどうか)をこのモードビットが指定するため、これらの
ビットが重要な意味を持つ場合があります。ユーザアクセス可能なモードビットの定
義については、stdio.h に保存されている _IOxxx 定数を参照して下さい。
_sys_write() のデフォルトセミホスティング実装は、mode パラメータを渡しませ
ん。これは SYS_WRITE (0x05) セミホスティング SWI がこのパラメータを必要とし
ないためです。C ライブラリを再ターゲットする場合は mode パラメータが必要であ
り、sys_io.o を再実装する必要があります。
戻り値
以下のどちらかの値が戻されます。
4-80
•
書き込まれなかった文字数を表す正の数(つまり、非ゼロの戻り値は何らかの障
害があることを意味します)
•
エラーを示す負の数
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.10.7
_sys_ensure()
この関数は、ファイルハンドルに関連付けられたバッファをフラッシュします。
構文
int _sys_ensure(FILEHANDLE fh)
実装
_sys_ensure() への呼び出しによって、ファイルハンドル fh に関連付けられた全て
のバッファがフラッシュされ、これよってファイルが補助記憶媒体上で更新されます。
戻り値
エラー発生時には負の結果が戻されます。
4.10.8
_sys_flen()
この関数は、ファイルの現在の長さを戻します。
構文
long _sys_flen(FILEHANDLE fh)
実装
_sys_seek()の要求通りにfseek(, SEEK_END)を(, SEEK_SET)に変換するには、
この関数が必要です。
ファイルの終わりと相対的な検索を直接サポートしていない基礎システムで fseek()
を使用する場合は、_sys_flen() を定義する必要があります。この基礎システムが
ファイルの終わりと相対的な検索を実行できる場合は、_sys_flen() を使用しないよ
うに fseek() を定義することができます。
戻り値
この関数は、ファイル fh の現在の長さ、あるいは負のエラーインジケータを戻します。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-81
C および C++ ライブラリ
4.10.9
_sys_seek()
この関数は、ファイルの先頭からのオフセット pos にファイルポインタを配置します。
構文
int _sys_seek(FILEHANDLE fh, long pos)
実装
この関数は、現在の読み出し / 書き込み位置に、現在のファイル fh の先頭に相対する
新しい位置 pos を設定します。
戻り値
エラーが発生しなければ負以外の結果を、エラーが発生した場合は負の結果を戻します。
4.10.10
_sys_istty()
この関数は、ファイルハンドルが端末を識別するかどうかを決定します。
構文
int _sys_istty(FILE *f)
実装
ファイルが端末装置に接続されている場合、この関数はデフォルトで(set(v)buf へ
の呼び出しがない場合に)バッファリングなしの動作を実行し、検索を禁止するため
に使用されます。
戻り値
以下の値が戻されます。
4-82
0
インタラクティブな装置が存在しないとき
1
インタラクティブな装置が存在するとき
その他
エラー発生時
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.10.11
_sys_tmpnam()
この関数は、一時ファイルのファイル番号 fileno を、tmp0001 などの一意のファイ
ル名に変換します。
構文
void _sys_tmpnam(char *name, int fileno, unsigned maxlength)
実装
tmpnam()またはtmpfile()を使用するときは、この関数を定義する必要があります。
戻り値
ファイル名を name に戻します。
4.10.12
_sys_command_string()
この関数は、現在のアプリケーションを呼び出した環境から、そのアプリケーション
を呼び出すために使用されるコマンドラインを検索します。
構文
char *_sys_command_string(char *cmd, int len)
上記において:
cmd
コマンドラインのストアに使用可能なバッファへのポインタを指定しま
す。コマンドラインを cmd にストアする場合は必要ありません。
len
バッファの長さを指定します。
実装
この関数は、main() に渡す argv および argc を設定する目的で、ライブラリ起動
コードによって呼び出されます。
戻り値
この関数は以下のどちらかを戻す必要があります。
•
正常に処理された場合は、コマンドラインへのポインタ。このポインタは、バッ
ファが使用されているときは cmd バッファへのポインタ、コマンドラインがバッ
ファ以外にストアされる場合はその場所へのポインタとなります。
•
処理に失敗した場合は、NULL
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-83
C および C++ ライブラリ
4.11
その他の C ライブラリ関数のカスタマイズ
以下の ANSI 標準関数の実装は、ターゲットオペレーティングシステムに全面的に依存
します。以下に示す関数で、ライブラリによって内部で使用されるものはありません。
したがって、以下のいずれかの関数が実装されていなければ、その関数を呼び出すア
プリケーションだけが実行に失敗します。
表 4-16 は、ターゲット依存 ANSI C ライブラリ関数を示しています。
表 4-16 ANSI C ライブラリ関数
関数
説明
clock() および _clock_init()
P. 4-85「clock()」、P. 4-85「_clock_init()」
参照
time()
P. 4-86「time()」参照
remove()
P. 4-86「remove()」参照
rename()
P. 4-87「rename()」参照
system()
P. 4-87「system()」参照
getenv()
P. 4-88「getenv()」参照
__getenv_init()
P. 4-88「_getenv_init()」参照
これらの関数のデフォルト実装はセミホスティングされます。つまり、どの関数もセ
ミホスティング SWI を使用します。
clock() および _clock_init() は、両方とも再実装するか、さもなければ両方とも
再実装してはなりません。
4-84
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.11.1
clock()
time.h に保存されている標準 C ライブラリクロック関数です。
構文
clock_t clock(void)
実装
clock_t() の単位がデフォルトのセンチ秒と異なる場合には、コンパイラコマンドラ
イン上で、あるいは作成したヘッダファイル内で __CLK_TCK を定義する必要がありま
す。この定義に含まれる値が CLK_TCK と CLOCKS_PER_SEC に使用されます(センチ
秒のデフォルト値は 100 です)。clock() を再実装する場合は、_clock_init() も
再実装する必要があります。
戻り値
符号なし整数が戻されます。
4.11.2
_clock_init()
clock() のオプションの初期化関数です。
構文
__weak void _clock_init(void)
実装
clock() を読み出し専用タイマに対して機能させる必要がある場合は、クロック初期
化関数を使用する必要があります。_clock_init() を実装すると、この関数はライ
ブラリ初期化コードから呼び出されます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-85
C および C++ ライブラリ
4.11.3
time()
time.h に保存されている標準 C ライブラリ time() 関数です。
構文
time_t time(time_t *timer)
戻り値は、現在の暦時間の近似値となります。
戻り値
暦時間を使用できない場合は (time_t*)-1 の値が戻されます。タイマが NULL ポイ
ンタでない場合は、戻り値が time_t* にも割り当てられます。
4.11.4
remove()
stdio.h に保存されている標準 C ライブラリ remove() 関数です。
構文
int remove(const char *filename)
実装
remove() により、
filename が指すストリングの名前が付いたファイルが削除されま
す。このファイルをもう一度作成しない限り、それ以降のこのファイルを開こうとする
試みは失敗します。ファイルが開いているときのこの削除関数の動作は実装定義です。
戻り値
処理に成功するとゼロを、失敗すると非ゼロを戻します。
4-86
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.11.5
rename()
stdio.h に保存されている標準 C ライブラリ rename() 関数です。
構文
int rename(const char *old, const char *new)
実装
rename() により、old が指すストリングの名前が付いたファイルは、それ以降 new が
指すストリングの名前で認識されます。old が指すファイルは事実上削除されます。
new が指すストリングによって命名されたファイルが、この再命名関数の呼び出し前に
存在していた場合、この関数の動作は実装定義です。
戻り値
処理に成功するとゼロを、失敗すると非ゼロを戻します。非ゼロが戻され、かつその
ファイルが以前に存在していた場合には、このファイルは元の名前で認識されます。
4.11.6
system()
stdlib.h に保存されている標準 C ライブラリ system() 関数です。
構文
int system(const char *string)
実装
system()は、stringが指すストリングを、実装定義方式でコマンドプロセッサによっ
て実行されるようにホスト環境に渡します。string に NULL ポインタを使用して、コ
マンドプロセッサの有無を照会することができます。
戻り値
引数が NULL ポインタのとき、コマンドプロセッサが使用可能である場合にはこのシ
ステム関数が非ゼロを戻します。
引数が NULL ポインタ以外のときは、このシステム関数は実装定義の値を戻します。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-87
C および C++ ライブラリ
4.11.7
getenv()
stdlib.h に保存されている標準 C ライブラリ getenv() 関数です。
構文
char *getenv(const char *name)
実装
この関数のデフォルト実装は、使用できる環境情報がないことを示す NULL を戻しま
す。getenv() はユーザ自身で再実装することが可能です。この関数が依存する他の
関数はなく、他の関数もこの関数に依存しません。
この関数を再定義する場合は、C ライブラリの初期化時、つまり main() に入る前にラ
イブラリ初期化コードが呼び出す関数 _getenv_init() を呼び出すことも可能です。
この関数は、ホスト環境から与えられた環境リストから、name が指すストリングと
マッチするストリングを検索します。環境名セットと環境リスト変更方法は、実装定
義です。
戻り値
マッチしたリストメンバに関連付けられたストリングへのポインタが戻されます。こ
のポインタが指す配列はプログラムによって修正することはできませんが、その後の
getenv() への呼び出しによって上書きされる可能性があります。
4.11.8
_getenv_init()
この関数により、ユーザバージョンの getenv() を自ら初期化させることができます。
構文
void _getenv_init(void)
実装
この関数が定義されている場合は、C ライブラリの初期化時、つまり main() に入る
前に、C ライブラリ初期化コードがこの関数を呼び出します。
4-88
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.12
リアルタイム除算の選択
ARM ライブラリに含まれている除算ヘルパ関数は、全体的に良好なパフォーマンスを
実現します。しかし、除算の実行にかかる時間は入力値によって変化します。4 ビット
の商を得るには 12 サイクルしか必要ありませんが、32 ビットの商を得るには 96 サイ
クルが必要となります。アプリケーションによっては、平均パフォーマンスが多少低
下しても、速いワーストケースサイクル数を要求する場合があります。このため、ARM
ライブラリには 2 つの除算ルーチンが含まれています。
このリアルタイムルーチンは:
•
常に 45 サイクル未満で実行します。
•
•
•
•
•
大きな商を求めるときは、標準除算ヘルパルーチンよりも実行速度が向上します。
典型的な商を求めるときは、標準除算ヘルパルーチンよりも実行速度が低下し
ます。
同じ結果を戻します。
ゼロによる除算では、同じエラー通知メカニズムを呼び出します。
周辺コードの変更を必要としません。
総体的に効率性の高いルーチンを使用するのではなく、リアルタイム除算ルーチンを
選択する場合には、以下のどちらかを使用して下さい。
•
IMPORT __use_realtime_division(アセンブリ言語の場合)
•
#pragma import(__use_realtime_division)(C の場合)
注
リアルタイム除算ルーチンは CLZ 命令と DSP 乗算を使用するため、ARM アーキテク
チャ v5TE 以上のアーキテクチャでのみ機能します。__use_realtime_division を
参照し、これらをサポートしていないコアを対象としてコンパイルとリンクを行うと、
リンカは以下に似たエラーメッセージを表示します。
Error: L6218E: Undefined symbol
__realtime_division_only_works_on_architecture_5E__
(referred from myobj.o)
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-89
C および C++ ライブラリ
4.13
ISO 実装定義
このセクションでは、ライブラリがどのように ANSI 仕様の要件を満たしているかにつ
いて説明します。
4.13.1
ANSI C ライブラリ実装定義
ANSI C ライブラリのバリアント一覧は、P. 4-104
「ライブラリ命名規則」で示しています。
ANSI 仕様では一部の定義が実装者に委ねられていますが、その実装情報の文書化が義
務づけられています。このセクションでは、その実装情報を記載します。
•
マクロ NULL は整数定数 0 に拡張します。
•
プログラムが予約されている外部識別子を再定義すると、プログラムが標準ライ
ブラリにリンクされるときにエラーが発生する可能性があります。プログラムが
標準ライブラリにリンクされない場合は、エラーは診断されません。
•
assert() 関数は以下のメッセージを印字して、abort() 関数を呼び出します。
*** assertion failed: expression, file _FILE_, line _LINE_
以下の関数は、EOF(-1)~ 255(255 を含む)の文字値のテストを実行します。
4-90
•
isalnum()
•
isalpha()
•
iscntrl()
•
islower()
•
isprint()
•
isupper()
•
ispunct()
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
数学関数
表 4-17 は、範囲外の引数が渡されたときの数学関数の応答を示しています。
表 4-17 数学関数
ARM DUI0067DJ-00
関数
条件
戻り値
エラー番号
acos(x)
abs(x) > 1
QNaN
EDOM
asin(x)
abs(x) > 1
QNaN
EDOM
atan2(x,y)
x =0, y = 0
QNaN
EDOM
atan2(x,y)
x = Inf, y = Inf
QNaN
EDOM
cos(x)
x=Inf
QNaN
EDOM
cosh(x)
オーバフロー
+Inf
ERANGE
exp(x)
オーバフロー
+Inf
ERANGE
exp(x)
アンダーフロー
+0
ERANGE
fmod(x,y)
x=Inf
QNaN
EDOM
fmod(x,y)
y = 0
QNaN
EDOM
log(x)
x < 0
QNaN
EDOM
log(x)
x = 0
-Inf
EDOM
log10(x)
x < 0
QNaN
EDOM
log10(x)
x = 0
-Inf
EDOM
pow(x,y)
オーバフロー
+Inf
ERANGE
pow(x,y)
アンダーフロー
0
ERANGE
pow(x,y)
x=0 or x=Inf, y=0
+1
EDOM
pow(x,y)
x=+0, y<0
-Inf
EDOM
pow(x,y)
x=-0,
y<0 and y integer
-Inf
EDOM
pow(x,y)
x= -0,
y<0 and y noninteger
QNaN
EDOM
pow(x,y)
x<0, y noninteger
QNaN
EDOM
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-91
C および C++ ライブラリ
表 4-17 数学関数(続き)
数学関数(続き)
関数
条件
戻り値
エラー番号
pow(x,y)
x=1, y=Inf
QNaN
EDOM
sqrt(x)
x < 0
QNaN
EDOM
sin(x)
x=Inf
QNaN
EDOM
sinh(x)
オーバフロー
+Inf
ERANGE
tan(x)
x=Inf
QNaN
EDOM
atan(x)
SNaN
SNaN
なし
ceil(x)
SNaN
SNaN
なし
floor(x)
SNaN
SNaN
なし
frexp(x)
SNaN
SNaN
なし
ldexp(x)
SNaN
SNaN
なし
modf(x)
SNaN
SNaN
なし
tanh(x)
SNaN
SNaN
なし
HUGE_VALはInfのエイリアスです。このエラー番号はerrno変数を調べることで確認
できます。P. 4-91 表 4-17 が示すケース以外では、全ての関数が QNaN を渡されれば
QNaN を戻し、SNaN を渡されれば無効演算例外をスローします。
4-92
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
シグナル関数
表 4-18 のシグナルは、signal() 関数によってサポートされています。C ライブラリ
および C++ ライブラリに使用されるシグナルについては、P. 4-54 表 4-10 を参照して下
さい。
表 4-18 シグナル関数のシグナル
シグナル
番号
説明
追加引数
SIGABRT
1
アボート
なし
SIGFPE
2
算術例外
{FE_EX_INEXACT,
FE_EX_UNDERFLOW,
FE_EX_OVERFLOW,
FE_EX_DIVBYZERO,
FE_EX_INVALID,
DIVBYZERO} からのビット
セット
SIGILL
3
不正命令
なし
SIGINT
4
ユーザからのアテンション なし
要求
SIGSEGV
5
不良メモリアクセス
なし
SIGTERM
6
終了要求
なし
SIGSTAK
7
スタックオーバフロー
なし
SIGRTRED
8
ランタイムライブラリ I/O 標準ストリームへの転送を
目的として再度開かれた
ストリームでの転送障害
ファイルまたはデバイスの
名前
SIGRTMEM
9
ヒープ空間外
失敗した要求のサイズ
SIGUSR1
10
ユーザ定義
ユーザ定義
SIGUSR2
11
ユーザ定義
ユーザ定義
SIGPVFN
12
C++ からの純仮想関数の呼 び出し
SIGCPPL
13
C++ からの例外
-
reserved
14-31
予約
予約
other
> 31
ユーザ定義
ユーザ定義
SIGUSR2 よりも大きいシグナル番号は __raise() を介して渡し、デフォルトのシグナ
ルハンドラで捕捉することができますが、signal() を使用して登録したハンドラで
捕捉することはできません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-93
C および C++ ライブラリ
SIGUSR2 よりも大きなシグナル番号のハンドラを登録しようとすると、signal() が
エラーコードを戻します。
認識可能な全てのシグナルのデフォルト処理は、診断メッセージを印字して、exit()
を呼び出すことです。このデフォルト動作は、変更するまでプログラム起動時に適用
されます。
注意
浮動小数点処理に関する IEEE 754 規格では、例外に対するデフォルトの応答は、トラッ
プを発生させずに処理を続行することと定義されています。デフォルトでは、浮動小
数点計算で発生した例外によって SIGFPE が生成されることはありません。fp エラー処
理は、fenv.h 内の関数と定義をカスタマイズすることによって修正できます。P. 4-50
「エラー通知、エラー処理、プログラム終了のカスタマイズ」、第 5 章「浮動小数点サ
ポート」、ならびに ADS デベロッパガイドの浮動小数点の章を参照して下さい。
P. 4-93 表 4-18 の全てのシグナルにおいて、シグナルが発生したときに、そのハンドラ
が関数を指していれば、そのハンドラが呼び出される前に signal(sig, SIG_DFL)
と等価な演算が実行されます。
signal() 関数に指定されたハンドラが SIGILL シグナルを受け取ると、デフォルト処
理がリセットされます。
I/O 特性
汎用 ARM C ライブラリには以下の I/O 特性があります。
4-94
•
テキストストリームの最終行には、終了復帰改行文字は必要ありません。
•
復帰改行文字直前にテキストストリームに書き出されたスペース文字は、もう一
度読み込まれたときにも出現します。
•
バイナリ出力ストリームには NULL 文字は追加されません。
•
追加モードストリームのファイル位置インジケータは、最初はファイルの終わり
に配置されます。
•
テキストストリームへの書き込みが関連ファイルのデバイスカテゴリの動作で
ある場合は、関連ファイルでこの書き込みが発生した位置から先が切り落とされ
ます。
•
ファイルバッファリング特性は、ANSI C 規格のセクション 4.9.3 に準拠していま
す。セミホスティングが使用されている場合は、開けるファイルの最大数が使用
可能なターゲットメモリによって制限されます。
•
出力ストリームによって何も文字が書き込まれないゼロ長ファイルが存在しま
す。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
•
ファイルを読み出す場合は何度でも開くことができますが、書き込みまたは更新
の場合は 1 度しか開けません。1 つのファイルを、1 つのストリームで読み出し、
別のストリームで書き込みまたは更新するといったように同時に開くことはで
きません。
•
ローカルタイムゾーンとサマータイムは実装されていません。戻り値は、これら
の情報がないことを示します。例えば、gmtime() 関数は必ず NULL を戻します。
•
exit() が戻すステータスは、これに渡された値と同じです。EXIT_SUCCESS お
よび EXIT_FAILURE の定義については、ヘッダファイル stdlib.h を参照して
下さい。ただし、セミホスティング SWI はステータスを実行環境に渡しません。
•
strerror() 関数が戻すエラーメッセージは、perror() 関数が戻すメッセー
ジと同じです。
•
要求されたエリアのサイズが 0 のとき、calloc()、malloc()、realloc() は
NULL を戻します。
•
abort() は開いている全てのファイルを閉じ、全ての一時ファイルを削除しま
す。
•
fprintf() は、精度に 8 が指定されているかのように、%p 引数を小文字の 16
進数形式で印字します。バリアント形式(%#p)が使用されている場合は、数値
の前に @ 文字が付きます。
•
fscanf() は、%p 引数を %x 引数と全く同じように処理します。
•
fscanf() は、%...[...] 引数内の文字 "-" を必ずリテラル文字として処理し
ます。
•
ftell()およびfgetpos()は、障害発生時にEDOMの値をerrnoに設定します。
•
perror() は、表 4-19 が示すメッセージを生成します。
表 4-19 perror() メッセージ
ARM DUI0067DJ-00
エラー
メッセージ
0
No error (errno = 0)
EDOM
EDOM - function argument out of range
ERANGE
ERANGE - function result not representable
ESIGNUM
ESIGNUM - illegal signal number
その他
Unknown error
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-95
C および C++ ライブラリ
ANSI 準拠の実装では指定することが要求されている以下の特性は、ARM C ライブラ
リでは指定されていません。
•
ファイル名の妥当性
•
remove() が開いているファイルを削除するかどうか
4.13.2
•
新しい名前が既に存在するときに、rename() 関数を呼び出したときの作用
•
•
getenv() を呼び出したときの作用
(デフォルトは NULL に復帰することであり、
使用できる値はありません)
system() 呼び出したときの作用
•
clock() によって戻される値
標準 C++ ライブラリ実装定義
このセクションでは、C++ ライブラリの実装について説明します。ARM C++ ライブラ
「ISO/IEC 14822 :1998 International Standard for
リは、後述するいくつかの制約を除き、
C++
(C++ の国際標準規格)」で定義されているライブラリの全てを備えています。Rogue
Wave C++ ライブラリで定義されている実装定義の動作については、付属の Rogue Wave
HTML 文書を参照して下さい。この文書はデフォルトで install_directory\HTML
にインストールされます。
標準 C++ ライブラリはバイナリ形式のみの提供となっています。
表 4-20 は、C++ ライブラリが C ライブラリに課す要件を示しています。
表 4-20 C ライブラリに対する C++ の要件
4-96
ファイル
C ライブラリで必要とされる関数
ctype.h
isalnum(), isalpha(), iscntrl(), isdigit(), isgraph(), islower(), isprint(),
ispunct(), isspace(), isupper(), isxdigit(), tolower(), toupper()
locale.h
localeconv(), setlocale()
math.h
acos(), asin(), atan2(), atan(), ceil(), cos(), cosh(), exp(), fabs(), floor(),
fmod(), frexp(), ldexp(), log10(), log(), modf(), pow(), sin(), sinh(), sqrt(),
tan(), tanh()
setjmp.h
longjmp()
signal.h
raise(), signal()
stdio.h
clearerr(), fclose(), feof(), ferror(), fflush(), fgetc(), fgetpos(), fgets(),
fopen(), fprintf(), fputc(), fputs(), fread(), freopen(), fscanf(), fseek(),
fsetpos(), ftell(), fwrite(), getc(), getchar(), gets(), perror(), printf(),
putc(), putchar(), puts(), remove(), rename(), rewind(), scanf(), setbuf(),
setvbuf(), sprintf(), sscanf(), tmpfile(), tmpnam(), ungetc(), vfprintf(),
vprintf(), vsprintf()
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
表 4-20 C ライブラリに対する C++ の要件(続き)
の要件(続き)
ファイル
C ライブラリで必要とされる関数
stdlib.h
abort(), abs(), atexit(), atof(), atoi(), atol(), bsearch(), calloc(), div(),
exit(), free(), getenv(), labs(), ldiv(), malloc(), mblen(), qsort(), rand(),
realloc(), srand(), strtod(), strtol(), strtoul(), system()
string.h
memchr(), memcmp(), memcpy(), memmove(), memset(), memset(), strcat(),
strchr(), strcmp(), strcoll(), strcpy(), strcspn(), strerror(), strlen(),
strncat(), strncmp(), strncpy(), strpbrk(), strrchr(), strspn(), strstr(),
strtok(), strxfrm()
time.h
asctime(), clock(), ctime(), difftime(), mktime(), strftime(), time()
表 4-21 は、本リリースにはない最も重要な機能を示しています。
表 4-21 標準 C++ ライブラリの相違点
標準
実装における相違点
ワイド文字
タイプとして独立していません。wchar_t は、unsigned
short の暗黙の typedef です。文字は 8 ビット幅です。
ネーム空間
サポートされていません。全てのトップレベル項目は、グ
ローバルネーム空間内にあります。
未実装機能
class bad_castなど、未実装言語機能のサポート関数は恐
らく機能しません。
ロケール
ロケールメッセージファセットはサポートされていません。
ARM C ライブラリは nl_types.h を介した catopen と
catclose をサポートしていないため、ランタイムにカタロ
グを開くことはできません。リンク時には、2 つのロケール
定義のうちの 1 つを選択できます。他のロケールはユーザ再
定義可能な関数で作成することができます。
タイムゾーン
サポートされていません。ARM C ライブラリはこれをサポー
トしていません。
複雑デフォルトテンプ サポートされていません。複雑デフォルトテンプレート引数
レート引数
とは、タイプパラメータが前のタイプパラメータに関連する
デフォルトの例示を持っていることを指します。標準で、複
雑デフォルト(クラスキューの例示など)で定義されること
が規定されているテンプレートを要求するときは、各テンプ
レートパラメータの値を指定する必要があります。デフォル
トは存在しません。
ARM DUI0067DJ-00
例外
サポートされていません。
typeinfo
サポートが制限されています。typeinfo は、ARM C++ ライブ
ラリ追加関数によって基本的な方法でサポートされます。
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-97
C および C++ ライブラリ
4.14
C ライブラリ拡張
このセクションでは、C99 規格原案(ISO/IEC 9899:1999E)で定義されている ARM 固
有のライブラリの拡張および関数について説明します。表 4-22 は、ライブラリ拡張の
一覧を示しています。
表 4-22 拡張
4.14.1
関数
ヘッダファイル
拡張
の定義
atoll()
stdlib.h
C99 規格原案
P. 4-99「strtoll()」
stdlib.h
C99 規格原案
P. 4-99「strtoull()」
stdlib.h
C99 規格原案
P. 4-99「snprintf()」
stdio.h
C99 規格原案
P. 4-100「vsnprintf()」
stdio.h
C99 規格原案
P. 4-100「lldiv()」
stdlib.h
C99 規格原案
P. 4-100「llabs()」
stdlib.h
C99 規格原案
P. 4-101「alloca()」
alloca.h
C99 およびその他
P. 4-101「_fisatty()」
stdio.h
ARM 固有
P. 4-101「__heapstats()」
stdlib.h
ARM 固有
P. 4-103「__heapvalid()」
stdlib.h
ARM 固有
atoll()
atoll() 関数は、ANSI 関数 atol() および atoi() と同じように、10 進ストリング
を整数に変換しますが、結果は long long を戻します。atoi() のように、ストリン
グが 0 または 0x で始まる場合には、atoll() は 8 進または 16 進入力を受け付けるこ
とができます。
構文
long long atoll(const char *nptr)
4-98
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.14.2
strtoll()
strtoll() 関数は、ANSI 関数 strtol() と同じように、任意の基数のストリングを
整数に変換しますが、結果は long long を戻します。strtol() のように、パラメー
タ endptr は変換されたストリングの終わりを指すポインタをストアする位置を指す
か、もしくは NULL にできます。パラメータ base は、基数を保持する必要がありま
す。base にゼロを設定すると、その基数が atoll() と同じ方法で選択されます。
構文
long long strtoll(const char *nptr, char **endptr, int base)
4.14.3
strtoull()
strtoull() は strtoll() と全く同じですが、unsigned long long を戻します。
構文
unsigned long long strtoull(const char *nptr, char **endptr,
int base)
4.14.4
snprintf()
snprintf() は、呼び出し元がバッファの最大サイズを指定できることを除けば、ANSI
sprintf() 関数とほぼ全く同じように機能します。戻り値は、バッファ容量が十分に
大きいときに書き込まれる、完全にフォーマットされたストリングの長さです。した
がって、戻り値がゼロ以上かつ n-1 以下の場合にのみ、バッファに完全なストリング
が書き込まれます。
bufsize パラメータは、終了 NULL を含め、この関数が書き込める buffer の文字数を
指定します。
<stdio.h> は ANSI ヘッダファイルですが、この関数は ANSI C ライブラリ標準では許
可されていません。したがって、コンパイラに -strict オプションを使用する場合
は、この関数は使用できません。
構文
int snprintf(char *buffer, size_t bufsize,
const char *format, ...)
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-99
C および C++ ライブラリ
4.14.5
vsnprintf()
vsnprintf() は、呼び出し元がバッファの最大サイズを指定できることを除けば、
ANSI vsprintf() 関数とほぼ全く同じように機能します。戻り値は、バッファ容量が
十分に大きいときに書き込まれる、完全にフォーマットされたストリングの長さです。
したがって、戻り値がゼロ以上かつ n-1 以下の場合にのみ、バッファに完全なストリ
ングが書き込まれます。
bufsize パラメータは、終了 NULL を含め、この関数が書き込める buffer の文字数を
指定します。
<stdio.h> は ANSI ヘッダファイルですが、この関数は ANSI C ライブラリ標準では許
可されていません。したがって、コンパイラに -strict オプションを使用する場合
は、この関数は使用できません。
構文
int vsnprintf(char *buffer, size_t bufsize,
const char *format, va_list ap)
4.14.6
lldiv()
lldiv 関数は、2 つの long long 整数の除算を実行し、商と剰余の両方を戻します。
この関数は、ANSI 関数 ldiv の long long バージョンです。復帰タイプ lldiv_t は、
quot および rem と呼ばれる 2 つの long long メンバから構成される構造体です。
<stdlib.h>はANSIヘッダファイルですが、この関数はANSI Cライブラリ標準では許
可されていません。したがって、コンパイラに -strict オプションを使用する場合
は、この関数は使用できません。
構文
lldiv_t lldiv(long long num, long long denom)
4.14.7
llabs()
llabs() は、その入力の絶対値を戻します。この関数は ANSI 関数 labs の long long
バージョンです。
<stdlib.h>はANSIヘッダファイルですが、この関数はANSI Cライブラリ標準では許
可されていません。したがって、コンパイラに -strict オプションを使用する場合
は、この関数は使用できません。
構文
long long llabs(long long num)
4-100
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
4.14.8
alloca()
alloca() 関数は、関数内にローカル記憶域を割り当てます。この関数は、size バイ
トのメモリへのポインタを戻すか、使用可能な十分なメモリがない場合には NULL を戻
します。デフォルト実装では、8 バイト境界整列のメモリブロックを戻します。
alloca() から戻されたメモリは、決して free() に渡してはなりません。代わりに、
alloca() を呼び出した関数が戻ると、このメモリが自動的に割り当て解除されます。
alloca() を関数ポインタを介して呼び出すことはできません。setjmp() と
longjmp() の呼び出しの間で alloca() によって割り当てられるメモリは、
longjmp() への呼び出しによって割り当て解除されるため、同一関数内で alloca()
と setjmp() を使用する場合には注意が必要です。
この関数は、多くの C ライブラリに共通する非標準拡張です。
構文
void* alloca(size_t size)
4.14.9
_fisatty()
_fisatty() 関数は、与えられた stdio ストリームが端末装置または通常のファイル
に接続されているかどうかを決定します。この関数は、基本ファイルハンドルに基づ
いて低レベル関数 _sys_istty() を呼び出します(P. 4-74「I/O 関数のカスタマイズ」
参照)。
この関数は ARM 固有ライブラリ拡張です。
構文
int _fisatty(FILE *stream)
戻り値はストリームのデスティネーションを示します。
0
ファイル
1
端末
負
エラー
4.14.10
__heapstats()
__heapstats() 関数は、記憶域割り当てヒープの状態に関する統計データを表示し
ます。この関数が呼び出す __Heap_Stats() 関数は、ユーザ記憶域管理を設定する場
合に再実装することができます(P. 4-64「__Heap_Stats()」参照。この関数の ARM デ
フォルト実装は、存在するフリーブロックの数と、これらの推定サイズ範囲に関する
情報を表示します。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-101
C および C++ ライブラリ
例 4-20 は、__heapstats() からの出力例を示しています。この出力の行 1 には、総
バイト数、フリーブロック数、平均サイズが表示されています。これ以降の行は、各
ブロックのバイト単位の推定サイズを範囲形式で示しています。__heapstats() は、
使用済みブロック数に関する情報は戻しません。
例 4-20 heapstats の出力
32272 bytes in 2 free blocks (avge size 16136)
1 blocks 2^12+1 to 2^13
1 blocks 2^13+1 to 2^14
この関数は、fprintf() のように機能する出力関数 dprint を呼び出すことによって
結果を出力します。dprint に渡される第 1 パラメータは、指定されたポインタ param
です。fprintf() を渡すことはできますが、この場合は正しい関数ポインタタイプに
キャストする必要があります。このタイプは typedef として定義すると簡単です。こ
れを __heapprt と呼びます。例:
__heapstats((__heapprt)fprintf, stderr);
注
出力をまだ送信してないストリームで fprintf() を呼び出すと、ライブラリは内部で
malloc() を呼び出し、そのストリーム用のバッファを作成します。この動作が
__heapstats() への呼び出し中に発生すると、ヒープが破損する恐れがあります。し
たがって、上記の例では stderr に何らかの出力を送信しておく必要があります。
デフォルトの 1 領域メモリモデルを使用する場合、ヒープメモリは必要な量だけが割
り当てられます。つまり、フリーヒープの容量は、メモリの割り当てと割り当て解除
を行うたびに変化します。例えば、以下のようなシーケンスは、
int *ip;
__heapstats((__heapprt)fprintf,stderr);
ip = malloc(200000);
free(ip);
__heapstats((__heapprt)fprintf,stderr);
// print initial free heap size
// print heap size after freeing
以下のような出力を戻します。
4076 bytes in 1 free blocks (avge size 4076)
1 blocks 2^10+1 to 2^11
2008180 bytes in 1 free blocks (avge size 2008180)
1 blocks 2^19+1 to 2^20
この関数は ARM 固有ライブラリ拡張です。
4-102
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
構文
void __heapstats(int (*dprint)( void*param,
char const *format,...), void* param)
4.14.11
__heapvalid()
__heapvalid() 関数は、ヒープの一貫性チェックを実行します。verbose パラメー
タが非ゼロの場合は各フリーブロックに関する詳細情報を出力し、それ以外の場合は
エラーを出力します。
この関数は、fprintf() のように機能する出力関数 dprint を呼び出すことによって
結果を出力します。dprint に渡される第 1 パラメータは、指定されたポインタ param
です。fprintf() を渡すことはできますが、この場合は正しい関数ポインタタイプに
キャストする必要があります。このタイプは typedef として定義すると簡単です。こ
れを __heapprt と呼びます。例:
例 4-21 fprintf() を使用した __heapvalid() の呼び出し
__heapvalid((__heapprt) fprintf, stderr, 0);
出力をまだ送信してないストリームで fprintf() を呼び出すと、ライブラリは内部で
malloc() を呼び出し、そのストリーム用のバッファを作成します。この動作が
__heapvalid() への呼び出し中に発生すると、ヒープが破損する恐れがあります。し
たがって、stderr に何らかの出力を送信しておく必要があります。例 4-21 のコード
は、ストリームへの書き込みが行われていなければ、重大な障害を引き起こします。
この関数は ARM 固有ライブラリ拡張です。
構文
int __heapvalid(int (*dprint)( void*param, char const *format,...), void* param,
int verbose)
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-103
C および C++ ライブラリ
4.15
ライブラリ命名規則
ファイル名から、バリアントがどのようにビルドされたかが以下のように識別されます。
root_<arch><fpu><stack><entrant>.<endian>
名前のフィールドと関連ビルドオプションの値を以下に示します。
4-104
root
c
f
g
m
cpp
cppfp
ANSI C/C++ 基本ランタイムサポート
C/Java における fp 算術演算の丸めおよび例外オプション
fp 算術演算の完全 IEEE 丸めおよび例外オプション
超越数学関数
fp 算術演算を必要としない高レベル C++ 関数
fp 算術演算を必要とする高レベル C++ 関数
arch
a
t
ARM ライブラリ
Thumb ライブラリ(-apcs interworking)
fpu
fm
vp
_m
_p
__
FPA 命令セット使用 (-fpu fpa)
VFP 命令セット使用 (-fpu vfp)
混合エンディアンダブル形式のソフト fp(-fpu softfpa)
ソフト vfp(-fpu softvfp)
浮動小数点命令なし(-fpu none)
stack
u
s
_
ソフトウェアスタックチェックなし(-apcs /noswst)
ソフトウェアスタックチェック使用(-apcs /swst)
なし
entrant
n
e
_
関数リエントラントなし(-apcs /norwpi)
関数リエントラントあり(-apcs /rwpi)
なし
endian
l
b
リトルエンディアン(-li)
ビッグエンディアン (-bi)
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ ライブラリ
C ライブラリの名前:c_{a,t}__{s,u}{e,n}
c_a__se
ARM、スタックチェックあり、リエントラントあり
c_a__sn
ARM、スタックチェックあり、リエントラントなし
c_a__ue
ARM、スタックチェックなし、リエントラントあり
c_a__un
ARM、スタックチェックなし、リエントラントなし(ベース PCS)
c_t__se
Thumb、スタックチェックあり、リエントラントあり
c_t__sn
Thumb、スタックチェックあり、リエントラントなし
c_t__ue
Thumb、スタックチェックなし、リエントラントあり
c_t__un
Thumb、スタックチェックなし、リエントラントなし(ベース PCS)
標準 FPLIB の名前:f_{a,t}[fm, vp, _m, _p]
f_afm
ARM、FPA、混合エンディアンダブル
f_avp
ARM、VFP、純エンディアンダブル
f_a_m
ARM、ソフト FPA、混合エンディアン
f_a_p
ARM、ソフト VFP、純エンディアン
f_a
ARM、-fpu none に使用
f_tfm
Thumb、FPA、混合エンディアンダブル
f_tvp
Thumb、VFP、純エンディアンダブル
f_t_m
Thumb、ソフト FPA、混合エンディアンダブル
f_t_p
Thumb、ソフト FPA、純エンディアンダブル
f_t
Thumb、-fpu none に使用
標準 IEEE の名前:g_{a,t}{fm, vp, _m, _p}
g_afm
ARM、FPA、混合エンディアンダブル
g_avp
ARM、VFP、純エンディアンダブル
g_a_m
ARM、ソフト FPA
g_a_p
ARM、ソフト VFP
g_tfm
Thumb、FPA、混合エンディアンダブル
g_tvp
Thumb、VFP、純エンディアンダブル
g_t_m
Thumb、混合エンディアンダブル
g_t_p
Thumb、純エンディアンダブル
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
4-105
C および C++ ライブラリ
MATHLIB の名前:m_{a,t}{fm, vp, _m, _p}{s,u}
m_afms
ARM、FPA、混合エンディアン、スタックチェックあり
m_afmu
ARM、FPA、混合エンディアン、スタックチェックなし
m_avps
ARM、VFP、純エンディアン、スタックチェックあり
m_avpu
ARM、VFP、純エンディアン、スタックチェックなし
m_a_ms
ARM、ソフト FPA、混合エンディアン、スタックチェックあり
m_a_mu
ARM、ソフト FPA、混合エンディアン、スタックチェックなし
m_a_ps
ARM、ソフト FPA、純エンディアン、スタックチェックあり
m_a_pu
ARM、ソフト FPA、純エンディアン、スタックチェックなし
m_tfms
Thumb、FPA、混合エンディアン、スタックチェックあり
m_tfmu
Thumb、FPA、混合エンディアン、スタックチェックなし
m_tvps
Thumb、VFP、純エンディアン、スタックチェックあり
m_tvpu
Thumb、VFP、純エンディアン、スタックチェックなし
m_t_ms
Thumb、ソフト FPA、混合エンディアン、スタックチェックあり
m_t_mu
Thumb、ソフト FPA、混合エンディアン、スタックチェックなし
m_t_ps
humb、ソフト FPA、純エンディアン、スタックチェックあり
m_t_pu
Thumb、ソフト FPA、純エンディアン、スタックチェックなし
特定のアーキテクチャまたはプロセッサの選択については、P. 2-19「ターゲットプロ
セッサまたはアーキテクチャの指定」を参照して下さい。
4-106
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
第5章
浮動小数点サポート
本章では、ARM の浮動小数点演算サポートについて説明します。本章は以下のセク
ションから構成されています。
•
浮動小数点サポート:P. 5-2
•
•
•
•
ARM DUI0067DJ-00
ソフトウェア浮動小数点ライブラリ:fplib:P. 5-3
浮動小数点環境の制御:P. 5-8
数学ライブラリ:mathlib:P. 5-24
IEEE 754 算術演算:P. 5-30
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-1
浮動小数点サポート
5.1
浮動小数点サポート
ARM 浮動小数点環境は、2 進浮動小数点算術演算に関する IEEE754 標準規格を実装し
たものです。この標準規格の ARM の実装については、P. 5-30「IEEE 754 算術演算」を
参照して下さい。
ARM システムには以下のケースが考えられます。
•
•
•
ベクタ浮動小数点(VFP)コプロセッサ搭載
浮動小数点アクセラレータ(FPA)コプロセッサ搭載
浮動小数点ハードウェアなし
ハードウェアコプロセッサ(VFP または FPA)搭載システムを対象にコンパイルを行
う場合、コンパイラはこれを利用します。コプロセッサ非搭載システムを対象にコン
パイルを行うと、コンパイラはこの計算をソフトウェアで実装します。
例えば、コンパイラオプション -fpu vfp を指定するとハードウェア VFP コプロセッ
サが選択され、オプション -fpu softvfp を指定するとコプロセッサ命令がソフト
ウェアで実装されます。
5-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
5.2
ソフトウェア浮動小数点ライブラリ:fplib
ソフトウェア浮動小数点ライブラリ:
浮動小数点コプロセッサを使用するようにプログラムをコンパイルすると、そのプロ
グラムはターゲットコプロセッサの浮動小数点マシン命令を使用して基本浮動小数点
算術演算(加算、乗算など)を実行します。ソフトウェア浮動小数点を使用するよう
にプログラムをコンパイルするときに、使用可能な浮動小数点命令セットがない場合
には、ARM ライブラリが浮動小数点算術演算を実行するプロシージャコールセットを
与える必要があります。これがソフトウェア浮動小数点ライブラリ fplib です。
このライブラリに含まれるルーチンには、_dadd(2 つの double の加算)や _fdiv
(2 つの float の除算)などの名前が付けられています。これらの関数の一覧表につい
ては、以下を参照して下さい。
•
P. 5-4 表 5-1
•
P. 5-5 表 5-2
•
P. 5-6 表 5-3
•
P. 5-7 表 5-4
ユーザプログラムはこれらのルーチンを直接呼び出すことができます。コプロセッサ
が存在する環境においてもこれらのルーチンは提供されますが、一般的には数命令分
の長さしかありません(適切なコプロセッサ命令を実行するだけであるため)。
fplib に含まれる全てのルーチンは、呼び出し標準のソフトウェア浮動小数点バリアン
トを使用して呼び出されます。つまり、浮動小数点引数は整数レジスタで渡され、戻
されます。プログラムの残りの部分は、そのプログラムがコプロセッサ向けにコンパ
イルされていれば、浮動小数点データが浮動小数点レジスタで渡されます。
したがって、例えば _dadd がレジスタ r0 と r1 にある double を取り、r2 と r3 にある
別の double を取る場合、その合計を r0 と r1 に戻します。
注
レジスタ r0 と r1 が保持する double の場合、この double の上位 32 ビットを保持す
るレジスタは、プログラムがリトルエンディアンかビッグエンディアンかによって異
なります。
C プログラムがレジスタ割り当てを処理する必要はありません。
fplib の全てのルーチンは、ヘッダファイル rt_fp.h 内で宣言されています。fplib ルー
チンを直接呼び出したい場合には、このファイルをインクルードすることができます。
次に fplib ルーチンの一覧を示します。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-3
浮動小数点サポート
5.2.1
特定形式の数値に対する算術演算
表 5-1 のルーチンは、特定形式の数値に対して算術演算を実行します。引数と結果は必
ず同じ形式を取ります。
表 5-1 算術ルーチン
関数
引数タイプ
結果タイプ
演算
_fadd
2 float
float
x + y を戻します。
_fsub
2 float
float
x - y を戻します。
_frsb
2 float
float
y - x を戻します。
_fmul
2 float
float
x × y を戻します。
_fdiv
2 float
float
x ÷ y を戻します。
_frdiv
2 float
float
y ÷ x を戻します。
_frem
2 float
float
x ÷ y の剰余a を戻します。
_frnd
float
float
x を整数に丸めた結果を戻しますb。
_fsqrt
float
float
√ x を戻します。
_dadd
2 double
double
x + y を戻します。
_dsub
2 double
double
x - y を戻します。
_drsb
2 double
double
y - x を戻します。
_dmul
2 double
double
x × y を戻します。
_ddiv
2 double
double
x ÷ y を戻します。
_drdiv
2 double
double
y ÷ x を戻します。
_drem
2 double
double
x ÷ y の剰余 a を戻します。
_drnd
double
double
x を整数に丸めた結果を戻します b。
_dsqrt
double
double
√ x を戻します。
a. IEEE754 剰余演算を実行する関数です。この演算は、2 つの値 x および y を取り、z = x – n * y となるような値 z
を戻すように定義されています(n =整数)。厳密に正確な結果を戻すには、z が x の半分を超えないように n を
選択します(したがって、x と y の両方が正でも、z が負になることがあります)。IEEE 754 剰余関数は、z が常
に x と同じ符号を持つ C ライブラリ関数 fmod が実行する演算とは異なります。上記の仕様で 2 つの n のどちら
かを選択できる場合、偶数の方が選択されます。この動作は、現在の丸めモードとは関係なく発生します。
b. IEEE754 整数への丸め演算を実行する関数です。この演算では、1 つの値を(現在の丸めモードに基づいて)整
数に丸めますが、その整数を C int 変数としてではなく、浮動小数点数値形式で戻します。この数値を int 変
数に変換するには、P. 5-5 表 5-2 に示す _ffix ルーチンを使用する必要があります。
5-4
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
5.2.2
float、
、double、
、int の変換
表 5-2 のルーチンは、long long を除く数値形式間の変換を実行します。
表 5-2 数値形式変換ルーチン
関数
引数タイプ
結果タイプ
_f2d
float
double
_d2f
double
float
_fflt
int
float
_ffltu
unsigned int
float
_dflt
int
double
_dfltu
unsigned int
double
_ffix
float
inta
_ffix_r
float
int
_ffixu
float
unsigned inta
_ffixu_r
float
unsigned int
_dfix
double
inta
_dfix_r
double
int
_dfixu
double
unsigned inta
_dfixu_r
double
unsigned int
a. 現在の丸めモードに関係なく、ゼロに丸められます。これは C 標準によってこの方
法で整数への暗黙の変換を実行することが定義されているためであり、これを実行
するように丸めモードを変更する必要がなく都合がよいためです。各関数には、名
前が _r で終わり、同じ演算を実行する対応する関数がありますが、これらの関数は
現在のモードに従って丸めを実行します。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-5
浮動小数点サポート
5.2.3
longlong と他の数値形式との変換
表 5-3 のルーチンは、long long と他の数値形式との間の変換を実行します。
表 5-3 long long 形式に関連する変換ルーチン
関数
引数タイプ
結果タイプ
_ll_sto_f
long long
float
_ll_uto_f
unsigned long long
float
_ll_sto_d
long long
double
_ll_uto_d
unsigned long long
double
_ll_sfrom_f
float
long longa
_ll_sfrom_f_r
float
long long
_ll_ufrom_f
float
unsigned long longa
_ll_ufrom_f_r
float
unsigned long long
_ll_sfrom_d
double
long longa
_ll_sfrom_d_r
double
long long
_ll_ufrom_d
double
unsigned long longa
_ll_ufrom_d_r
double
unsigned long long
a. 現在の丸めモードに関係なく、ゼロに丸められます。これは C 標準によってこの方
法で整数への暗黙の変換を実行することが定義されているためであり、これを実行
するように丸めモードを変更する必要がなく都合がよいためです。各関数には、名
前が _r で終わり、同じ演算を実行する対応する関数がありますが、これらの関数は
現在のモードに従って丸めを実行します。
5-6
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
5.2.4
浮動小数点の比較
表 5-4 のルーチンは、浮動小数点数間の比較を実行します。
表 5-4 浮動小数点比較ルーチン
関数
引数タイプ
結果タイプ
テストされる条件
_fcmpeq
2 float
フラグ、EQ/NE
x = ya
_fcmpge
2 float
フラグ、HS/LO
x ≧ ya,b
_fcmple
2 float
フラグ、HI/LS
x ≦ ya,b
_feq
2 float
ブール
x=y
_fneq
2 float
ブール
x≠y
_fgeq
2 float
ブール
x ≧ yb
_fgr
2 float
ブール
x > yb
_fleq
2 float
ブール
x ≦ yb
_fls
2 float
ブール
x < yb
_dcmpeq
2 double
フラグ、EQ/NE
x = ya
_dcmpge
2 double
フラグ、HS/LO
x ≧ ya,b
_dcmple
2 double
フラグ、HI/LS
x ≦ ya,b
_deq
2 double
ブール
x=y
_dneq
2 double
ブール
x≠y
_dgeq
2 double
ブール
x ≧ yb
_dgr
2 double
ブール
x > yb
_dleq
2 double
ブール
x ≦ yb
_dls
2 double
ブール
x < yb
a. ARM 条件フラグに結果を戻します。アセンブリ言語では、この方法で条件命令を使用する関数への呼び出しを
直接追跡できるために効率的ですが、これらの関数を C から使用できる方法がなくなることになります。これら
の関数は rt_fp.h では宣言されていません。
b. どちらかの引数が NaN である場合には、クワイエット NaN である場合でも、無効演算例外が発生します。他の
関数は、引数が SnaN である場合にのみ無効演算を発生させます。QNaNs は、他の QNaNs を含むものと比較さ
。
れると「不等」を戻します(そのため、QnaN を同一の QnaN と比較しても「不等」が戻されます)
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-7
浮動小数点サポート
5.3
浮動小数点環境の制御
このセクションでは、ARM 浮動小数点環境の制御に使用できる関数について説明しま
す。これらの関数を使用することにより、丸めモードの変更、例外トラップのイネー
ブル / ディセーブル、ユーザ例外トラップハンドラのインストールが可能になります。
ARM では、互換性と移植性を向上させる目的で、いくつかの異なる浮動小数点環境用
インタフェースを用意しています。
5.3.1
__ieee_status 関数
ARM は、__fp_status 関数に類似した、ステータスワードに対するもう 1 つのイン
タフェースをサポートしていますが、このインタフェースは同じステータスワードを
異なるレイアウトで認識します。この呼び出しは __ieee_status と呼ばれ、VFP の
ステータスワードを修正する場合は最も効率的な関数です。(FPA システムでは
__fp_status がより効率的です。)__ieee_status は fenv.h で定義されています。
__fp_status に類似する __ieee_status のプロトタイプは以下の通りです。
unsigned int __ieee_status(unsigned int mask,
unsigned int flags);
ただし、__ieee_status が捉えるステータスワードのレイアウトは、__fp_status
が捉えるレイアウトと異なります(図 5-1 参照)。
図 5-1 IEEE ステータスワードレイアウト
図 5-1 のフィールドは以下の通りです。
5-8
•
ビット 0 ~ 4 は、P. 5-10「__fp_status 関数」で説明しているものと全く同じス
ティッキーフラグです。
•
ビット 8 ~ 12 は P. 5-10「__fp_status 関数」で説明しているものと全く同じ例外
マスクビットですが、位置が異なります。
•
ビット 16 ~ 18 およびビット 20 ~ 21 は、VFP ベクタ機能を制御するために VFP
ハードウェアによって使用されます。__ieee_status を呼び出してもこれらの
ビットを修正することはできません。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
•
ビット 22 と 23 は、丸めモードを制御します(表 5-5 参照)。
表 5-5 丸めモードの制御
ビット
丸めモード
00
最近値への丸め
01
切り上げ
10
切り捨て
11
ゼロへの丸め
•
ビット 24 は、セットされていれば FZ(ゼロにフラッシュ)をイネーブルします。
FZ モードでは、処理速度を上げるために非正規形が強制的にゼロに設定されま
す(非正規形の処理は難しく、浮動小数点システムの速度を低下させるため)。こ
のビットをセットすることによって精度は落ちますが、速度が向上する場合があ
ります。
•
R でマーキングされたビットは予約されています。
__ieee_status 呼び出し自体の定義に加え、fenv.h はその引数として使用するいく
つかの定数を定義しています。
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
FE_IEEE_FLUSHZERO
FE_IEEE_ROUND_TONEAREST
FE_IEEE_ROUND_UPWARD
FE_IEEE_ROUND_DOWNWARD
FE_IEEE_ROUND_TOWARDZERO
FE_IEEE_ROUND_MASK
FE_IEEE_MASK_INVALID
FE_IEEE_MASK_DIVBYZERO
FE_IEEE_MASK_OVERFLOW
FE_IEEE_MASK_UNDERFLOW
FE_IEEE_MASK_INEXACT
FE_IEEE_MASK_ALL_EXCEPT
FE_IEEE_INVALID
FE_IEEE_DIVBYZERO
FE_IEEE_OVERFLOW
FE_IEEE_UNDERFLOW
FE_IEEE_INEXACT
FE_IEEE_ALL_EXCEPT
(0x01000000)
(0x00000000)
(0x00400000)
(0x00800000)
(0x00C00000)
(0x00C00000)
(0x00000100)
(0x00000200)
(0x00000400)
(0x00000800)
(0x00001000)
(0x00001F00)
(0x00000001)
(0x00000002)
(0x00000004)
(0x00000008)
(0x00000010)
(0x0000001F)
例えば、丸めモードを「切り捨て」に設定する場合:
__ieee_status(FE_IEEE_ROUND_MASK, FE_IEEE_ROUND_DOWNWARD);
無効演算例外をトラップさせ、他の全ての例外をトラップさせない場合:
__ieee_status(FE_IEEE_MASK_ALL_EXCEPT, FE_IEEE_MASK_INVALID);
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-9
浮動小数点サポート
非厳密結果例外をトラップさせない場合:
__ieee_status(FE_IEEE_MASK_INEXACT, 0);
アンダーフロースティッキーフラグをクリアする場合:
__ieee_status(FE_IEEE_UNDERFLOW, 0);
5.3.2
__fp_status 関数
旧バージョンの ARM ライブラリには、浮動小数点環境でステータスワードを操作する
__fp_statusという名前の関数が実装されていました。ARMは下位互換性を維持する
目的で現在もこの関数をサポートしています。この関数は stdlib.h で定義されてい
ます。
__fp_status のプロトタイプは以下の通りです。
unsigned int __fp_status(unsigned int mask, unsigned int flags);
この関数は、パラメータに基づいてステータスワードの書き込み可能部分を修正し、そ
のワード全体の前の値を戻します。
書き込み可能ビットは以下を設定することによって修正されます。
new = (old & ~mask) ^ flags;
マスクとフラグの対応ビットに従って、ステータスワードの各ビットには 4 種類の演
算を実行することができます(表 5-6 参照)。
表 5-6 ステータスワードのビット修正
マスクのビット フラグのビット 作用
0
0
修正なし
0
1
切り替え
1
0
0 をセット
1
1
1 をセット
図 5-2 は、__fp_status が捉えるステータスワードのレイアウトを示しています。
図 5-2 浮動小数点ステータスワードのレイアウト
5-10
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
P. 5-10 図 5-2 のフィールドは以下の通りです。
•
ビット 0 ~ 4(それぞれ、値 0x1 ~ 0x10)は、各例外のスティッキーフラグま
たは累積フラグです。例外のスティッキーフラグは、その例外が発生し、トラッ
プされないたびに 1 にセットされます。スティッキーフラグは、システムによっ
てクリアされることはなく、ユーザのみがクリアできます。これらのビットに対
する例外のマッピングは以下の通りです。
—
ビット 0(0x01):無効演算例外
—
ビット 1(0x02):ゼロ除算例外
—
ビット 2(0x04):オーバフロー例外
—
ビット 3(0x08):アンダーフロー例外
—
ビット 4(0x10):非厳密結果例外
•
ビット 8 ~ 12(値 0x100 ~ 0x1000)は、FPA 浮動小数点コプロセッサの様々
なアスペクトを制御します。システムに FPA が存在しない場合は、これらのビッ
トへの書き込み試行が全て無視されます。
•
ビット 16 ~ 20(値 0x10000 ~ 0x100000)は、各例外をトラップさせるかど
うかを制御します。これらのビットのいずれかに 1 がセットされると、対応する
例外がトラップされます。ビットに 0 がセットされると、対応する例外がそのス
ティッキーフラグをセットし、もっともらしい結果を戻します(P. 5-35「例外」
参照)。
•
ビット 24 ~ 31 はシステム ID を保持し、このシステム ID を変更することはでき
ません。ソフトウェア浮動小数点の場合には 0x40 が、ハードウェア浮動小数点
の場合には 0x80 かそれ以上がセットされ、ハードウェア浮動小数点環境がエ
ミュレートされているかどうかによって 0 または 1 がセットされます。
•
R でマーキングされているビットは予約されています。__fp_status 呼び出し
によってこれらのビットを書き込むことはできないため、どのビットも無視する
必要があります。
丸めモードを __fp_status 呼び出しで変更することはできません。
__fp_status 呼び出しの定義に加え、stdlib.h ではその引数として使用するいくつ
かの定数も定義されています。
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
ARM DUI0067DJ-00
__fpsr_IXE
__fpsr_UFE
__fpsr_OFE
__fpsr_DZE
__fpsr_IOE
__fpsr_IXC
__fpsr_UFC
__fpsr_OFC
__fpsr_DZC
__fpsr_IOC
0x100000
0x80000
0x40000
0x20000
0x10000
0x10
0x8
0x4
0x2
0x1
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-11
浮動小数点サポート
例えば、無効演算例外をトラップさせ、他の全ての例外をトラップさせない場合は、以
下のようになります。
__fp_status(_fpsr_IXE | _fpsr_UFE | _fpsr_OFE |
_fpsr_DZE | _fpsr_IOE, _fpsr_IOE);
非厳密結果例外をトラップさせない場合:
__fp_status(_fpsr_IXE, 0);
アンダーフロースティッキーフラグをクリアする場合:
__fp_status(_fpsr_UFC, 0);
5.3.3
Microsoft 互換関数
以下の 3 つの関数は、Microsoft 製品との互換性を保ち、浮動小数点コードを ARM アー
キテクチャに移植しやすくするために実装されています。これらの関数は float.h に
定義されています。
_controlfp 関数
_controlfp 関数を使用して、例外トラップと丸めモードを制御することができます。
unsigned int _controlfp(unsigned int new, unsigned int mask);
また、この関数は修正するビットを切り離すマスクを使用して制御ワードを修正しま
す。mask の各ビットがゼロである場合、対応する制御ワードビットは変更されません。
mask の各ビットが非ゼロである場合は、対応する制御ワードビットに、new の対応ビッ
トの値がセットされます。戻り値は、制御ワードの前の状態です。
注
この動作は、マスクワードとフラグワードにそれぞれゼロをセットすることによって
ビットを切り替えられる __fp_status と __ieee_status の動作と同じわけではあ
りません。
5-12
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
表 5-7 は、_controlfp の引数の形成に使用できるマクロを示しています。
表 5-7 _controlfp の引数マクロ
マクロ
説明
_MCW_EM
全ての例外ビットを保持するマスク
_EM_INVALID
無効演算例外を記述するビット
_EM_ZERODIVIDE
ゼロ除算例外を記述するビット
_EM_OVERFLOW
オーバフロー例外を記述するビット
_EM_UNDERFLOW
アンダーフロー例外を記述するビット
_EM_INEXACT
非厳密結果例外を記述するビット
_MCW_RC
丸めモードフィールドのマスク
_RC_CHOP
ゼロへの丸めを記述する丸めモード値
_RC_UP
切り上げを記述する丸めモード値
_RC_DOWN
切り下げを記述する丸めモード値
_RC_NEAR
近似値への丸めを記述する丸めモード値
注
これらのマクロの値が、今後の ARM 製品のバージョンでも同じであるとは限りませ
ん。将来のバージョンで値が変更されてれもコードが機能するように、値ではなくマ
クロを使用するようにして下さい。
例えば、丸めモードを「切り捨て」に設定するには、以下のようになります。
_controlfp(_RC_DOWN, _MCW_RC);
無効演算例外をトラップさせ、他の全ての例外をトラップさせない場合:
_controlfp(_EM_INVALID, _MCW_EM);
非厳密結果例外をトラップさせない場合:
_controlfp(0, _EM_INEXACT);
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-13
浮動小数点サポート
_clearfp 関数
_clearfp 関数は、5 つ全ての例外スティッキーフラグをクリアし、それぞれの前の値
を戻します。_EM_INVALID や _EM_ZERODIVIDE をはじめとする P. 5-13 表 5-7 のマ
クロを使用して、戻された結果のビットをテストすることができます。
_clearfp のプロトタイプは以下の通りです。
unsigned _clearfp(void);
_statusfp 関数
_statusfp 関数は、例外スティッキーフラグの現在の値を戻します。_EM_INVALID
や _EM_ZERODIVIDE をはじめとする P. 5-13 表 5-7 のマクロを使用して、戻された結
果のビットをテストすることができます。
_statusfp のプロトタイプは以下の通りです。
unsigned _statusfp(void);
5.3.4
C9X 互換関数
上記の関数に加え、ARM は C9X 規格原案で定義されている関数セットもサポートして
います。これらの関数は、戻り値を作り出すことができるユーザ例外トラップハンド
ラのインストールを可能にする唯一のインタフェースです。このセクションで紹介し
ている全ての関数、タイプ、マクロは fenv.h 内に定義されています。
C9X は 2 つのデータタイプ、fenv_t および fexcept_t を定義しています。C9X 規
格原案では、これらのタイプに関する詳細を定義していないため、移植可能なコード
を作成するには、これらをオペークとして扱う必要があります。ARM はこれらのタイ
プを構造体タイプとして定義しています。詳細については、P. 5-17「C9X インタフェー
スの ARM 拡張」を参照して下さい。
fenv_t タイプは、現在の浮動小数点環境に関する以下の全ての情報を保持するように
定義されています。
•
丸めモード
•
例外スティッキーフラグ
•
各例外のマスクの有無
•
インストールされているハンドラ(存在する場合)
fexcept_t タイプは、使用されている例外セットに関連する全ての情報を保持するよ
うに定義されています。
5-14
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
C9X は、各丸めモードと各例外のマクロも定義しています。これらのマクロは以下の
通りです。
FE_DIVBYZERO
FE_INEXACT
FE_INVALID
FE_OVERFLOW
FE_UNDERFLOW
FE_ALL_EXCEPT
FE_DOWNWARD
FE_TONEAREST
FE_TOWARDZERO
FE_UPWARD
これらの例外マクロはビットフィールドで構成されています。マクロ FE_ALL_EXCEPT
は、これら全てのビットごとの OR です。
例外フラグの処理
C9X では、例外のクリア、テスト、生成に使用できる以下の 3 つの関数が定義されて
います。
void feclearexcept(int excepts);
int fetestexcept(int excepts);
void feraiseexcept(int excepts);
feclearexcept 関数は、指定された例外のスティッキーフラグをクリアします。
fetestexcept 関数は、指定された例外のスティッキーフラグのビットごとの OR を戻
します(そのため、オーバフローフラグがセットされ、アンダーフローフラグがセッ
トされていない場合には、fetestexcept(FE_OVERFLOW|FE_UNDERFLOW) の呼び
出しによって FE_OVERFLOW が戻されます)。
feraiseexcept 関数は、指定された例外を任意の順序で発生させます。この方法で発
生した例外の例外トラップがイネーブルされていれば、これが呼び出されます。
C9X は、指定された例外に関する全てを保存・復元する関数も定義しています。この
中にはスティッキーフラグ、例外トラップの有無、トラップハンドラのアドレスが含
まれます。これらの関数は以下の通りです。
void fegetexceptflag(fexcept_t *flagp, int excepts);
void fesetexceptflag(const fexcept_t *flagp, int excepts);
fegetexceptflag 関数は、指定された例外に関する全ての情報を、指定された
fexcept_t 変数にコピーします。fesetexceptflag 関数は、指定された例外に関す
る全ての情報を、fexcept_t 変数から現在の浮動小数点環境にコピーします。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-15
浮動小数点サポート
注
fesetexceptflag は、トラップされた例外のスティッキーフラグにトラップハンド
ラを呼び出さずに 1 をセットするために呼び出せるのに対し、feraiseexcept はト
ラップされた全ての例外に対してトラップハンドラを呼び出します。
丸めモードの処理
C9X では、丸めモードを制御する以下の 2 つの関数が定義されています。
int fegetround(void);
int fesetround(int round);
fegetround 関数は、上記で定義されているマクロの 1 つとして現在の丸めモードを戻
します。fesetround 関数は、現在の丸めモードに指定された値を設定します。
fesetround は、処理に成功するとゼロを、引数が無効な丸めモードであれば非ゼロ
を戻します。
環境全体の保存
C9X では、浮動小数点環境全体を保存・復元する以下の関数が定義されています。
void fegetenv(fenv_t *envp);
void fesetenv(const fenv_t *envp);
fegetenv 関数は、浮動小数点環境の現在の状態を、指定された fenv_t 変数に保存し
ます。fesetenv 関数は、指定された変数からこの環境を復元します。
fesetexceptflag と同じように、トラップされた例外のスティッキーフラグをセッ
トする場合には、fesetenv はトラップハンドラを呼び出しません。
一時無効例外
C9X では、例外を発生させる可能性のあるコードを実行するときに、例外トラップに
よるリスクを回避するための 2 つの関数が定義されています。これらの関数は、トラッ
プされる例外が ARM デフォルト動作を使用する場合などに効果的です。デフォルトで
は、SIGFPE を発生させてアプリケーションを終了します。
int feholdexcept(fenv_t *envp);
void feupdateenv(const fenv_t *envp);
5-16
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
feholdexcept 関数は、現在の浮動小数点環境を指定された fenv_t 変数に保存し、全
ての例外がトラップされないように設定し、全ての例外スティッキーフラグをクリア
します。これにより、不要な例外を発生させる可能性のあるコードでも実行すること
が可能となり、これらの例外のスティッキーフラグを確実にクリアすることができま
す。その後で feupdateenv を呼び出すことができます。この関数は、全ての例外ト
ラップを復元し、必要に応じてそれらを呼び出すことができます。
例えば、アンダーフロー例外または無効演算例外(両方ともトラップされる例外とし
ます)を発生させる可能性がある関数 frob() があるとします。アンダーフロー例外
は発生させたくないものの、無効演算が試行されるかどうかを確認したい場合には、以
下のように記述することができます。
fenv_t env;
feholdexcept(&env);
frob();
feclearexcept(FE_UNDERFLOW);
feupdateenv(&env);
frob() 関数がアンダーフローを発生させると、これが feclearexcept によって再び
クリアされるため、feupdateenv が呼び出されるときはトラップは発生しません。し
かし、frob() が無効演算を発生させると、feupdateenv が呼び出されるときにス
ティッキーフラグがセットされるため、トラップハンドラが呼び出されます。
このメカニズムが C9X で定義されているのは、各例外の例外トラッピングを変更する
手段が C9X で規定されていないためです。さらに良い方法として、__ieee_status
を使用しても、無効演算トラップをイネーブルしたままアンダーフロートラップを
ディセーブルすることができます。これには、無効演算に関する全ての情報(どの演
算がどのデータに実行されたか)が無効演算トラップハンドラに提供され、その演算
の結果を作り出せるという利点があります。C9X 方式を使用すると、無効演算トラッ
プハンドラは事後に呼び出され、例外の原因に関する情報を受け取らず、代用する結
果を求めるには呼び出されるのが遅すぎることになります。
5.3.5
C9X インタフェースの ARM 拡張
ARM は、ARM 浮動小数点環境に可能な全てのことが可能になるように、C9X インタ
フェースをいくつかの点で拡張しています。この中には、各例外タイプのトラッピン
グとトラッピング解除、カスタムトラップハンドラのインストールなどが含まれます。
C9X では、fenv_t および fexcept_t タイプが特定の何かとしては定義されていませ
ん。ARM はこれら両方のタイプを同じ構造体タイプとして定義しています。
typedef struct {
unsigned statusword;
__ieee_handler_t invalid_handler;
__ieee_handler_t divbyzero_handler;
__ieee_handler_t overflow_handler;
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-17
浮動小数点サポート
__ieee_handler_t underflow_handler;
__ieee_handler_t inexact_handler;
} fenv_t, fexcept_t;
上記構造体のメンバは以下の通りです。
•
statusword は、__ieee_status 関数が捉える同じステータス変数であり、同
じ形式でレイアウトされます(P. 5-8「__ieee_status 関数」参照)。
•
各例外のトラップハンドラのアドレスを示す 5 つの関数ポインタ。デフォルトで
は、全て NULL です。つまり、例外がトラップされると、そのデフォルトの例外
トラップ動作が発生します。デフォルトでは SIGFPE シグナルが発生します。
ユーザ例外トラップハンドラの記述
ユーザ例外トラップハンドラをインストールしたい場合は、それを以下のような関数
として宣言します。
__softfp__ieee_value_t myhandler(__ieee_value_t op1,
__ieee_value_t op2,
__ieee_edata_t edata);
以下はこの関数のパラメータです。
•
op1 および op2 は、例外を発生させた演算のオペランド、または中間結果を与
えるために使用されます。
—
無効演算例外とゼロ除算例外の場合は、最初のオペランドが与えられます。
—
非厳密結果例外の場合、与えられるのはいずれにしろ戻される通常の結果
だけです。これは op1 で渡されます。
—
オーバフロー例外の場合は、中間結果が与えられます。この結果は、指数
範囲が十分に大きい場合にどの演算を戻すかを解明し、フォーマットに合
うように指数を調整することによって計算されます。指数は、単精度では
192(0xC0)だけ、倍精度では 1536(0x600)だけ調整されます。
double から float への変換時にオーバフローが発生すると、その結果は
double 形式で与えられ、単精度に丸められ、指数は 192 でバイアスされ
ます。
—
アンダーフロー例外の場合は、同様の中間結果が生成されますが、バイア
ス値は引かれるのではなく指数に加算されます。edata パラメータは、こ
の中間結果を切り上げるか切り下げるか、あるいは何も行わないかを示す
フラグも保持します。
__ieee_value_t タイプは、オペランドを以下のように渡すことができる、考
え得る全てのタイプの共用体として定義されています。
5-18
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
typedef union {
float f;
float s;
double d;
int i;
unsigned int ui;
long long l;
unsigned long long ul;
struct { int word1, word2; } str;
} __ieee_value_t;
•
edata は、発生した例外に関する情報を示し、どの演算が実行されたかを示すフ
ラグを保持します(__ieee_edata_t タイプは unsigned int の同義語です)。
•
この関数からの戻り値は、例外を発生させた演算の結果として使用されます。
edata に含まれるフラグは以下の通りです。
•
edata & FE_EX_RDIR は、アンダーフローにおける中間結果を切り捨てる場合
は非ゼロとなり、切り上げる、または丸めない場合は 0 となります。(最後の 2
つの違いは、非厳密結果ビットで示されます。)このビットは、他のタイプの例
外には意味がありません。
edata & FE_EX_exception は、指定された exception(INVALID、DIVBYZERO、
OVERFLOW、UNDERFLOW あるいは INEXACT)が発生すると非ゼロとなります。これに
より以下を行うことができます。
—
複数の例外タイプに同じハンドラ関数を使用する(この関数はこれらの
ビットをテストして、どの例外を処理すべきかを通知します)。
—
オーバフローおよびアンダーフローの中間結果が丸められたか、あるいは
厳密であるかどうかを決定します。
FE_EX_INEXACTビットは、FE_EX_OVERFLOWまたはFE_EX_UNDERFLOWのどち
らかとの組み合わせでセットされることがあるため、非厳密かどうかをテストす
る前にオーバフローとアンダーフローをテストして、実際に発生した例外のタイ
プを決定する必要があります。
ARM DUI0067DJ-00
•
edata & FE_EX_FLUSHZERO は、演算実行時に FZ ビットがセットされていれ
ば非ゼロとなります(P. 5-8「__ieee_status 関数」参照)。
•
edata & FE_EX_ROUND_MASK は、演算に適用される丸めモードを示します。
例外を発生させた演算が _ffix などの常にゼロに丸められるルーチンであった
場合を除き、通常は現在の丸めモードを示します。使用可能な丸めモードの値は、
FE_EX_ROUND_NEAREST、FE_EX_ROUND_PLUSINF、
FE_EX_ROUND_MINUSINF、FE_EX_ROUND_ZERO です。
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-19
浮動小数点サポート
•
edata & FE_EX_INTYPE_MASK は、関数オペランドのタイプを表 5-8 のタイプ
の値で示します。
表 5-8 FE_EX_INTYPE_MASK オペランドタイプフラグ
•
フラグ
オペランドタイプ
FE_EX_INTYPE_FLOAT
float
FE_EX_INTYPE_DOUBLE
double
FE_EX_INTYPE_INT
int
FE_EX_INTYPE_UINT
unsigned int
FE_EX_INTYPE_LONGLONG
long long
FE_EX_INTYPE_ULONGLONG
unsigned long long
edata & FE_EX_OUTTYPE_MASK は、関数オペランドのタイプを表 5-9 のタイ
プの値で示します。
表 5-9 FE_EX_OUTTYPE_MASK オペランドタイプフラグ
5-20
フラグ
オペランドタイプ
FE_EX_OUTTYPE_FLOAT
float
FE_EX_OUTTYPE_DOUBLE
double
FE_EX_OUTTYPE_INT
int
FE_EX_OUTTYPE_UINT
unsigned int
FE_EX_OUTTYPE_LONGLONG
long long
FE_EX_OUTTYPE_ULONGLONG
unsigned long long
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
•
edata & FE_EX_FN_MASK は、例外を発生させた演算の性質を表 5-10 の演算
コードで示します。
表 5-10 FE_EX_FN_MASK 演算タイプフラグ
フラグ
演算タイプ
FE_EX_FN_ADD
加算
FE_EX_FN_SUB
減算
FE_EX_FN_MUL
乗算
FE_EX_FN_DIV
除算
FE_EX_FN_REM
剰余
FE_EX_FN_RND
整数への丸め
FE_EX_FN_SQRT
平方根
FE_EX_FN_CMP
比較
FE_EX_FN_CVT
形式変換
FE_EX_FN_RAISE
例外が feraiseexcept または feupdateenv によって
明示的に生成されたことを示します。この場合、edata
ワードのほとんど全てが無効です。
演算が比較の場合、その結果は int であったかのように戻され、表 5-11 が示す
4 つの値のいずれかでなくてはなりません。
比較と変換を除き、入力タイプと出力タイプは全ての演算で同じです。
表 5-11 FE_EX_CMPRET_MASK 比較タイプフラグ
ARM DUI0067DJ-00
フラグ
比較
FE_EX_CMPRET_LESS
op1 < op2
FE_EX_CMPRET_EQUAL
op1 = op2
FE_EX_CMPRET_GREATER
op1 > op2
FE_EX_CMPRET_UNORDERED
op1 と op2 の比較不可
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-21
浮動小数点サポート
例 5-1 は、カスタマイズした例外ハンドラを示しています。何らかの Fortran コードを
C に変換することを想定して下さい。Fortan 数値標準では 0 で 0 を割ると 1 になること
が定義されていますが、IEEE754 では 0 を 0 で割ると無効演算となるため、デフォルト
でクワイエット NaN が戻されます。Fortran コードはこの動作に依存する可能性が高い
ため、コードを修正するよりも、0 で 0 を割ったときに 1 を戻すようにする方が簡単で
しょう。
例 5-1 は、これを行うハンドラ関数を示しています。
例 5-1
__softfp __ieee_value_t myhandler(__ieee_value_t op1, __ieee_value_t op2,
__ieee_edata_t edata)
{
__ieee_value_t ret;
if ((edata & FE_EX_FN_MASK) == FE_EX_FN_DIV) {
if ((edata & FE_EX_INTYPE_MASK) == FE_EX_INTYPE_FLOAT) {
if (op1.f == 0.0 && op2.f == 0.0) {
ret.f = 1.0;
return ret;
}
}
if ((edata & FE_EX_INTYPE_MASK) == FE_EX_INTYPE_DOUBLE) {
if (op1.d == 0.0 && op2.d == 0.0) {
ret.d = 1.0;
return ret;
}
}
}
/* For all other invalid operations, raise SIGFPE as usual */
raise(SIGFPE);
}
このハンドラ関数は以下のようにインストールします。
fenv_t env;
fegetenv(&env);
env.statusword |= FE_IEEE_MASK_INVALID;
env.invalid_handler = myhandler;
fesetenv(&env);
ハンドラのインストール後は、0.0 を 0.0 で割ると 1.0 が戻されます。
シグナルによる例外トラップ処理
例外がトラップされたもののトラップハンドラのアドレスにNULLが設定されている場
合には、デフォルトのトラップハンドラが使用されます。
5-22
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
デフォルトのトラップハンドラは SIGFPE シグナルを生成します。SIGFPE のデフォ
ルトハンドラはエラーメッセージを印字してプログラムを終了します。
SIGFPE をトラップする場合は、シグナルハンドラが発生した浮動小数点例外のタイプ
を通知する第 2 パラメータを持つことを宣言できます。この機能は、Microsoft 製品と
の互換性を維持するために提供されています。使用可能な値は _FPE_INVALID、
_FPE_ZERODIVIDE、_FPE_OVERFLOW、_FPE_UNDERFLOW、_FPE_INEXACT です。こ
れらの値は float.h 内で定義されています。例:
void sigfpe(int sig, int etype) {
printf("SIGFPE (%s)\n",
etype == _FPE_INVALID ? "Invalid Operation" :
etype == _FPE_ZERODIVIDE ? "Divide by Zero" :
etype == _FPE_OVERFLOW ? "Overflow" :
etype == _FPE_UNDERFLOW ? "Underflow" :
etype == _FPE_INEXACT ? "Inexact Result" :
"Unknown");
}
signal(SIGFPE, (void(*)(int))sigfpe);
この追加情報を使用して SIGFPE シグナルを生成する場合は、ANSI 関数で生成する代
わりに、__rt_raise 関数を呼び出すことができます。P. 5-22 例 5-1 の場合では、
raise(SIGFPE);
の代わりに以下のように記述することを推奨します。
__rt_raise(SIGFPE, _FPE_INVALID);
__rt_raise は rt_misc.h で宣言されています。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-23
浮動小数点サポート
5.4
数学ライブラリ:mathlib
数学ライブラリ:
mathlib に含まれる三角関数は、範囲還元を使用して 0 ~ 2π の範囲内の大きな引数を導
出します。ARM は 2 つの範囲還元関数を用意しています。一方の関数では、どの入力
値についても厳密に最後の桁が 1 の位になりますが、他方よりもサイズが大きいため、
実行速度が遅くなります。もう一方の関数ではほぼ全ての目的で十分に信頼性の高い
結果を得ることができ、他方よりも小さく、速いのが特徴です。
デフォルトでは、この速くかつ小さい範囲還元関数が使用されます。より厳密な方の
関数を選択する場合は、以下のどちらかを使用して下さい。
•
#pragma import (__use_accurate_range_reduction)(C の場合)
•
IMPORT __use_accurate_range_reduction(アセンブリ言語の場合)
ANSI C 標準で定義されている関数に加え、mathlib には以下の関数が含まれています。
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
5-24
逆双曲線関数(acosh、asinh、atanh):P. 5-25
立方根(cbrt):P. 5-25
符号コピー(copysign):P. 5-25
エラー関数(erf、erfc):P. 5-25
1 - exp(x)(expm1):P. 5-26
有限数決定(finite):P. 5-26
ガンマ関数(gamma、gamma_r):P. 5-26
斜辺関数(hypot):P. 5-26
数値指数の戻し(ilogb):P. 5-27
NaN の決定(isnan):P. 5-27
第 1 種ベッセル関数(j0、j1、jn):P. 5-27
ガンマ関数の対数(lgamma、lgamma_r):P. 5-27
x + 1 の対数(log1p):P. 5-28
数値指数の戻し(logb):P. 5-28
次の表現可能数の戻し(nextafter):P. 5-28
IEEE 754 剰余関数(remainder):P. 5-28
IEEE 整数丸め演算(rint):P. 5-28
2 の累乗による数値の基準化(scalb、scalbn):P. 5-29
数値の小数部の戻し(significand):P. 5-29
第 2 種ベッセル関数(y0、y1、yn):P. 5-29
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
5.4.1
逆双曲線関数(acosh、
、asinh、
、atanh)
)
逆双曲線関数(
double acosh(double x);
double asinh(double x);
double atanh(double x);
これらの関数は、ANSI で規定されている cosh、sinh、tanh の逆バージョンです。
5.4.2
•
cosh は対称関数(x または –x に適用されたときに同じ値を戻すもの)であるた
め、acoshには正と負の2つの戻り値があります。
この関数は正の結果を戻します。
•
acosh は、1.0 未満の引数を使用して呼び出されると、EDOM エラーを戻します。
•
atanh は、絶対値が 1.0 を超える引数を使用して呼び出されると、EDOM エラー
を戻します。
立方根(cbrt)
)
立方根(
double cbrt(double x);
この関数は、その引数の立方根を戻します。
5.4.3
符号コピー(copysign)
)
符号コピー(
double copysign(double x, double y);
この関数は、x の符号ビットを y の符号ビットに置き換え、その結果を戻します。NaN
および無限数に適用された場合でも、エラーも例外も発生しません。
5.4.4
エラー関数(erf、
、erfc)
)
エラー関数(
double erf(double x);
double erfc(double x);
これらの関数は、正規分布に関連して、標準統計エラー関数を算出します。
ARM DUI0067DJ-00
•
erf は、通常のエラー関数 x を算出します。
•
erfc は、1 - erf(x) を算出します。x が大きいときは、1-erf(x) よりも解が
より正確な erfc(x) を使用することを推奨します。
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-25
浮動小数点サポート
5.4.5
1 - exp(x)(
(expm1)
)
double expm1(double x);
この関数は、累乗 x に対する e から 1 を引いた結果を算出します。x がほぼゼロに近い
場合は、exp(x)-1 よりも正確な解を戻す expm1(x) を使用することを推奨します。
5.4.6
有限数決定(finite)
)
有限数決定(
int finite(double x);
この関数は、x が有限である場合に 1 を、x が無限または NaN である場合に 0 を戻しま
す。この関数によってエラーまたは例外が発生することはありません。
5.4.7
ガンマ関数(gamma、
、gamma_r)
)
ガンマ関数(
double gamma(double x);
double gamma_r(double x, int *);
これらの関数はどちらもガンマ関数の対数を算出します。この 2 つの関数は、lgamma
および lgamma_r と同義です(P. 5-27「ガンマ関数の対数(lgamma、lgamma_r)」参照)。
注
名前とは関係なく、これらの関数はガンマ関数自体ではなく、ガンマ関数の対数を算
出します。
5.4.8
斜辺関数(hypot)
)
斜辺関数(
double hypot(double x, double y);
この関数は、2 本の斜辺の長さが x と y の直角三角形の斜辺の長さを算出します。同様
に、この関数はカルテシアン座標のベクタ(x,y)の長さを算出します。x と y の値に
よっては、その立方根がオーバフローとならなくても、x * x + y * y ではオーバフロー
を発生させることがあるため、sqrt(x*x+y*y) ではなく hypot(x,y) を使用するこ
とを推奨します。
結果が double に収まりきらない場合、hypot は ERANGE エラーを戻します。
5-26
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
5.4.9
数値指数の戻し(ilogb)
)
数値指数の戻し(
int ilogb(double x);
この関数は、x の指数をバイアスさせずに戻すため、ilogb(1.0) は 0 を、ilogb(2.0)
は 1 を戻します。
0 に適用されると、ilogb は -0x7FFFFFFF を戻します。NaN または無限数に適用さ
れると、ilogbは+0x7FFFFFFFを戻します。ilogbは例外もエラーも発生させません。
5.4.10
NaN の決定(isnan)
)
の決定(
int isnan(double x);
この関数は、x が NaN であれば 1 を、それ以外の場合は 0 を戻します。この関数は例
外もエラーも発生させません。
5.4.11
第 1 種ベッセル関数(j0、
、jn)
)
種ベッセル関数( 、j1、
double j0(double x);
double j1(double x);
double jn(int n, double x);
これらの関数は、第 1 種ベッセル関数を算出します。j0 および j1 は、それぞれ順序
0 と 1 の関数を算出します。jn は順序 n の関数を算出します。
x の絶対値が π × 252 を超えると、これらの関数は ERANGE エラーを戻し、結果において
総損失有意性を表します。
5.4.12
ガンマ関数の対数(lgamma、
、lgamma_r)
)
ガンマ関数の対数(
double lgamma(double x);
double lgamma_r(double x, int *sign);
これらの関数は、x のガンマ関数の絶対値の対数を算出します。この関数の符号は別に
戻されるため、この 2 つを使用して x の実際のガンマ関数を算出することができます。
lgamma は x のガンマ関数の符号をグローバル変数 signgam に戻します。lgamma_r は
これをユーザ変数に戻し、このアドレスが sign パラメータで渡されます。この値は、
どちらのケースでも、+1 または -1 となります。
解が大きすぎて double に収まりきらない場合、どちらの関数も ERANGE エラーを戻
します。
x がゼロまたは負の整数である場合には、どちらの関数も EDOM エラーを戻します。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-27
浮動小数点サポート
5.4.13
x + 1 の対数(log1p)
)
の対数(
double log1p(double x);
この関数は、x + 1 の自然アルゴリズムを算出します。expm1 と同様に、x がゼロに近
い場合には、log(x+1) よりも厳密なこの関数を使用することを推奨します。
5.4.14
数値指数の戻し(logb)
)
数値指数の戻し(
double logb(double x);
この関数は ilogb に似ていますが、結果を double で戻します。したがって、この関
数は特殊なケースの特殊な結果を戻すことができます。
•
logb(NaN) はクワイエット NaN です。
•
logb(infinity) は + 無限大です。
•
logb(0) は - 無限大であり、ゼロ除算例外を発生させます。
logb は、IEEE754 付録で説明されている Logb 関数と同じです。
5.4.15
次の表現可能数の戻し(nextafter)
)
次の表現可能数の戻し(
double nextafter(double x, double y);
この関数は、x の次の y 方向の表現可能数を戻します。x と y が等しい場合は、x が戻
されます。
5.4.16
IEEE 754 剰余関数(remainder)
)
剰余関数(
double remainder(double x, double y);
この関数は、IEEE754 剰余演算を行います。この関数は _drem と同義です(P. 5-4「特
定形式の数値に対する算術演算」参照)。
5.4.17
IEEE 整数丸め演算(rint)
)
整数丸め演算(
double rint(double x);
この関数は、IEEE754 整数丸め演算を行います。この関数は _drnd と同義です(P. 5-4
「特定形式の数値に対する算術演算」参照)。
5-28
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
5.4.18
2 の累乗による数値の基準化(scalb、
、scalbn)
)
の累乗による数値の基準化(
double scalb(double x, double n);
double scalbn(double x, int n);
これらの関数は x × 2 を累乗 n に戻します。これらの関数の違いは、n が int と double
のどちらで渡されるかという点です。
scalb は、IEEE754 付録で説明されている Scalb 関数と同じです。n が整数以外の場合
のこの関数の動作は定義されていません。
5.4.19
数値の小数部の戻し(significand)
)
数値の小数部の戻し(
double significand(double x);
この関数は、x の小数部を 1.0 ~ 2.0(2.0 は含まない)の数値として戻します。
5.4.20
第 2 種ベッセル関数(y0、
、yn)
)
種ベッセル関数( 、y1、
double y0(double x);
double y1(double x);
double yn(int, double);
これらの関数は、第 2 種ベッセル関数を算出します。y0 および y1 は、それぞれ順序
0 と 1 の関数を算出します。yn は順序 n の関数を算出します。
x が正でかつ π × 252 を超えると、これらの関数は ERANGE エラーを戻し、結果におい
て総損失有意性を表します。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-29
浮動小数点サポート
5.5
IEEE 754 算術演算
ARM 浮動小数点環境は、浮動小数点算術演算に関する IEEE754 標準規格を実装したも
のです。このセクションでは、ARM で実装されているこの標準について概説します。
5.5.1
基本データタイプ
ARM 浮動小数点値は、2 つのデータタイプ、単精度と倍精度のどちらかでストアされ
ます。本書ではこれを float および double と呼んでいます。これらは C タイプに対
応するものです。
単精度
float の値は 32 ビット幅です。図 5-3 はこの構造体を示しています。
31 30
S
23 22
Exp
0
Frac
図 5-3 IEEE 754 単精度浮動小数点形式
S フィールドは数値の符号を示します。正の場合は 0、負の場合は 1 となります。
Exp フィールドは、数値の指数を 2 の累乗の形で示します。この値は 0x7F(127)で
バイアスされるため、非常に小さな数の指数はゼロに近くなり、非常に大きな数の指
数 0xFF(255)に近くなります。例:
•
Exp = 0x7D(125)のとき、その値は 0.25 ~ 0.5(0.5 は含まない)の範囲内の値
となります。
•
Exp = 0x7E(126)のとき、その値は 0.5 ~ 1.0(1.0 は含まない)の範囲内の値と
なります。
•
Exp = 0x7F(127)のとき、その値は 1.0 ~ 2.0(2.0 は含まない)の範囲内の値と
なります。
•
Exp = 0x80(128)のとき、その値は 2.0 ~ 4.0(4.0 は含まない)の範囲内の値と
なります。
•
Exp = 0x81(129)のとき、その値は 4.0 ~ 8.0(8.0 は含まない)の範囲内の値と
なります。
Frac フィールドは、数値の少数部を示します。通常は、空間を節約するためにストア
されない暗黙の 1 ビットが先頭にあります。したがって、Exp が 0x7F の場合には、以
下のようになります。
•
Frac = 00000000000000000000000(バイナリ)の場合、その値は 1.0 となります。
•
Frac = 10000000000000000000000(バイナリ)の場合、その値は 1.5 となります。
•
Frac = 01000000000000000000000(バイナリ)の場合、その値は 1.25 となります。
•
Frac = 11000000000000000000000(バイナリ)の場合、その値は 1.75 となります。
このため一般的には、この形式におけるビットパタンの数値は、以下の式によって求
められます。
(–1)S * 2Exp(–0x7F) * (1 + Frac * 2–23)
5-30
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
この形式でストアされる数を、正規化数と呼びます。
指数の最大値と最小値、0 および 255 は、特殊なケースです。指数 255 は無限大を表す
ために使用され、非数(NaN)値をストアします。無限大はゼロによる除算の結果とし
て発生するか、この形式でストアするには大きすぎる値を算出した結果として発生す
ることが考えられます。NaN の値は、特殊な目的に使用されます。無限大は Exp に 255
を設定し、Frac に全てゼロを設定することによってストアされます。Exp が 255 で Frac
が非ゼロの場合、このビットパタンは NaN を表します。
指数 0 は、非常に小さな数を特殊な方法で表現するために使用されます。Exp が 0 のと
きは、Frac フィールドの先頭に暗黙の 1 が設定されます。つまり、この形式では Exp
と Frac の両方に全て 0 ビットを設定することによって、0.0 をストアすることができま
す。また、Exp >= 1 を使用してストアするには小さすぎる数値が、通常の 23 ビットよ
りも低い精度でストアされることを意味します。これを非正規形と呼びます。
倍精度
double の値は 64 ビット幅です。図 5-4 はこの構造体を示しています。
63 62
S
52 51
Exp
0
Frac
図 5-4 IEEE 754 倍精度浮動小数点形式
前と同じように、S が符号、Exp が指数、Frac が小数です。以下の点を除くほぼ全てが
float 値の場合と同じです。
ARM DUI0067DJ-00
•
Exp フィールドは 0x7F ではなく 0x3FF(1023)でバイアスされるため、1.0 ~
2.0 の数値の Exp フィールドは 0x3FF となります。
•
無限大と NaN の表現に使用される Exp の値は、0xFF ではなく 0x7FF(2047)と
なります。
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-31
浮動小数点サポート
サンプル値
表 5-12 および P. 5-33 表 5-13 は、float と double のいくつかのビットパタンを数学
的な値とともに示しています。
表 5-12 単精度浮動小数点値のサンプル
Float 値
S
Exp
Frac
数学値
備考
0x3F800000
0
0x7F
000...000
1.0
-
0xBF800000
1
0x7F
000...000
-1.0
-
0x3F800001
0
0x7F
000...001
1.000 000 119
a
0x3F400000
0
0x7E
100...000
0.75
-
0x00800000
0
0x01
000...000
1.18*10-38
b
0x00000001
0
0x00
000...001
1.40*10-45
c
0x7F7FFFFF
0
0xFE
111...111
3.40*1038
d
0x7F800000
0
0xFF
000...000
+ 無限大
-
0xFF800000
1
0xFF
000...000
- 無限大
-
0x00000000
0
0x00
000...000
0.0
e
0x7F800001
0
0xFF
000...001
シグナリング NaN
f
0x7FC00000
0
0xFF
100...000
クワイエット NaN
f
a. 認識可能な最小表現可能数は 1.0 よりも大きな値となります。1.0 との差の量はマシンエプシロンとして知られて
います。これは float では 0.000 000 119、double では 0.000 000 000 000 000 222 です。マシンエプシロンから、
その形式で追跡可能な小数点以下の大よその数値を知ることができます。float では小数点以下第 6 位または 7
位まで、double では 16 位または 17 位まで追跡できます。
b. 各形式で正規化数として表現可能な最小値です。これよりも小さな値は非正規形としてストアすることができま
すが、十分な精度では保持されません。
c. ゼロと区別できる最小の正の数です。これがその形式の絶対下限となります。
d. ストア可能な最大有限数です。加算または乗算によってこの数を増加しようとするとオーバフローが生じ、無限
大が生成されます(一般的に)。
e. ゼロです。厳密には、+0 を示します。符号ビット 1 のゼロ、つまり -0 は、演算によって扱われ方が異なります
が、比較演算(== や != など)ではこれら 2 つのタイプのゼロが同じものとして通知されます。
f. NaN には、シグナリング NaN とクワイエット NaN の 2 つのタイプがあります。クワイエット NaN の場合は Frac
の先頭ビットに 1 がセットされ、シグナリング NaN の場合はゼロがセットされます。違いは、シグナリング NaN
を使用すると例外が発生するのに対し(P. 5-35「例外」参照)、クワイエット NaN では例外が発生しないことです。
5-32
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
表 5-13 倍精度浮動小数点値のサンプル
Double 値
S
Exp
Frac
数学値
備考
0x3FF00000 00000000
0
0x3FF
000...000
1.0
-
0xBFF00000 00000000
1
0x3FF
000...000
-1.0
-
0x3FF00000 00000001
0
0x3FF
000...001
1.000 000 000 000 000 222
a
0x3FE80000 00000000
0
0x3FE
100...000
0.75
-
0x00100000 00000000
0
0x001
000...000
2.23*10-308
b
0x00000000 00000001
0
0x000
000...001
4.94*10-324
c
0x7FEFFFFF FFFFFFFF
0
0x7FE
111...111
1.80*10308
d
0x7FF00000 00000000
0
0x7FF
000...000
+ 無限大
-
0xFFF00000 00000000
1
0x7FF
000...000
- 無限大
-
0x00000000 00000000
0
0x000
000...000
0.0
e
0x7FF00000 00000001
0
0x7FF
000...001
シグナリング NaN
f
0x7FF80000 00000000
0
0x7FF
100...000
クワイエット NaN
f
a. ~ f:補注については、P. 5-32 表 5-12 を参照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-33
浮動小数点サポート
5.5.2
算術演算と丸め
通常、算術演算は、
(無限大精度まで)厳密にストアされたかのように演算の結果を算
出することによって実行され、形式に見合うように丸めが行われます。形式に既に厳
密に適合している結果を戻す演算(1.0 と 1.0 の加算など)とは別に、正確な解はその
形式で表現可能な 2 つの数値の間に存在するのが一般的です。システムはこの 2 つの
数値のどちらかを、丸める結果として選択します。このとき、以下のいずれかの方法
が使用されます。
最近値への丸め
システムは、2 つの考え得る出力のうち、近似値である方を選択します。
正しい解がその 2 つのちょうど真中にある場合には、システムは Frac の
最下位ビットがゼロである方を選択します。この動作(偶数への丸め)
により、数多くの有害な作用を避けることができます。
アプリケーションの起動時にはこれがデフォルトモードとなります。通
常の浮動小数点ライブラリにサポートされているモードはこのモードだ
けです。
(ハードウェア浮動小数点環境と、g_avp などの拡張浮動小数
点ライブラリは、4 つ全てのモードをサポートしています。P. 4-104「ラ
イブラリ命名規則」を参照して下さい。)
切り上げ、または + 無限大への丸め
システムは取り得る 2 つの出力のうち、大きな値の方を選択します(こ
れらの値が正の場合はゼロからより遠い値、負の場合はゼロにより近い
値となります)。
切り下げ、または - 無限大への丸め
システムは取り得る 2 つの出力のうち、小さな値の方を選択します(こ
れらの値が正の場合はゼロにより近い値、負の場合はゼロからより遠い
値となります)。
ゼロへの丸め、切り取りあるいは切り捨て
システムが全ての場合においてゼロにより近い出力を選択します。
5-34
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
5.5.3
例外
浮動小数点算術演算では、様々な問題が生じる可能性があります。例えば、算出され
た結果が大き過ぎる、または小さ過ぎるために形式に適合しなかったり、結果を算出
できなかったり(負の数の平方根を求めたり、ゼロをゼロで除算しようとしたときな
ど)する場合があります。これらの問題は、異常あるいは例外的な状況を示している
ため、例外と呼ばれています。
ARM 浮動小数点環境では、いくつかの方法で例外を処理することが可能です。
例外を無視する
システムが演算に対するもっともらしい結果を作り出し、これを戻します。例えば、負
の数の平方根では NaN を生成し、形式に収めるには大き過ぎる値を算出しようとする
と無限大を生成することができます。例外が発生してこれが無視される場合は、浮動
小数点ステータスワード内のフラグがセットされ、過去のある時点で何らかの問題が
起きたことを示します。
例外をトラップする
例外発生時にトラップハンドラと呼ばれるコード片が実行されることを意味します。
システムに設定されているデフォルトのトラップハンドラは、エラーメッセージを印
字してアプリケーションを終了します。しかし、任意の方法で例外条件をクリアでき
るトラップハンドラを自分で作成することもできます。トラップハンドラを使用して、
演算から戻すべき結果を与えることさえ可能です。
例えば、0 を 0 で割ったときの結果が 1 であると想定した方が便利なアルゴリズムがあ
る場合には、その特定のケースを検出すると指定された解に置き換える無効演算例外
のユーザトラップハンドラを使用することが考えられます。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-35
浮動小数点サポート
例外のタイプ
ARM 浮動小数点環境は、5 つの例外タイプを認識します。
•
5-36
無効演算例外は、演算から有意な結果が得られない場合に発生します。この例外
は、以下のどの理由によっても発生し得ます。
—
最も単純な演算(符号のコピーと変更)を除き、シグナリング NaN に対す
る演算を実行したとき
—
- 無限数に + 無限数を加算したとき、あるいは無限数をそれ自身から減算
したとき
—
無限数に 0 を掛けたとき
—
0 を 0 で割ったとき、あるいは無限数を無限数で割ったとき
—
0 による除算からの剰余、あるいは任意の値による無限数の除算からの剰
余を求めたとき
—
負の数(-0 は含みません)の平方根を求めたとき
—
結果が収まりきらない場合に、浮動小数点数を整数に変換したとき
—
2 つの値を比較し、一方が NaN のとき
•
無効演算例外がトラップされない場合、ゼロを戻す整数への変換を除き(整数に
はクワイエット NaN が存在しないため)、上記全ての演算からクワイエット NaN
が戻されます。
•
ゼロ除算例外は、有限非ゼロ数をゼロで除算すると発生します。(0 を 0 で割る
と、無効演算例外が発生します。0 による無限数の除算は有効であり、無限数が
戻されます。)ゼロによる除算がトラップされない場合、この演算からは無限数
が戻されます。
•
オーバフロー例外は、演算結果が大き過ぎて形式に収まりきらない場合に発生し
ます。例えば、最大表現可能数同士を加算すると(P. 5-32 表 5-12 では d でマー
クしています)、この例外が発生します。オーバフローがトラップされない場合
は、丸めモードによって、この演算から無限数または最大有限数が戻されます。
•
アンダーフロー例外は、演算結果が小さ過ぎて(1 以上の Exp を持つ)正規化数
として表現できない場合に発生します。
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
浮動小数点サポート
アンダーフローが発生する状況は、この例外がトラップされるかどうかによって
異なります。
—
アンダーフローがトラップされる場合は、結果が小さ過ぎて正規化数とし
て表現できない場合に必ず発生します。
—
アンダーフローがトラップされない場合は、結果が小さ過ぎて実際に精度
が失われる場合にのみ発生します。したがって、例えば float 値
0x00800000 を 2 で割った場合でも、その結果(0x00400000)が Exp の範
囲が大きいときと同じくらい正確であるために、アンダーフローは通知さ
れません。しかし、float 値 0x00000001 に 1.5 を掛けると、アンダーフ
ローが通知されます。
(IEEE754 仕様に精通している読者のために、ARM 実装オプションでは丸
め後の小ささを検出し、精度損失を非正規化損失として検出するように
なっています。)
アンダーフローがトラップされない場合、結果は現在の丸めモードに基づ
いて、最も近い表現可能な 2 つの非正規化数のどちらかに丸められます。
精度損失は無視され、システムはできるだけ良い結果を戻します。
—
非厳密結果例外は、演算結果を丸める必要がある場合に必ず発生します。
ソフトウェア内の演算ごとにこれを検出する必要がある場合は実行速度が
著しく低下する可能性があるため、通常の浮動小数点ライブラリは非厳密
結果例外をサポートしていません。拡張浮動小数点ライブラリとハード
ウェア浮動小数点システムは全て非厳密結果をサポートしています。
非厳密結果がトラップされない場合、システムはその結果を通常の方法で
丸めます。
非厳密結果のフラグは、オーバフローとアンダーフローのどちらかがト
ラップされない場合に、これらの例外によってもセットされます。
デフォルトではどの例外もトラップされません。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
5-37
浮動小数点サポート
5-38
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
付録 A
Via ファイル構文
本付録では、ARM コンパイラ、リンカ、アセンブラ、fromELF などの ARM 開発ツー
ルに使用できる via ファイルの構文について説明します。本付録は以下のセクションか
ら構成されています。
•
via ファイルの概要:P. A-2
•
ARM DUI0067DJ-00
構文:P. A-3
Copyright © 1999-2001 ARM Limited. All rights reserved.
A-1
Via ファイル構文
A.1
via ファイルの概要
Via ファイルは、ARM 開発ツールへのコマンドライン引数およびオプションを保持し
ているプレーンテキストファイルです。via ファイルは、以下を含むほとんどの ARM
コマンドラインツールに使用することができます。
•
コンパイラ
•
アセンブラ
•
リンカ
•
ARM ライブラリアン
via ファイルは、コマンドラインから -via ツールオプションを使用しても、あるいは
CodeWarriorIDE 内からでも指定することができます。詳細については各ツールのマ
ニュアルを参照して下さい。
一般的に、via ファイルを使用することにより、ツールに対して -via を含むどのコマ
ンドラインオプションでも指定することができます。したがって、via ファイルからい
くつものネストされた via ファイルを呼び出すことができます。
A.1.1
Via ファイルの評価
via ファイルをサポートするツールが呼び出されると、このツールは以下を行います。
1.
-help や -vsn など、他の全ての引数を無視させる引数がないかどうかをスキャ
ンします。
このような引数が検出されると、via ファイルは処理されません。
2.
最初に指定されている -via via file 引数を、via ファイルから抽出した一連
の引数ワードに置き換え、via ファイル内でネストされた全ての -via コマンド
を再帰的に処理します。
3.
同じように、それ以降の -via via file 引数を出現順に処理します。
このように、via ファイルは指定された順序で処理され、各 via ファイルはネストされ
たviaファイルの処理も含めて完全に処理されてから、次のviaファイルが処理されます。
A-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
Via ファイル構文
A.2
構文
Via ファイルは以下の構文規則を守る必要があります。
•
viaファイルは一連のワードを保持するテキストファイルです。このテキストファ
イル内のワードは引数ストリングに変換されてツールに渡されます。
•
ワードは、区切られたストリングを除き、ホワイトスペースまたは行の終わりで
区切ります。例:
-split -ropi
-split-ropi
•
-- Treated as two words
-- Treated as one word
行の終わりはホワイトスペースとして処理されます。例:
-split
-ropi
上記は以下と等価です。
-split -ropi
•
二重引用符(")またはアポストロフィ(')で囲まれたストリングは、1 ワード
として処理されます。二重引用符で囲まれたワード内のアポストロフィは、通常
の文字として処理されます。アポストロフィで囲まれたワード内の二重引用符
は、通常の文字として処理されます。
二重引用符は、スペースを含むファイル名またはパス名を区切るために使用され
ます。例:
-libpath c:\Program Files\ARM\ADS\lib
-libpath "c:\Program Files\ARM\ADS\lib"
-- Three words
-- Two words
アポストロフィを使用して、二重引用符を含むワードを区切ることができます。
例:
-DNAME='"ARM Developer Suite"'
•
-- One word
括弧で囲まれた文字は 1 ワードとして処理されます。例:
-option(x, y, z)
-option (x, y, z)
-- One word
-- Two words
•
二重引用符またはアポストロフィで区切ったストリング内で逆スラッシュ(\)文
字を使用することにより、二重引用符、アポストロフィ、逆スラッシュ文字をエ
スケープできます。
•
区切られたワードにすぐ隣接するワードは、1 ワードとして処理されます。例:
-I"C:\Program Files\ARM\ADS\lib"
は、以下の 1 ワードとして処理されます。
-IC:\Program Files\ARM\ADS\lib
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
A-3
Via ファイル構文
•
先頭の非ホワイトスペース文字がセミコロン(;)またはハッシュ(#)文字で始
まる行は、コメント行です。セミコロンまたはハッシュ文字が行内の他の場所に
使用されている場合は、コメントの開始とみなされません。例:
-o objectname.axf
;this is not a comment
コメントは行の終わり、またはファイルの終わりで終了します。複数行のコメン
トも、行の一部のコメントもありません。
A-4
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
付録 B
標準 C 実装定義
本付録では、ISO C 標準規格に準拠した C を実装するために、この規格で定義されて
いる要件について説明します。本付録は以下のセクションで構成されています。
•
ARM DUI0067DJ-00
実装定義:P. B-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
B-1
標準 C 実装定義
B.1
実装定義
ISO C 標準規格(IS/IEC 9899:1990 (E))の付録 G には、移植性に関する情報が掲載され
ています。副文 G3 には、各実装で文書化する必要がある動作が一覧表示されています。
注
本付録では、コンパイラ固有の実装に関して重複する情報を掲載していません。P. 3-2
「コンパイラ固有の機能」を参照して下さい。このセクションでは、適宜参照個所を示
しています。
以下のサブセクションは、副文 G3 の関連セクションに対応しています。これらのサブ
セクションでは、ISO C 標準規格では定義されていない、実装定義の ARM C コンパイ
ラおよび ANSI C ライブラリのアスペクトを説明しています。
•
•
•
•
•
•
•
•
•
•
•
•
•
•
変換:P. B-3
環境:P. B-3
識別子:P. B-5
文字:P. B-5
整数:P. B-5
浮動小数点:P. B-5
配列とポインタ:P. B-5
レジスタ:P. B-5
構造体、共用体、列挙、ビットフィールド:P. B-6
修飾子:P. B-6
宣言子:P. B-7
ステートメント:P. B-7
前処理ディレクティブ:P. B-7
ライブラリ関数:P. B-8
注
ANSI との非適合性
コンパイラ動作は、wctype.h および wchar.h ヘッダがサポートされていない、C 標
準の言語適合性セクションで説明されている動作とは異なります。
B-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
標準 C 実装定義
B.1.1
変換
コンパイラによって生成される診断メッセージには以下の形式が使用されます。
source-file, line-number: severity: error-code: explanation
上記の severity は、以下のいずれかが設定されます。
Warning
ANSI 仕様への微小な違反に関連した、コンパイラからの有益な
メッセージです。
Error
ANSI 仕様への違反ですが、コンパイラは意図を予測することに
よって回復することができます。
Serious error
ANSI 仕様への違反であり、意図が明確でないために回復不可能
なことを示します。
Fatal error
コンパイラの限界を超えたか、コンパイラが内部障害(メモリ不
足など)を検出したことを示します。
error-code はエラータイプを識別する番号です。
explanation はエラー内容を記述するテキストです。
B.1.2
環境
ARM ベースの環境から main() への引数に対するコマンドラインのマッピングは実装
によって異なります。汎用 ARM C ライブラリは以下をサポートしています。
•
main()
•
インタラクティブデバイス:P. B-4
標準入力、出力、エラーストリーム:P. B-4
•
main()
main() に渡される引数は、ホワイトスペースが二重引用符で囲まれている場合を除
き、ホワイトスペースで区切られたコマンドラインのワード(I/O 転送を除く)です。
注
ARM DUI0067DJ-00
•
ホワイトスペース文字は、isspace() の結果が TRUE となる全ての文字です。
•
二重引用符で囲まれた二重引用符または逆スラッシュ文字 \ には、接頭文字とし
て逆スラッシュ文字を付加する必要があります。
•
I/O 転送は、二重引用符内では認識されません。
Copyright © 1999-2001 ARM Limited. All rights reserved.
B-3
標準 C 実装定義
インタラクティブデバイス
ホスティングされていない ARM C ライブラリの実装では、インタラクティブデバイス
という言葉は無意味です。汎用 ARM C ライブラリは、どちらも :tt と呼ばれ、キー
ボード入力と VDU 画面出力の処理を目的としたデバイス対をサポートしています。汎
用実装では:
•
I/O 転送が発生しない限り、:tt に接続されたどのストリームでもバッファリン
グは行われません。
•
:tt 以外への I/O 転送が発生した場合、完全ファイルバッファリングが使用され
ます(stdout と stderr の両方が同一ファイルに転送された場合は、行バッ
ファリングが使用されます)。
標準入力、出力、エラーストリーム
汎用 ARM C ライブラリを使用すれば、標準入力(stdin)、出力(stdout)ならびに
エラーストリーム(stderr)をランタイムに転送できます。例えば、mycopy がホス
トデバッガで実行され、標準入力を標準出力にコピーするプログラムである場合、以
下の行がこのプログラムを実行します。
mycopy < infile > outfile 2> errfile
次に、以下のようにこれらのファイルを転送します。
stdin
ファイルが infile に転送されます。
stdout
ファイルが outfile に転送されます。
stderr
ファイルが errfile に転送されます。
許可される転送は以下の通りです。
0< filename
filename から stdin を読み出します。
< filename
filename から stdin を読み出します。
1> filename
stdout を filename に書き込みます。
> filename
stdout を filename に書き込みます。
2> filename
B-4
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
標準 C 実装定義
stderr を filename に書き込みます。
stderr を stdout と同じ場所に書き込みます。
2>&1
>& file
stdout と stderr の両方を filename に書き込みます。
>> filename
stdout を filename に追加します。
>>& filename
stdout と stderr の両方を filename に追加します。
ファイル転送は以下のどちらかの場合にのみ実行されます。
B.1.3
•
呼び出したオペレーティングシステムがこれをサポートしている場合
•
プログラムが文字の読み出し / 書き込みを行い、C ライブラリ関数 fputc() お
よび fgetc() を置換しなかった場合
識別子
詳細については、P. 3-22「文字セットと識別子」を参照して下さい。
B.1.4
文字
詳細については、P. 3-22「文字セットと識別子」を参照して下さい。
B.1.5
整数
詳細については、P. 3-24「整数」を参照して下さい。
B.1.6
浮動小数点
詳細については、P. 3-25「Float」を参照して下さい。
B.1.7
配列とポインタ
詳細については、P. 3-25「配列とポインタ」を参照して下さい。
B.1.8
レジスタ
ARM コンパイラを使用する場合は、任意の数のローカルオブジェクト(自動変数)を
記憶域クラス register で宣言することができます。ARM コンパイラが register
記憶域クラスをどのように実装するかについては、P. 3-10「変数宣言キーワード」を参
照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
B-5
標準 C 実装定義
B.1.9
構造体、共用体、列挙、ビットフィールド
ISO/IEC C 標準では、構造データタイプに関する以下の実装情報を文書化することが規
定されています。
•
共用体のメンバに、異なるタイプのメンバを使用してアクセスしたときの結果
•
構造体メンバのパディングおよびアライメント
•
プレーン int ビットフィールドを signed int ビットフィールドと unsigned
int ビットフィールドのどちらとして処理するか
•
ユニット内のビットフィールドの割り当て順序
•
ビットフィールドが記憶単位境界にまたがることが可能かどうか
•
列挙タイプの値を表現する整数タイプ
実装情報については、P. 3-22「C および C++ の実装情報」を参照して下さい。
共用体
詳細については、P. 3-27「共用体」を参照して下さい。
列挙
詳細については、P. 3-27「列挙」を参照して下さい。
構造体のパディングおよびアライメント
詳細については、P. 3-28「構造体」を参照して下さい。
Bitfields
詳細については、P. 3-29「ビットフィールド」を参照して下さい。
B.1.10
修飾子
揮発性修飾タイプのオブジェクトは、そのオブジェクトの任意のワードまたはバイト
(ならびにハーフワードをサポートしている ARM アーキテクチャではハーフワード)
の読み出しまたは書き込みが行われるときにアクセスされます。揮発性修飾オブジェ
クトの場合、読み出しと書き込みはソースコードによって自動的に定義された順番で、
ソースコードによって直接自動的に発生します。
B-6
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
標準 C 実装定義
揮発性修飾 short へのアクセスによる作用は、ハーフワードをサポートしていない
ARM アーキテクチャでは定義されていません。
B.1.11
宣言子
算術演算、構造体あるいは共用体タイプを修正できる宣言子の数は、使用可能なメモ
リによってのみ制限されます。
B.1.12
ステートメント
switch ステートメント内のケース値の数は、メモリによってのみ制限されます。
式の評価
コンパイラは式を評価する前に、適切な C または C++ 標準で規定されている通常の算
術変換(プロモーション)を実行します。
注
•
コンパイラは、括弧がある場合でも、優先度が等しい関連・可換演算子のみにつ
いて、式の再順序付けを行うことがあります。例えば、a、b、c が整数式である
場合、a + (b - c) は (a + b) - c として評価されることがあります。
•
シーケンスポイント間では、コンパイラは括弧に関係なく任意の順序で式を評価
することができます。したがって、シーケンスポイント間の式の副作用は任意の
順序で発生し得ます。
コンパイラは関数の引数を任意の順序で評価することができます。
•
評価順序のアスペクトは関連標準では規定されておらず、ARM コンパイラのリリース
間で異なる場合があります。
B.1.13
前処理ディレクティブ
ANSI 標準 C ヘッダファイルはコンパイラ内にストアされ、#include <stdio.h> な
どのように、標準で規定されている通りに参照することができます。
インクルード可能なソースファイルの二重引用符で囲まれた名前がサポートされま
す。コンパイラはホストのファイル名または UNIX ファイル名をサポートします。非
UNIX ホスト上で UNIX ファイル名を使用すると、コンパイラはこれをローカルな等価
な名前に変換しようとします。
認識される #pragma ディレクティブについては、P. 3-2「プラグマ」を参照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
B-7
標準 C 実装定義
B.1.14
ライブラリ関数
ANSI C ライブラリバリアントの一覧については、P. 4-2「ランタイムライブラリについ
て」を参照して下さい。
各 C ライブラリの厳密な特性は、個々の実装に固有のものです。汎用 ARM C ライブラ
リには以下の機能があります。
•
マクロ NULL を整数定数 0 に展開します。
•
プログラムが printf などの予約済みの外部識別子を再定義する場合、そのプロ
グラムが標準ライブラリにリンクするときにエラーが発生する可能性がありま
す。標準ライブラリにリンクしない場合は、エラーは検出されません。
•
assert() 関数は stderr の以下のメッセージを印字して、abort() 関数を呼
び出します。
*** assertion failed: expression, file name, line number
数学関数、ロケール、シグナル、I/O 関数の実装情報については、P. 4-2「ランタイム
ライブラリについて」を参照して下さい。
B-8
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
付録 C
標準 C++ 実装定義
ARM C++ コンパイラは、C++ に関する ISO/IEC 標準規格で説明されている言語機能の
大半をサポートしています。本付録では、この標準で定義されている C++ 言語機能と、
その言語機能が ARM C++ でサポートされているかどうかの状態について説明します。
注
ARM C++ に ISO/IEC との相違点がある理由は、組み込み C++(EC++)の準拠性要件
が ISO/IEC C++ の要件と異なるためです。
このセクションでは、標準 C の実装部分と重複する情報は掲載していません。付録 B
「標準 C 実装定義」を参照して下さい。
ANSI C モードで使用する場合は、ARM C++ コンパイラは ARM C コンパイラと同じで
す。C または C++ に固有の実装機能がある場合には、本文中にその旨を明記していま
す。標準 C++ の拡張については、P. 3-17「言語拡張」を参照して下さい。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
C-1
標準 C++ 実装定義
C.1
EC++ のサポート
ARM C++ は、引数に依存する名前のルックアップ(Koenig ルックアップ)を除き、組
み込み C++ の定義で必要とされている全ての機能をサポートしています。
C-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
標準 C++ 実装定義
C.2
積分変換
積分変換においてデスティネーションのタイプが符号付きである場合、デスティネー
ションのタイプとビットフィールド幅で表現できる値であれば、その値は変更されま
せん。これ以外の場合は、その値はデスティネーションタイプのサイズに合うように
切り落とされます。
注
このセクションは、ISO/IEC 標準規格セクション 4.7 に関連しています。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
C-3
標準 C++ 実装定義
C.3
純仮想関数の呼び出し
純仮想関数が呼び出されると、シグナル SIGPVFN が生成されます。デフォルトのシ
グナルハンドラはエラーメッセージを印字して終了します。P. 4-54
「__default_signal_handler()」を参照して下さい。
C-4
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
標準 C++ 実装定義
C.4
二次的な言語機能のサポート
表 C-1 は、本リリースの ARM C++ でサポートされている二次言語機能を示しています。
表 C-1 二次言語機能のサポート
二次機能
atexit
ARM DUI0067DJ-00
サポート
「The Annotated C++ Reference,
Addison-Wesley, 1991」で定義されている通
りに実装されています。
ネームスペース
×
ランタイムタイプ識別(RTTI)
一部。スタティックタイプと非多様タイプ
の式にはTypeidがサポートされています。
新方式のキャストに関する制約条件を参照
して下さい。
新方式のキャスト
一部。ARM C++ は新方式キャストの構文を
サポートしていますが、制約条件を課して
いません。新方式キャストは旧方式キャス
トと同じように動作します。
配列新規 / 削除
○
ノースロー new
○
bool タイプ
○
wchar_t タイプ
一部。unsigned short の暗黙の typedef
です。
explicit キーワード
○
スタティックメンバ定数
○
extern inline
○
完全リンケージ仕様
○
for ループ変数有効範囲変更
○
コバリアント復帰タイプ
○(ただし、非最差ベースクラスでは不可)
デフォルトテンプレート引数
一部(引数は他のテンプレート引数に依存
しません)
テンプレート例示ディレクティブ
○
テンプレート特殊化ディレクティブ
○
Copyright © 1999-2001 ARM Limited. All rights reserved.
C-5
標準 C++ 実装定義
表 C-1 二次言語機能のサポート(続き)
二次言語機能のサポート(続き)
C-6
二次機能
サポート
typename キーワード
○
メンバテンプレート
○
クラステンプレートの部分特殊化
○
関数テンプレートの部分順序付け
○
汎用文字の名前
×
Koenig ルックアップ
×
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
標準 C++ 実装定義
C.5
主要言語機能のサポート
表 C-2 は、本リリースの ARM C++ がサポートしている主要言語機能を示しています。
表 C-2 主要言語機能のサポート
ARM DUI0067DJ-00
主要機能
ISO/IEC 標準
セクション
サポート
コア言語
1 ~ 13
○
テンプレート
14
テンプレートは一部サポートされています。
例外
15
×
ライブラリ
17 ~ 27
P. C-8「標準 C++ ライブラリ実装定義」、第 4
章「C および C++ ライブラリ」を参照して下
さい。
Copyright © 1999-2001 ARM Limited. All rights reserved.
C-7
標準 C++ 実装定義
C.6
標準 C++ ライブラリ実装定義
Rouge Wave ライブラリのバージョン 2.01.01 には、標準で定義されているライブラリ
にサブセットが含まれています。これらは 1996 年 12 月の ISO/IEC 標準バージョンと
は若干異なります。実装定義の詳細については、P. 4-96「標準 C++ ライブラリ実装定
義」を参照して下さい。
標準 C++ ライブラリをユーザ定義関数とともに使用して、ターゲット依存アプリケー
ションを作成することができます。詳細については、P. 4-2「ランタイムライブラリに
ついて」を参照して下さい。
C-8
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
付録 D
C および C++ コンパイラの実装に関する制限
本付録では、ARM C コンパイラおよび C++ コンパイラの実装に関する制限を説明しま
す。本付録は以下のセクションから構成されています。
•
C++ ISO/IEC 標準の制限:P. D-2
•
•
•
ARM DUI0067DJ-00
内部制限:P. D-4
積分数の制限:P. D-5
浮動小数点数の制限:P. D-6
Copyright © 1999-2001 ARM Limited. All rights reserved.
D-1
C および C++ コンパイラの実装に関する制限
D.1
C++ ISO/IEC 標準の制限
ISO/IEC C++ 標準では、準拠するコンパイラが受け入れなければならない最小限の制限
が推奨されています。コンパイラ間でアプリケーションを移植する場合は、この点に
注意する必要があります。表 D-1 は、この制限の一覧を示しています。メモリの制限
は、使用可能なメモリによって課される制限以外は、ARM コンパイラによって課され
る制限がないことを示しています。
表 D-1 実装の制限
推奨
ARM
複合ステートメント、反復制御構造、選択制御構造のネストレベル
256
メモリ
条件付きインクルードのネストレベル
256
メモリ
宣言における算術、構造体、共用体、不完全のいずれかのタイプを
修正するポインタ、配列、関数の宣言子(組み合わせ自由)
256
メモリ
完全式内の括弧で囲んだ挿入式のネストレベル
256
メモリ
内部識別子またはマクロ名の初期文字数
1024
1024
外部識別子の初期文字数
1024
1024
1 変換単位の外部識別子
65536
メモリ
1024
メモリ
65536
メモリ
1 関数宣言内のパラメータ。多重定義解決は最初の 32 個の引数だけ
に影響されます。
256
メモリ
1 関数呼び出し内の引数。多重定義解決は最初の 32 個の引数だけに
影響されます。
256
メモリ
1 マクロ定義内のパラメータ
256
メモリ
1 マクロ呼び出し内の引数
256
メモリ
1 論理ソース行内の文字数
65536
メモリ
文字ストリングリテラルまたは結合後のワイドストリングリテラル
の文字数
65536
メモリ
262144
268435454
256
メモリ
説明
1 ブロック内で宣言されるブロック有効範囲の識別子
1 変換単位で同時に定義されるマクロ識別子
C または C++ オブジェクト(配列を含む)のサイズ
#include ファイルのネストレベル
D-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラの実装に関する制限
表 D-1 実装の制限(続き)
実装の制限(続き)
推奨
ARM
スイッチステートメントのケースラベル、ネストされたスイッチス
テートメントのケースラベルを除く
16384
メモリ
1 クラス、構造体、共用体のデータメンバ
16384
メモリ
4096
メモリ
256
メモリ
32
33
16384
メモリ
1 クラスの直接ベースクラス
1024
メモリ
1 クラス内で宣言されるメンバ
4096
メモリ
16384
メモリ
クラスの直接 / 間接仮想ベース
1024
メモリ
クラスのスタティックメンバ
1024
メモリ
クラス内のフレンド宣言
4096
メモリ
クラス内のアクセス制御宣言
4096
メモリ
構成子定義内のメンバイニシャライザ
6144
メモリ
256
メモリ
ネストされる外部指定
1024
メモリ
テンプレート宣言内のテンプレート引数
1024
メモリ
再帰的にネストされるテンプレート例示
17
メモリ
試行ブロック単位のハンドラ
256
メモリ
1 関数宣言に関するスロー指定
256
メモリ
説明
1 列挙内の列挙定数
構造宣言リスト内でネストされるクラス、構造体、共用体定義のレ
ベル
atexit() によって登録される関数
直接 / 間接ベースクラス
アクセス可能かどうかに関係なく、クラス内で最終的にオーバライ
ドされる仮想関数
1 識別子の有効範囲修飾
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
D-3
C および C++ コンパイラの実装に関する制限
D.2
内部制限
P. D-2 表 D-1 の制限に加え、コンパイラには表 D-2 が示す内部制限があります。
表 D-2 内部制限
説明
ARM
C ソースファイル内の最大行数(行数がこれを超えるファイルの場合、行
番号の内部形式が 16 ビット符号なしショートであるため、メッセージに
ラップされた行番号が表示されます)。
65536
1 変換単位内の再配置可能参照の最大数
メモリ
仮想レジスタの最大数
65536
多重定義引数の最大数
256
4096
切り取られる前の符号化された名前の文字数
ビットフィールド(CHAR_BIT)以外の最小オブジェクト内のビット数
サポートされているロケールに対するマルチバイト文字の最大数
(MB_LEN_MAX)
D-4
Copyright © 1999-2001 ARM Limited. All rights reserved.
8
1
ARM DUI0067DJ-00
C および C++ コンパイラの実装に関する制限
D.3
積分数の制限
表 D-3 は、ARM C および C++ における積分数の範囲を示しています。表の第 3 列は、
範囲終点の数値を示しています。第 4 列は、ARM コンパイラが解釈するビットパタン
(16 進数)を示しています。
定数を使用する場合は、サイズと符号の選択に注意して下さい。定数は、10 進と 16 進
/8 進では解釈のされ方が異なります。詳細については適切な C または C++ 標準、ある
いは推奨する C および C++ の参考書をご覧下さい(P. ix「参考資料」参照)。
表 D-3 整数範囲
終点
16 進数
char の最大値
255
0xFF
CHAR_MIN
char の最小値
0
0x00
SCHAR_MAX
signed char の最大値
127
0x7F
SCHAR_MIN
signed char の最小値
–128
0x80
UCHAR_MAX
unsigned char の最大値
255
0xFF
SHRT_MAX
short の最大値
32767
0x7FFF
SHRT_MIN
short の最小値
–32768
0x8000
USHRT_MAX
unsigned short の最大値
65535
0xFFFF
INT_MAX
int の最大値
2147483647
0x7FFFFFFF
INT_MIN
int の最小値
–2147483648
0x80000000
LONG_MAX
long の最大値
2147483647
0x7FFFFFFF
LONG_MIN
long の最小値
–2147483648
0x80000000
ULONG_MAX
unsigned long の最大値
4294967295
0xFFFFFFFF
LONG_LONG_MAX
long long の最大値
9.2E+18
0x7FFFFFFF
FFFFFFFF
LONG_LONG_MIN
long long の最小値
–9.2E+18
0x80000000
00000000
ULONG_LONG_MAX
unsigned long long の最大値
1.8E+19
0xFFFFFFFF
FFFFFFFF
定数
意味
CHAR_MAX
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
D-5
C および C++ コンパイラの実装に関する制限
D.4
浮動小数点数の制限
表 D-4 および P. D-7 表 D-5 は、ARM コンパイラと Thumb コンパイラにおける浮動小
数点数の指数部、範囲、制限を示しています。
注
浮動小数点数をより短い浮動小数点数に変換する場合は、最近の表現可能数に丸めら
れます。
浮動小数点算術演算の特性は IEEE754 に準拠します。
表 D-4 浮動小数点の制限
定数
意味
FLT_MAX
float の最大値
3.40282347e+38F
FLT_MIN
float の最小値
1.17549435e–38F
DBL_MAX
double の最大値
1.79769313486231571e+308
DBL_MIN
double の最小値
2.22507385850720138e–308
LDBL_MAX
long double の最大値
1.79769313486231571e+308
LDBL_MIN
long double の最小値
2.22507385850720138e–308
FLT_MAX_EXP
タイプ float の基数 2 の最大指数
128
FLT_MIN_EXP
タイプ float の基数 2 の最小指数
–125
DBL_MAX_EXP
タイプ double の基数 2 の最大指数
1024
DBL_MIN_EXP
タイプ double の基数 2 の最小指数
–1021
LDBL_MAX_EXP
タイプ long double の基数 2 の最大指数
1024
LDBL_MIN_EXP
タイプ long double の基数 2 の最小指数
–1021
FLT_MAX_10_EXP
タイプ float の基数 10 の最大指数
38
FLT_MIN_10_EXP
タイプ float の基数 10 の最小指数
–37
DBL_MAX_10_EXP
タイプ double の基数 10 の最大指数
308
D-6
値
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
C および C++ コンパイラの実装に関する制限
表 D-4 浮動小数点の制限 (続き)
定数
意味
値
DBL_MIN_10_EXP
タイプ double の基数 10 の最小指数
LDBL_MAX_10_EXP
タイプ long double の基数 10 の最大指数
308
LDBL_MIN_10_EXP
タイプ long double の基数 10 の最小指数
–307
–307
表 D-5 他の浮動小数点特性
定数
意味
FLT_RADIX
ARM 浮動小数点数表現の基数
FLT_ROUNDS
浮動小数点数の丸めモード(最近値)
FLT_DIG
float の 10 進数の精度
DBL_DIG
double の 10 進数の精度
15
LDBL_DIG
long double の 10 進数の精度
15
FLT_MANT_DIG
タイプ float の 2 進数の精度
24
DBL_MANT_DIG
タイプ double の 2 進数の精度
53
LDBL_MANT_DIG
タイプ long double の 2 進数の精度
53
FLT_EPSILON
タイプ float で 1.0 + x != 1.0 となる x の正の最小値
DBL_EPSILON
タイプ double で 1.0 + x != 1.0 となる x の正の最小値
LDBL_EPSILON
タイプ long double で 1.0 + x != 1.0 となる x の正の最小値
ARM DUI0067DJ-00
値
Copyright © 1999-2001 ARM Limited. All rights reserved.
2
(nearest) 1
6
1.19209290e–7F
2.2204460492503131e–16
2.2204460492503131e–16L
D-7
C および C++ コンパイラの実装に関する制限
D-8
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
用語集
ADS
ARM デベロッパスイート参照。
ANSI
米国規格協会(American National Standards Institute)。他の中でも特にコンピュータソフ
トウェアの規格を規定する団体です。
API
アプリケーションプログラムインタフェース。
Architecture
(アーキテクチャ)
同様の特性を持つプロセッサグループの識別に使用される用語。
ARM Developer Suite(
(ARM デベロッパスイート)
支援文書およびサンプルを含み、ARM ファミリの RISC プロセッサ用アプリケーショ
ンを記述してデバッグするためのアプリケーションスイート。
ARMulator
命令セットシミュレータ。各種 ARM プロセッサの命令セットとアーキテクチャをシ
ミュレートするモジュールの集合です。
ATPCS
ARM/Thumb プロシージャコール標準。サブルーチンコールに関するレジスタとスタッ
クの使用方法を定義します。
Big-endian(ビッグ
(ビッグ
エンディアン)
ワードの最下位バイトが最上位バイトよりも上位アドレスに位置するメモリ構成。
Byte(バイト)
(バイト)
8 ビットで構成されるメモリ域の単位。
Char
1 文字の記憶域単位。ARM 設計では 1 バイトを使用して 1 文字をストアし、1 整数を
使用して 2 ~ 4 文字をストアします。
Class
イメージに関連する C++ クラス。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
Glossary-1
用語集
Coprocessor
(コプロセッサ)
特定の操作に使用される補助プロセッサ。一般的には、浮動小数点数値計算、シグナ
ル処理、メモリ管理などに使用されます。
Current place
(現在位置)
コンパイラ用語では、コンパイルプロセスにインクルードされるファイルを含むディ
レクトリ。
Debugger
(デバッガ)
別のアプリケーションの実行を監視 • 制御するアプリケーション。通常はアプリケー
ションプログラムフロー内のエラーを検出する目的で使用します。
Deprecated
(廃止予定)
廃止予定のオプションまたは機能は、使用しないことを強く推奨します。廃止予定の
オプションおよび機能は、本製品の今後のバージョンではサポートされません。
Double word
(ダブルワード)
64 ビット単位の情報。ダブルワードの内容は、指定されていない限り符号なし整数と
みなされます。
DWARF
Debug With Arbitrary Record Format(任意レコード形式でのデバッグ)の略。
EC++
組み込みアプリケーション用に設計された C++ のバリアント。
ELF
実行リンク形式。
Environment(環境)
(環境)
アプリケーションを実行する実ハードウェアとオペレーティングシステムのこと。
Executable and linking format(実行リンク形式)
(実行リンク形式)
ARM デベロッパスイートで使用している業界標準バイナリファイル形式。ELF オブ
ジェクト形式は、armcc や armasm などの ARM オブジェクト生成ツールによって生成
されます。ARM リンカは ELF オブジェクトファイルを受け取り、ELF 実行ファイルま
たは部分リンク ELF オブジェクトを出力することができます。
Execution view
(実行ビュー)
イメージがメモリにロードされて実行を開始した後の、領域およびセクションのアド
レス。
Flash memory
(フラッシュメモリ)
アプリケーションコードの保持に頻繁に使用される不揮発性メモリ。
Globals
(グローバル)
グローバル有効範囲を持つイメージの変数または関数。
Halfword
(ハーフワード)
16 ビット単位の情報。ハーフワードの内容は、指定されていない限り符号なし整数と
みなされます。
Heap(ヒープ)
(ヒープ)
コンピュータメモリ内で、新しい変数の作成に使用可能な部分。
Host(ホスト)
(ホスト)
別のコンピュータにデータや他のサービスを提供するコンピュータ。
IDE
統合開発環境(例:CodeWarrior IDE)。
Image(イメージ)
(イメージ)
実行を目的にプロセッサにロードされた実行可能ファイル。
プロセッサにロードされ、実行スレッドを与えられたバイナリ実行ファイル。1 つのイ
メージが複数のスレッドをもつ場合もあります。イメージは、デフォルトのスレッド
が実行されるプロセッサに関連付けられます。
Glossary-2
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
用語集
Inline(インライン)
(インライン)
汎用サブルーチンを保持せずに、使用されるたびにコード内で繰り返される関数。C ま
たは C++ プログラム内に配置されるアセンブラコードのこと。
出力セクション参照。
Interrupt(割り込み)
(割り込み)
外部シグナルなどが原因で、アプリケーションの通常処理シーケンス内で生じる変更。
Interworking(イン
(イン
ターワーキング)
ARM コードと Thumb コードの両方を使用するアプリケーションの生成。
Library
(ライブラリ)
アセンブラまたはコンパイラの出力オブジェクトの集合をグループ化した 1 つのリポ
ジトリ。
Linker(リンカ)
(リンカ)
1 つ以上のソースアセンブラ / コンパイラ出力オブジェクトから 1 つのイメージを生成
するソフトウェア。
Little-endian(リトル
(リトル
エンディアン)
ワードの最下位バイトが最上位バイトよりも下位アドレスに位置するメモリ構成。
Load view
(ロードビュー)
PIC
イメージがメモリにロードされ、実行がまだ開始されていないときの領域およびセク
ションのアドレス。
位置独立コード。
ROPI 参照。
PID
位置独立データ。
RWPI 参照。
Redirection(転送)
(転送)
デフォルト出力を異なるデスティネーションに送信する、あるいはデフォルト入力を
異なるソースから受信するプロセス。転送は、転送しなければコンピュータ画面に表
示されるテキストをファイルに出力する目的で使用するのが一般的です。
Reentrancy
(リエントランシ)
サブルーチンコードの 1 インスタンス以上をアクディブにするサブルーチンの機能。サ
ブルーチンコールの各インスタンスは、必要とするスタティックデータの独自のコ
ピーを保持します。
Remapping
(再マッピング)
物理メモリまたはデバイスのアドレスを、アプリケーションの実行開始後に変更する
こと。通常、この動作は初期化完了後に ROM を RAM に置き換えるために行われます。
Retargeting(再ター
(再ター
ゲッティング)
ある実行環境に合わせて設計されたコードを別の実行環境に移動するプロセス。
ROPI
Read Only Position Independent。コードおよび読み出し専用データのアドレスはランタ
イムに変更することが可能です。
RTOS
リアルタイムオペレーティングシステム。
RWPI
Read Write Position Independent。読み出し / 書き込みデータのアドレスはランタイムに
変更することが可能です。
ARM DUI0067DJ-00
Copyright © 1999-2001 ARM Limited. All rights reserved.
Glossary-3
用語集
Scatter-loading
(分散ローディング)
1 つの大きなブロックを使用するのではなく、コードセクションとデータセクションの
アドレスを個々に割り当て、これらをグループ化すること。
Scope(有効範囲)
(有効範囲)
アプリケーションコード内の特定の位置における関数または変数のアクセシビリ
ティ。グローバル有効範囲を持つシンボルは常にアクセス可能です。ローカルまたは
プライベート有効範囲を持つシンボルには、同じサブルーチンまたはプロジェクト内
のコードだけがアクセスできます。
Semihosting
(セミホスティング)
ターゲットがアプリケーションコード内で発生した I/O 要求を、その I/O 自体をサポー
トしようとするのではなく、ホストシステムに通知するメカニズム。
Signal(シグナル)
(シグナル)
異常なプロセッサ動作を通知するもの。
Stack(スタック)
(スタック)
サブルーチンを呼び出すコードのリターンアドレスを記録するために使用されるメモ
リの部分。スタックは、パラメータおよび一時変数にも使用することができます。
SWI
ソフトウェア割り込み。プロセッサにプログラマが指定したサブルーチンを呼び出さ
せる命令。ARM によってセミホスティングを処理するために使用されます。
Target(ターゲット)
(ターゲット)
ターゲットアプリケーションを実行する実ターゲットプロセッサ(実際の、またはシ
ミュレートされたプロセッサ)。
デバッギングセッションにおける基本オブジェクト。デバッギングシステムの基礎。
ターゲットソフトウェアを実行する環境。実質的には、実際の、またはシミュレート
されたプロセッサの集合を意味します。
Veneer(ベニア)
(ベニア)
プロセッサ状態の変更要件、あるいは現在のプロセッサ状態では到達不可能なアドレ
スへの分岐要件があるときに、サブルーチンコールに使用される小さなコードブロッ
ク。
Volatile(揮発性)
(揮発性)
内容を実行中のアプリケーションとは無関係に変更し得るメモリアドレスは、揮発性
と記述されます。一般的にはメモリマップされるペリフェラルを指します。
メモリマップ参照。
VFP
ベクタ浮動小数点。複数のデータ値を 1 つの命令で処理できる浮動小数点コプロセッ
サの標準。
Word(ワード)
(ワード)
32 ビット単位の情報。ワードの内容は、指定されていない限り符号なし整数とみなさ
れます。
ZI
ゼロ初期化。初期値を持たない変数の保持に使用される R/W メモリです。通常、この
メモリはリセット時にゼロに設定されます。
Glossary-4
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
Index
The items in this index are listed in alphabetical order, with symbols and numerics appearing at the end. The references given
are to page numbers.
A
abort() 4-22, 4-90, 4-95
Access control error 2-37
acosh function 5-25
Alignment
bitfields, C and C++ 3-31
data types, C and C++ 3-24
field alignment, C and C++ 3-28
structures, C and C++ 3-28
alloca() 4-13, 4-59, 4-101
ANSI C library
Angel definitions 4-7
API definitions 4-11
avoiding semihosting 4-10
build options 4-3
dependencies 4-74
directory structure 4-4
error handling 4-50
error handling functions 4-50
execution environment 4-20
FILEHANDLE 4-77
implementation definition 4-90
ARM DUI0067DJ-00
ISO C standard 4-2
I/O 4-74
locale 4-26
locale utility functions 4-29
memory model 4-66
miscellaneous functions 4-25
naming conventions 4-104
non-hosted environment 4-8
operating system functions 4-25
program exit 4-50
programing with 4-6
programing without 4-13
re-implementing functions 4-7
semihosting 4-6
semihosting dependencies 4-8
signals 4-50
static data 4-4
static data access 4-25
storage management 4-57
used by C++ library 4-96
variants 4-90
Arithmetic conversions, C and C++
B-7
armcpp 2-20, 3-32
ARMINC environment variable 2-6,
2-7
Arrays
new, delete, C++ C-5
asctime() 4-19
asinh function 5-25
Assembly language
inline assemblers 2-3
assert() 4-22, 4-90
Assignment operator warning 2-31
atanh function 5-25
atexit() 4-13, 4-19, 4-51
atoll() 4-98
ato*() 4-19
ATPCS
compiler options 2-12
specifying variants 2-12
/nointerwork 2-12
/noropi 2-13
/noswstackcheck 2-14
/rwpi 2-13
/swstackcheck 2-14
Copyright © 1999-2001 ARM Limited. All rights reserved.
Index-1
Index
B
nothrow, new C-5
overlapping of bitfields 3-30
__backspace() 4-10, 4-15, 4-75
pointers, subtraction 3-27
Base classes 3-28
runtime type identification C-5
Berkeley UNIX
signals 4-54
search paths 2-6
Standard C++
Bessel functions 5-27, 5-29
and error messages 2-36
Bitfields 3-31
inline assembler 3-19
overlapping, C and C++ 3-30
limits D-2
bool, C++ C-5
static member constants C-5
byte order 2-28
structures, see Structures, C and C++
virtual functions 3-28
wchar_t C-5
wide characters C-5
C
calloc() 4-19, 4-57
C and C++
Casts, new style, C++ C-5
ANSI C
Characters after preprocessor directive
compiler mode 2-3
error 2-37
header files 2-6, 2-8, 2-33
char, changing sign of 2-30
language extensions 3-18
Checking arguments for
mode, compilers 2-3
printf/scanf-like functions 3-3
suppressing warnings 2-31
Chop floating point 5-34
arrays, new, delete C-5
clock() 4-19, 4-21, 4-85
bitfields, overlapping 3-30
_clock_init() 4-85
bool C-5
Code
Casts, new style C-5
controlling generation with pragmas
compilers, using 2-1
3-4
compilers,variants 2-2
sections, compiler controls 2-28
C++ implementation definition C-1 Command syntax
C++ language feature support C-1
compilers 2-9
C++ library implementation C-8
Comments
C++ templates C-7
character set, C and C++ 3-22
delete array C-5
in inline assembler 3-19
exceptions C-7
retaining in preprocessor output
expression evaluation B-7
2-16
field alignment 3-28
Common sub-expression elimination
floating-point operations 3-26
3-6
global variables, alignment 3-24
Compiler options
keywords, see Keywords, C and C++
-ansi 2-14
language extensions 3-18
-ansic 2-14
libraries, see C++ library
-apcs 2-12
limits, floating-point D-6
see also ATPCS variants
linkage specification C-5
-auto_float_constants 2-26
mode in compilers 2-3
-bigend 2-28
namespaces C-5
-C 2-16
natural alignment 3-24
-c 2-17
new array C-5
-cpp 2-14
new style casts C-5
-cpu 2-19
Non-ANSI include warning 2-33
C++ 2-14
Index-2
-D 2-16
-depend 2-18
-dwarf2 2-23
-E 2-11, 2-15
-Ea 2-37
-Ec 2-37
-Ef 2-37
-Ei 2-37
-embeddedcplusplus 2-14
-Ep 2-37
-errors 2-11
-fa 2-34
-fd 2-6
-fh 2-35, 2-37
-fi 2-18
-fk 2-6, 2-7, 2-15
-fp 2-35
-fpu 2-21
-fs 2-19
-fu 2-18
-fv 2-35
-fy 2-30, 3-27
-g 2-22
-help 2-11
-I 2-6, 2-7, 2-15
-j 2-6, 2-7, 2-15
-list 2-17
-littleend 2-28
-M 2-16
-O 2-23
-o 2-18
-Oautoinline 2-25
-Oinline 2-24
-Ono_autoinline 2-25
-Ono_data_reorder 2-25
-Ono_ldrd 2-25
-Ospace 2-24
-Otime 2-24
reading from a file 2-10
-S 2-18
-split_ldm 2-26
-strict 2-14
syntax 2-9
-U 2-16
-Wa 2-31
-Wb 2-31
-Wd 2-31
-We 2-31
-Wf 2-31
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
Index
-Wg 2-32
-Wi 2-32
-Wk 2-27
-Wl 2-32
-Wm 2-32
-Wn 2-32
-Wo 2-33
-Wp 2-33
-Wq 2-33
-Wr 2-33
-Ws 2-33
-Wt 2-33
-Wu 2-34
-Wv 2-34
-Wx 2-34
-Wy 2-34
-zas 2-30
-zc 2-30
-zo 2-28
Compilers
ANSI standard C 2-14
ANSI standard C++ 2-14
architecture, specifying 2-19
big-endian code 2-28
C and C++ 2-1
code generation 2-23
debug tables 2-22
defining symbols 2-16
EC++ 2-14
errors, redirecting 2-11
header files 2-6
inline assemblers 2-3
invoking 2-9
keyboard input 2-11
language, setting source 2-14
library support 2-3
listing files 2-5
little-endian code 2-28
modes, see Source language modes
object files 2-5
output files 2-5, 2-15
output format, specifying 2-17
source language modes 2-3
specifying output format 2-17
standards 2-2, 2-3
supported filenames 2-4
suppressing error messages 2-36
target processor 2-19
Thumb code 2-20
ARM DUI0067DJ-00
Containers, for bitfields, C and C++
3-31
_controlfp 5-12
Copy sign function 5-25
__cplusplus, C and C++ macro 3-32
ctime() 4-19
CTYPE 4-11
Cube root function 5-25
Current place, the 2-6
excluding 2-15
C9X draft standard 5-14, 5-17
C++
keywords, see Keywords, C++
C++ libraries
signals used 4-54
C++ library 4-2
differences 4-97
HTML documentation 4-96
implementation C-8
requirements on ANSI C 4-96
Rogue Wave 4-4
Rogue Wave implementation 4-96
source 4-4
D
Data areas
compiler controls 2-28
Data types, C and C++
alignment 3-24
long double 3-18
long long 3-18
size 3-24
structured 3-27, B-6
Debug tables 2-22
generating 2-22
limiting size 2-22
Debugging
optimization options 2-23
Declaration lacks type/storage-class
error 2-37
Default template arguments, C++ C-5
__default_signal_handler() 4-10, 4-54,
4-50, 4-52
Defining symbols
C and C++ 2-16
Delete array, C++ C-5
Denormal 5-32
Double precision 5-31
DWARF 2-22
E
e to the x minus 1 function 5-26
EC++
mode, compilers 2-3
Enumerations
as signed integers 2-30
enum, C and C++ keyword 3-27, B-6
Environment variables
ARMINC 2-6, 2-7
Epsilon 5-32
errno 4-50
Error messages
compiler perror() 4-95
compilers
access control 2-37
characters after preprocessor
directive 2-37
controlling 2-36
declaration lacks
type/storage-class 2-37
implicit cast 2-37
redirecting 2-11
severity B-3
unclean casts 2-37
library 4-50
Error messaging
tailoring handling 4-50
Evaluating expressions, C and C++
B-7
Exceptions
floating-point 5-35
Exceptions, C++ C-7
Execution
environment 4-20
speed 2-23
exit() 4-21, 4-51, 4-95
explicit, C++ keyword C-5
Exponent function 5-27, 5-28
Expression evaluation in C and C++
B-7
extern
C and C++ keyword 3-28
inline C++ keyword C-5
Copyright © 1999-2001 ARM Limited. All rights reserved.
Index-3
Index
F
ferror() 4-10, 4-15, 4-75
fgetc() 4-10, 4-15, 4-75
fgets() 4-10, 4-76
Field alignment, C and C++ 3-28
FILEHANDLE 4-77
Files
header 2-4
include 2-6
in-memory file system 2-6
naming conventions 2-4
object 2-5
redirecting to 2-11
source 2-4
via options 2-10
_findlocale() 4-29, 4-42
_find_locale() 4-29
_fisatty() 4-101
float type 5-30
Floating-point
bit patterns 5-32
chop 5-34
comparison 5-7
constants 3-20
custom trap handlers 5-18
C9X draft standard 5-14, 5-17
denormal 5-32
double precision 5-31
environment control 5-8
exceptions 5-35
float type 5-30
flush to zero mode 5-9
IEEE 754 arithmetic 5-30
inventing results 5-35
limits in C and C++ D-6
machine epsilon 5-32
mathlib 5-24
minus zero 5-32
NaN 5-32
normalized 5-32
number format conversion 5-5, 5-6
operations in C and C++ 3-26
plus zero 5-32
range reduction 5-24
rounding 5-34
rounding mode control 5-9, 5-13,
5-16
single-precision 5-30
Index-4
sticky flags 5-8, 5-11, 5-14
trapping exceptions 5-35
truncate 5-34
Floating-point arithmetic
C routines 5-4
Floating-point functions
acosh 5-25
asinh 5-25
atanh 5-25
Bessel 5-27, 5-29
_controlfp 5-12
copy sign 5-25
cube root 5-25
e to the x minus 1 5-26
exponent 5-27, 5-28
__fp_status 5-10
fractional part 5-29
gamma 5-26
hypotenuse 5-26
__ieee_status 5-8
is number a NaN? 5-27
is number finite? 5-26
ln gamma 5-27
ln(x+1) 5-28
logb 5-28
Microsoft compatibility 5-12
nextafter 5-28
remainder 5-28
round to integer 5-28
scale by a power of 2 5-29
significand 5-29
standard error function 5-25
Floating-point library 5-3
Floating-point status 5-10
Floating-point support 5-1
Flush to zero mode 5-9
fopen() 4-78
for loop, C++
variable scope change C-5
fplib 5-3
_fprintf() 4-75
fprintf() 4-15, 4-75
__fp_status 5-10
fputc() 4-8, 4-10, 4-15, 4-75
fputs() 4-10, 4-15, 4-75
_fp_init() 4-14, 4-15, 4-18
Fractional part function 5-29
fread() 4-10, 4-76
free() 4-19, 4-57, 4-63
freopen() 4-78
fscanf() 4-75
fseek() 4-81
Function declaration keywords 3-6
Future compatibility warning 2-34
fwrite() 4-10, 4-75, 4-76
G
Gamma function 5-26
ln gamma function 5-27
getenv() 4-88
__getenv_init() 4-88
gets() 4-10, 4-76
_get_lconv() 4-17, 4-39, 4-47
_get_lc_collate() 4-28, 4-32
_get_lc_ctype() 4-28
_get_lc_monetary() 4-28, 4-36
_get_lc_numeric() 4-28, 4-37
_get_lc_time() 4-28, 4-38
Global register variables 3-11
recommendations 3-11
Global variables, C and C++
alignment 3-24
gmtime() 4-95
H
Header files 2-6
including 2-6
search path 2-8
unguarded 2-32
Heap
avoiding 4-57
__heapstats() 4-64, 4-101
__heapvalid() 4-103
__Heap_Alloc() 4-65, 4-60, 4-62
__Heap_Broken() 4-65, 4-60
__Heap_DescSize() 4-61
__Heap_Descriptor structure 4-61
__Heap_Free() 4-65, 4-60, 4-63
__Heap_Full() 4-65, 4-60
__Heap_Initialize() 4-10, 4-61
__Heap_ProvideMemory() 4-62, 4-65,
4-62
__Heap_Realloc() 4-65
__Heap_Realloc 4-63
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
Index
__Heap_Stats() 4-64
__Heap_Valid() 4-64
Help compiler option 2-11
Hypotenuse function 5-26
I
IEEE format 3-25
IEEE 754 arithmetic 5-30
__ieee_status 5-8
Image size 2-23
Implementation
C library 4-90
standards, C and C++ D-1
Implicit
constructor warning 2-32
narrowing warning 2-32
return warning 2-34
_init_alloc() 4-16
Inline assemblers 2-3
inline, C and C++ keyword 3-9
In-memory filing system 2-15
mem directory 2-6, 2-15
Internal limits, compilers D-4
Interrupt latency 2-26
Invoking the compiler 2-9
Invoking the inline assembler 3-19
isalnum() 4-90
isalpha() 4-90
iscntrl() 4-90
islower() 4-90
isprint() 4-90
ispunct() 4-90
isupper() 4-90
K
Kernighan and Ritchie search paths
2-15
Keywords, C and C++
__asm 3-6
extern 3-28
function declaration 3-6
__inline 3-9
__int64 3-11
__irq 3-6
__packed 3-13, 3-29
ARM DUI0067DJ-00
__pure 3-6
register 3-10
__softftp 3-7
static 3-28
struct 3-27, B-6
__swi 3-7
__swi_indirect 3-8
union 3-27, B-6
__value_in_regs 3-8
variable declaration 3-10
volatile 3-15
__weak 3-9
Keywords, C++
explicit C-5
extern inline C-5
typename C-6
Keywords,C and C++
typeid C-5
L
Language
C++ feature support C-1
default compiler mode 2-3
Language extensions
C and C++ 3-18
function keywords 3-6
hex 3-20
identifiers 3-18
__int64 3-11
long long 3-18
macros 3-32
__packed 3-13
pragmas 3-2
__pure 3-6
__softftp 3-7
__value_in_regs 3-8
void return 3-18
latency
interrupts 2-26
lconv structure 4-17, 4-47
Libraries
C++ Standard C-8
signals used 4-54
static data 4-5
Limits
compilers internal D-4
floating-point, in C and C++ D-6
implementation, C and C++ D-1
Linkage specification, C++ C-5
llabs() 4-100
lldiv() 4-100
ln gamma function 5-27
ln(x+1) function 5-28
Local
variables, C and C++ alignment
3-24
locale
C libraries 4-26
selecting at link time 4-26
selecting at run time 4-28
localeconv() 4-17, 4-39, 4-40, 4-41
locale() 4-11
localtime() 4-19
logb function 5-28
long long 3-18
longjmp() 4-73
Lower precision warning 2-32
M
Machine epsilon 5-32
Macros
predefined C 3-32
preprocessor 2-16
__main() 4-11
Makefiles
generating 2-16
malloc() 4-19, 4-57, 4-71, 4-95
mathlib 5-24
mem directory 2-6, 2-15
memcmp() 3-28
Memory map
tailoring runtime 4-66
tailoring storage 4-57
Microsoft compatibility
floating-point functions 5-12
Minus zero 5-32
mktime() 4-19
N
Namespaces, C++ C-5
Naming conventions 2-4
NaN 5-32
Copyright © 1999-2001 ARM Limited. All rights reserved.
Index-5
Index
Natural alignment, C and C++ 3-24
New array, C++ C-5
New style casts, C++ C-5
nextafter function 5-28
Normalized 5-32
Nothrow new, C++ C-5
O
Optimization
common sub-expression elimination
3-6
compiler options 2-23
controlling 2-23
packed keyword 3-14
and pure functions 3-6
structure packing 3-12
volatile keyword 3-15
Overlapping, of bitfields, C and C++
3-30
Overloaded functions, C and C++
argument limits D-2
P
Packed structures, C and C++ 3-13,
3-29
packed, C and C++ keyword 3-29
Padding
C and C++ structures 3-28
in structure warning 2-33
pic 2-13
pid 2-13
Pointers, in C and C++
subtraction 3-27
Portability
filenames 2-4
Position independence
Pragmas 3-2
check_printf_formats 3-3
check_scanf_formats 3-3
check_stack 3-4
import 3-4
Onum 3-3
Ospace 3-3
softfp_linkage 3-4
Predefined macros, C and C++ 3-32
Index-6
Preprocessor macros 2-16
Preprocessor options 2-15
-C 2-16
-D 2-16
-depend 2-18
-E 2-15
-fu 2-18
-M 2-16
-S 2-18
-U 2-16
_printf() 4-75
printf argument checking 3-3
printf() 4-8, 4-18, 4-75
Pure functions 3-6
puts() 4-10, 4-75
Q
Qualifiers
__packed 3-13
type 3-12
volatile 3-15
Quiet NaN 5-32
__rt_heap_extend() 4-16, 4-58, 4-67,
4-71, 4-72
__rt_initial_stackheap() 4-58
__rt_lib_init() 4-11, 4-21, 4-24
__rt_lib_shutdown() 4-11, 4-24
__rt_raise() 4-13, 4-15, 4-16, 4-17,
4-18, 4-22, 4-53
__rt_stackheap_init 4-67
__rt_stackhep_init() 4-71
__rt_stackheap_init() 4-21
__rt_stack_overflow 4-67
__rt_stack_postlongjmp() 4-67, 4-73
__rt_fp_status_addr() 4-21, 4-50
rt_sys.h 4-11
Runtime memory model 4-66
Runtime type identification, C++ C-5
rwpi 2-13
S
Scale by a power of 2 function 5-29
scanf argument checking 3-3
scanf() 4-18, 4-26, 4-75
Scatter-loading 1-5, 2-28, 3-5
Search paths 2-15
ARMINC 2-7
R
Berkeley UNIX 2-6
__raise() 4-10, 4-50, 4-52
default 2-9
raise() 4-13
Kernighan and Ritchie 2-15
rand() 4-15
rules 2-6
Range reduction, floating-point 5-24
specifying 2-15
realloc() 4-19, 4-57, 4-63
Sections
Register
control of 2-28
keyword 3-10
Semihosting
returning a structure in 3-8
avoiding 4-10
variables 3-10
setlocale() 4-15, 4-16, 4-17, 4-28, 4-29,
Remainder function 5-28
4-40, 4-41, 4-47
remove() 4-19, 4-86
Signalling NaN 5-32
rename() 4-19, 4-87
Signals
ropi 2-13
C and C++ libraries 4-54
Round to integer function 5-28
signal() 4-13
Rounding floating point 5-34
signal.h 4-13
Rounding mode control 5-9, 5-13, 5-16 Significand function 5-29
RTTI C-5
Single-precision 5-30
__rt_entry() 4-11, 4-21, 4-22
Size of code and data areas 2-28
__rt_errno_addr() 4-52, 4-50, 4-51
snprintf() 4-99
__rt_exit() 4-11, 4-23, 4-51
Source language modes
__rt_fp_status_addr() 4-14, 4-15, 4-56
ANSI C 2-3, 2-14
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00
Index
C++ 2-3
EC++ 2-3
strict 2-14
strict ANSI C 2-14
Specifying
additional checks 2-34
function declaration keywords 3-6
preprocessor options 2-15
search paths 2-15
structure alignment 2-30
warning messages 2-30
Speed
and structure packing 3-12
sprintf() 4-15
srand() 4-5, 4-15
sscanf() 4-15
Stack checking 3-4
C and C++ 2-12, 2-14
Standard C++
support for C-1
Standard error function 5-25
Standards
C and C++ 2-2
C library implementation 4-90
C++ implementation C-1
C++ language support C-1
C++ library implementation 4-96
Standard C++ D-1
Standard C++ support C-1
variation from B-2
Static data
libraries 4-5
tailoring access 4-25
Static member constants, C++ C-5
static, C and C++ keyword 3-28
__STDC__, C and C++ macro 3-33
__stdin 4-10
__stdout 4-10
Sticky flags 5-8, 5-11, 5-14
strcoll() 4-19, 4-33, 4-41
strerror() 4-95
strftime() 4-19, 4-41
String
character sets 3-22
size limits D-2
strtoll() 4-99
strtoull() 4-99
strto*() 4-19
Structures, C and C++
ARM DUI0067DJ-00
alignment 3-28
bitfields 3-31
implementation 3-27, B-6
packed 3-29
packing 3-13
padding 3-28
specifying alignment 2-30
struct, C and C++ keyword 3-27, B-6
strxfrm() 4-19
SWI
semihosting 4-10
Symbols
defining, C and C++ 2-16
system() 4-87
_sys_close() 4-78
_sys_command_string() 4-83
_sys_ensure() 4-81
_sys_exit() 4-16, 4-50, 4-51
_sys_flen() 4-81
_sys_istty() 4-82
_sys_open() 4-77, 4-78
_sys_read() 4-79, 4-82
_sys_seek() 4-81
_sys_tmpnam() 4-83
_sys_write() 4-80
T
Tailoring C library functions 4-84
tcpp 3-32
Templates, C++ C-7
default template arguments C-5
instantiation directive C-5
member templates C-6
ordering C-6
partial specialization C-6
specialization directive C-5
time() 4-19, 4-86
tmpfile() 4-83
Truncate floating point 5-34
_ttywrch() 4-50, 4-56
Type qualifiers 3-12
typeid, C++ keyword C-5
typename, C++ keyword C-6
U
union, C and C++ keyword 3-27, B-6
Unused declaration warning 2-34
Unused this warning 2-33
__user_heap_extend() 4-69, 4-72
__user_heap_extent() 4-58, 4-70
__user_initial_stackheap() 4-68
__user_libspace() 4-14, 4-25, 4-51,
4-67
__user_stack_slop() 4-70
__use_iso8859_collate() 4-27
__use_iso8859_ctype() 4-27
__use_iso8859_locale() 4-27
__use_iso8859_monetary() 4-27
__use_iso8859_numeric() 4-27
__use_no_heap() 4-57
__use_no_heap_region() 4-57
__use_realtime_heap() 4-58
__use_two_region_memory() 4-66
V
Variable declaration keywords 3-10
__int64 3-11
register 3-10
Variants
compilers 2-2
vfprintf() 4-75
Via files 2-10, A-1
Virtual functions (C and C++) 3-28
volatile, C and C++ keyword 3-13,
3-15
vprintf() 4-75
vsnprintf() 4-100
W
Warning messages, compilers
assignment operator 2-31
char constants 2-32
deprecated declaration 2-31
deprecated features 2-34
enabling warnings off by default
2-35
future compatibility 2-34
implicit constructor 2-32
Copyright © 1999-2001 ARM Limited. All rights reserved.
Index-7
Index
implicit conversion 2-33
implicit narrowing cast 2-32
implicit return 2-34
implicit virtual 2-33
initialization order 2-33
inventing extern 2-31
lower precision 2-32
non-ANSI include 2-33
padding inserted in structure 2-33
pointer casts 2-31
specifying 2-30
specifying additional checks 2-34
unguarded header 2-32
unused declaration 2-34
unused this 2-33
wchar_t, C++ C-5
Wide characters, C++ C-5
Symbols
$ in identifiers 3-18
Index-8
Copyright © 1999-2001 ARM Limited. All rights reserved.
ARM DUI0067DJ-00