=====================================================================
                           ARMCC依存部
                                  Last Modified: 2012 Jan 19 20:13:08
=====================================================================

○概要

ARMCC依存部には，ARMCCを用いてカーネルをコンパイルするために必要なファ
イルを置く．


○ビルドのためのファイルのコピー

Make(GNU環境)によりARMCC用のカーネルをビルドをするためには，以下の二個
のファイルを事前にコピーする必要がある．

 $cp ./arch/armcc/Makefile.sample ./sample
 $cp ./arch/armcc/makedep         ./utils
 
 
○Makefileの変更点

・.Sに対するルールを.sxに変更．
・OBJEXT を axf に変更
・リンク時のオプションにCFLAGSを付けないよう変更
・最終オブジェクトの生成
 ・シンボル出力のためのオプションの追加
 ・NMを呼び出さない．
 ・objcopyの引数の変更   
・cfg1_outの生成
 ・NMを呼び出さない．
 ・objcopyの引数の変更   
・開発ツールのコマンド名をarmccのツール群に変更
・LINKをCCからarmlinkに変更


○ARMCC共有コードの記述方法

ARMCCと共有するコードは，次のルールに従ってコードを記述する必要がある．

1.メモリバリア命令(__memory_changed())のマクロ化

ターゲット依存部 ポーティングガイドの(1-6-2)(c)には，次のように記述さ
れている．

-----
(c) クリティカルセクションの出入処理の本質的な部分が，マクロやインライ
	ン関数呼出しで実現している場合には，クリティカルセクションに入る処
	理の最後と出る処理の先頭に，Asm("":::"memory")という記述を入れる．
-----

GCCのAsm("":::"memory")は，ARMCCではコンパイラ組み込み関数である
__memory_changed()で記述する必要があり，互換性がない．この記述をする箇
所は，次のマクロで記述すると，コンパイル時に適切なメモリバリア命令に置
き換えられる．

  ARM_MEMORY_CHANGED

2.インクルード方法

ターゲット依存部 ポーティングガイドの1.5には，次のように記述されている．

-----
その他のヘッダファイルは，「#include "..."」によりインクルードする．ヘッ
ダファイルが，カレントディレクトリやインクルードするファイルと同じディ
レクトリ以外のディレクトリに置かれている場合には，次のようにパス指定を
行う．
-----

GCC依存部とARMCC依存部でヘッダファイルを共有できない場合には，それぞれ
で同じ名前のファイルを持つ．そして，コンパイルオプションでインクルード
すべきファイルを先に指定している．そのため，ARMCCと共有するファイルで
これらのファイルをインクルードする場合には，「#include "..."」ではなく，
「#include <...>」で記述し，相対パスではなくファイル名のみを記載するこ
と．

3.アセンブラディレクティブ

GCCとARMCCのアセンブラディレクティブは互換性がない．そのため，ARMCCと
共有するファイルは次に示すマクロディレクティブで記述すること．

マクロディレクティブ     ARMCCディレクティブ
 ASECTION(name)           area |name|, code
 ATEXT                    area |.text|, code
 AGLOBAL(name)            global name
 AALIGN(x)                align x
 ALONG                    dcd
 ALABEL(label)            label
 AOR                      :OR:
 ATHUMB(name)             thumb


4..sxファイル

Windows版のARMCCでは，.Sの拡張子のファイルはプリプロセスを実施しない．
そのため，ARMCCでGCC版のアセンブラファイルを使用する場合には，.sxの拡
張子のファイルを作成し，以下の情報を追加してARMCCでGCC版のアセンブラフ
ァイル(拡張子.S)をインクルードすること．

 ・extern宣言の追加
 ・PRSERVE8ディレクティブの追加
 ・ENDディレクティブの追加．

○ファイル一覧

・armcc.txt
・makedep
・Makefile.sample
・MANIFEST
・tool_asm.inc
・tool_stddef.h


○ARMCC対応検討メモ

●設計方針
・可能な限りGCC版とソースコードを共有する
 ・アセンブラのコードも共有させる．
 ・ifdefは極力使用しない

・共有するコードはGCC版の方に持たせる．

http://www.is.nagoya-u.ac.jp/admission/
●バージョン
ARMCCが付属する環境
・RVDS
 ・ARMコンパイラ・デバッガのパッケージ
 ・ARMCCのバージョン : v4
 ・デバッガはRealViewDebugger
・DS-5(RVDSの後継)
 ・大規模なMCU(Coretex-Ax, ARM11)向けの開発環境
 ・Linux(Android)の開発を主な対象としている
 ・3種類のエディションがあり，最上位のProfessionalのみARMCCを含む（後はGNU）
 ・ARMCCのバージョン : v5
 ・デバッガはEclipseベース
・MDK-ARM
 ・小規模なMCU(Cortex-Mx,ARM7,ARM9)向けの開発環境
 ・ARMCCのバージョン : v4
 ・デバッガはμVison
 
・候補
 ・V4.1 or V5.0
  ・V5.0の新機能
    ・GCC フォールバックモードをサポート
      ・ARMCCで失敗した場合にGCCを呼び出す（コンパイラリファレンス 3-194）
        ->使用しない   
        
・結論      
 ・V5.0の新機能はカーネルの実装には影響しないため， v4.1とv5.0の両方を
   サポートする．

●GNUツールとの互換性
・GNUツール互換機能
 ・--gnuを指定することによりGNU拡張機能を使用可能．
  ・Linuxのアプリケーションを開発することを目的に導入されている

 ・TOPPERSカーネルに関する事項
  ・asm keyword
   ・課題がありTOPPERSカーネルでは使用できない（後述）
  ・Zero-length arrays
  ・Inline functions
   ・static inline を使用可能
  ・GNUのldスクリプトを入力可能
   ・課題がありTOPPERSカーネルでは使用できない（後述）

 ・参照 
   ・コンパイラリファレンス 4.45
   ・Which GNU language extensions are supported by the ARM Compiler?
      http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka14717.html
     
・リンカスクリプトの互換性
 ・GNUのldスクリプトを入力可能 
 ・Linuxのアプリの開発を対象としているため，以下の制約があり，TOPPERS
   の開発では使用できない
   ・VMA = LMA のみサポート
   ・ベアメタルは未サポートである
    参照 : リンカの使用 9.1
 ・結論
   ・スキャッタファイルを使用する

・ツールの対応
 GNU     ARMCC
  gcc     armcc 
  g++     armcc 
  as      armasm 
  ld      armlink 
  ar      armar 
  nm      armlink -symdefs=file    ARMCC リンカリファレンス 2.147章参照 
  ranlib  armar -s                                          
  objcopy fromelf 
  gcc     armlink   


●インラインアセンブラの扱い
・候補
 1. インラインアセンブラ (前後コード含め最適化対象、インライン展開対象)
   ->GNUのASM相当
 2. 組み込みアセンブラ (最適化 非対象、かつ、インライン展開非対象) 
    ->関数全体をアセンブラとする
 3. コンパイラ組み込み関数 (ARMCC推奨(*);非最適化、インライン展開) 

 ・インラインや組込みアセンブラを使うより，コンパイラ組込み関数の使用
   を推奨
   参考:ARMCCマニュアル コンパイラの使用 8章 最初の注    
  
 ・インラインアセンブラ以下に対応していない．
    -Thumb アセンブリ言語
    -Thumb-2 アセンブリ言語
    -ARMv7 命令
    -VFP 命令
    -NEON 命令
   参考:ARMCCマニュアル コンパイラの使用 8.3

 ・コンパイラ組込み関数
    参照:ARMCCマニュアル コンパイラリファレンス 5.102
    例)
       __schedule_barrier()
       __memory_changed()
     コンパイラに対するヒント
       __schedule_barrier()
       __memory_changed()
  ・課題
    ・CPSRやコプロの操作ができない．
    
 ・名前付きレジスタ変数  
   ・cpsrやコプロの操作に使用．
   参照:コンパイラリファレンス 5.152
        コンパイラの使用 5.15章

・結論
  ・コンパイラ組み込み関数と名前付きレジスタ変数を併用する．
    
●アセンブラファイルの互換性
・GNUとの違い
 ・文法が一部異なる
  ・| ではなく OR を使うように警告がでる．
  ・cpsrではなくcpsr_cxsfを使うようにエラーがでる(spsrも同様)．
  ・EXTERNが必要
  ・ENDが必要  
・拡張子の扱い
  ・Windowsでは.Sのファイルにはプリプロセスが実施されない．プリプロセ
    スを実施するには，拡張子を.sxとする必要がある．
・マクロでは上手くいかないケース
   #define ASECTION(name) area |name|, code  
   ASECTION(.vector) と書くと
   area |. vector|, code
   となる．
  
・候補
 1.GNUと独立したファイルとする．
 2.変換プログラムを作成
 3.マクロによりファイルを共有する
 
・結論
 ・マクロによりファイルを共有する．
 ・ARMCC依存部に.sxファイルを作成して，.Sをインクルードする．

●weak definition
・GCC
 ・リンカスクリプトで指定．
    PROVIDE(hardware_init_hook = 0);
    PROVIDE(software_init_hook = 0);
    PROVIDE(software_term_hook = 0);
・ARMCC
 ・スキャッターにはこの機能がない．
 ・代わりに変数・関数をweak definitionする機能があるのでこちらを使用し
   て，空の関数を定義する．
 ・呼び出しオーバヘッド，メモリを消費するというデメリットはある．  
 
・結論 
  ・関数をweak definitionする機能により，core_support.sx で定義する．
  
●コンパイルオプション
共通オプション
・--apcs=/interwork  : ARM,Thumb混載(ARMのみ)
・--diag_style=gnu   : GNU互換メッセージ

コンパイラ
・--gnu              : GNU互換
・--bss_threadhold   : スモールデータセクション未使用

リンカ
・--datacompressor=off : DATA領域の初期値を圧縮しない
・--no_remove          : 未使用のシンボルを削除しない
                            
              
●Makefile
・アセンブラの拡張子が.sxに変更となるため，GNU開発環境用のMakefileは使
  えないため，別のファイルとして用意する．

●makedep
・パス情報が\\で出力されるため置き換える必要がある．
  1.7.1で対応される予定．
              
○変更履歴

2011/11/22
・新規追加

以上．
