Nios II Gen2 プロセッサー・リファレンス・ガイド

ID 683836
日付 10/28/2016
Public
ドキュメント目次

7.9.2. Linux 関数コール

レジスターr23は GNU Linux システム上のスレッドポインター用に予約されています。これは C ライブラリーによって初期化され、TLS アクセスには直接使用できますが変更はされません。非 Linux システムでは、r23は汎用の callee-saved レジスターです。

グローバルポインターr26またはgpは、グローバルに固定されています。スタートアップ・コードで初期化され、常に関数への入力時に有効です。この手法は複数のgp値を許容しないため、gp相対データ参照はメイン・アプリケーション ( すなわち、位置依存コードから ) でのみ可能です。gpは PIC としてコンパイルされたコードが共有ライブラリーから使用される可能性があるため、GOT アクセスではなく、小さなデータアクセスにのみ使用されます。リンカーは、アドレスが範囲内にある場合、より短い PLT シーケンスに対してgpを使用できます。コンパイラーはgprelの使用を無効にするオプションを必要とするため、過剰な量の小データがあるアプリケーションにはオプションが必要です。比較では、XUL (Mozilla ディスプレイ・エンジン、16 MB コード、2 MB データ ) は 27 KB の小さなデータしか持たず、制限は 64 KB です。-G 0 は ABI の非互換性を作成するため、このオプションは -G 0 とは別です。-G 0 でコンパイルされたファイルはグローバルint変数を.dataに入れますが、-G 8 でコンパイルされたファイルはそのよううなint変数が.sdataにあることを前提としています。

GOT ポインターを必要とする PIC コードは、nextpcを使用してポインターをローカルに初期化する必要があり、つまり、関数コール中に GOT ポインターは渡されません。このアプローチは、静的再配置バイナリーと System V スタイルの共有オブジェクトの両方と互換性があります。個別に再配置可能なテキストとデータを持つ共有オブジェクトには、別個の ABI が必要です。

スタックの配置は 32 ビットです。フレームポインターは、バックトレースを簡略化するためにスタックの使用時にスタックの先頭を指します。ローカル変数と出力引数の間にallocaを挿入します。スタックポインターは、出力引力エリアの下を指します。

大きなstructの戻り値は、最初の引数レジスターにポインターを渡すことで処理されます ( 非同期の戻り値レジスターではありません )。