JADA099C February   2019  – March 2026

 

  1.   1
  2. はじめに
    1. 1.1  C28x 向けの ABI
    2. 1.2  範囲
    3. 1.3  ABI バリアント
    4. 1.4  ツールチェーンと相互運用性
    5. 1.5  ライブラリ
    6. 1.6  オブジェクト ファイルの形式
    7. 1.7  セグメント
    8. 1.8  C28x アーキテクチャの概要
    9. 1.9  C28x のメモリモデル
    10. 1.10 参考資料
    11. 1.11 コード フラグメント表記
  3. データ表現
    1. 2.1 基本型
    2. 2.2 レジスタ内のデータ
    3. 2.3 メモリ内のデータ
    4. 2.4 ポインタ タイプ
    5. 2.5 複素数型
    6. 2.6 構造と共用体
    7. 2.7 配列
    8. 2.8 ビット フィールド
      1. 2.8.1 volatile ビット フィールド
    9. 2.9 列挙型
  4. 呼び出し規約
    1. 3.1 呼び出しと復帰
      1. 3.1.1 呼び出し命令
        1. 3.1.1.1 間接呼び出し
        2. 3.1.1.2 直接呼び出し
      2. 3.1.2 復帰命令
      3. 3.1.3 パイプライン規約
      4. 3.1.4 弱関数
    2. 3.2 レジスタ規約
      1. 3.2.1 引数レジスタ
      2. 3.2.2 呼び出し先保存レジスタ
    3. 3.3 引数の受け渡し
      1. 3.3.1 16 ビット引数の受け渡し
      2. 3.3.2 長い引数を渡す
      3. 3.3.3 C++ における引数の受け渡し
      4. 3.3.4 構造と共用体を渡す
      5. 3.3.5 レジスタに渡されない引数のスタック レイアウト
      6. 3.3.6 フレーム ポインタ
    4. 3.4 戻り値
    5. 3.5 参照によって渡される構造と共用体と、返される構造と共用体
    6. 3.6 コンパイラ ヘルパー関数の規則
    7. 3.7 プロローグおよびエピローグのヘルパー関数
    8. 3.8 既知の関数のスクラッチ レジスタ
    9. 3.9 割り込み関数
  5. データのアロケーションとアドレッシング
    1. 4.1 データ セクションとセグメント
    2. 4.2 データ ブロッキング
    3. 4.3 アドレッシング モード
    4. 4.4 静的データの割り当てとアドレッシング
      1. 4.4.1 静的データのアドレッシング方法
      2. 4.4.2 静的データの配置規則
        1. 4.4.2.1 アドレッシングに関するアブストラクト規定
      3. 4.4.3 静的データの初期化
    5. 4.5 自動変数
    6. 4.6 フレーム レイアウト
      1. 4.6.1 スタックの整列
      2. 4.6.2 レジスタ保存順序
    7. 4.7 ヒープ割り当て済みオブジェクト
  6. コードのアロケーションとアドレッシング
    1. 5.1 コード ラベルのアドレスの計算
    2. 5.2 呼び出し
      1. 5.2.1 直接 呼び出し
      2. 5.2.2 ファー呼び出しトランポリン
      3. 5.2.3 間接呼び出し
  7. ヘルパー関数 API
    1. 6.1 浮動小数点の動作
    2. 6.2 C ヘルパー関数 API
    3. 6.3 C99 用の浮動小数点ヘルパー関数
  8. 標準 C ライブラリ API
    1. 7.1  標準 C ライブラリについて
    2. 7.2  予約済みシンボル
    3. 7.3  <assert.h> の実装
    4. 7.4  <complex.h> の実装
    5. 7.5  <ctype.h> の実装
    6. 7.6  <errno.h> の実装
    7. 7.7  <float.h> の実装
    8. 7.8  <inttypes.h> の実装
    9. 7.9  <iso646.h> の実装
    10. 7.10 <limits.h> の実装
    11. 7.11 <locale.h> の実装
    12. 7.12 <math.h> の実装
    13. 7.13 <setjmp.h> の実装
    14. 7.14 <signal.h> の実装
    15. 7.15 <stdarg.h> の実装
    16. 7.16 <stdbool.h> の実装
    17. 7.17 <stddef.h> の実装
    18. 7.18 <stdint.h> の実装
    19. 7.19 <stdio.h> の実装
    20. 7.20 <stdlib.h> の実装
    21. 7.21 <string.h> の実装
    22. 7.22 <tgmath.h> の実装
    23. 7.23 <time.h> の実装
    24. 7.24 <wchar.h> の実装
    25. 7.25 <wctype.h> の実装
  9. C++ ABI
    1. 8.1  制限 (GC++ABI 1.2)
    2. 8.2  エクスポート テンプレート (GC++ABI 1.4.2)
    3. 8.3  データ レイアウト (GC++ABI 第 2 章)
    4. 8.4  初期化ガード変数 (GC++ABI 2.8)
    5. 8.5  コンストラクタ戻り値 (GC++ABI 3.1.5)
    6. 8.6  ワンタイム構築 API (GC++ABI 3.3.2)
    7. 8.7  オブジェクト構成順序を制御する (GC++ ABI 3.3.4)
    8. 8.8  デマングラ API (GC++ABI 3.4)
    9. 8.9  静的データ (GC++ ABI 5.2.2)
    10. 8.10 仮想テーブルと key function (GC++ABI 5.2.3)
    11. 8.11 アンワインド テーブルの位置 (GC++ABI 5.3)
  10. 例外処理
    1. 9.1  概要
    2. 9.2  PREL31 エンコーディング
    3. 9.3  例外インデックス テーブル (EXIDX)
      1. 9.3.1 アウトオブライン EXTAB エントリへのポインタ
      2. 9.3.2 EXIDX_CANTUNWIND
      3. 9.3.3 インライン化された EXTAB エントリ
    4. 9.4  例外処理命令テーブル (EXTAB)
      1. 9.4.1 EXTAB 一般モデル
      2. 9.4.2 EXTAB コンパクト モデル
      3. 9.4.3 パーソナリティ ルーチン
    5. 9.5  アンワインド命令
      1. 9.5.1 共通シーケンス
      2. 9.5.2 バイト エンコードされたアンワインド命令
    6. 9.6  ディスクリプタ
      1. 9.6.1 型識別子のエンコード
      2. 9.6.2 範囲
      3. 9.6.3 クリーンアップ記述子
      4. 9.6.4 キャッチ ディスクリプタ
      5. 9.6.5 関数例外仕様 (FESPEC) ディスクリプタ
    7. 9.7  特別なセクション
    8. 9.8  C++ 以外のコードとの相互作用
      1. 9.8.1 EXIDX エントリの自動生成
      2. 9.8.2 ハンドコードで記述されたアセンブリ関数
    9. 9.9  システム機能との相互作用
      1. 9.9.1 共有ライブラリ
      2. 9.9.2 オーバーレイ
      3. 9.9.3 割り込み
    10. 9.10 TI ツールチェーンにおけるアセンブリ言語オペレータ
  11. 10DWARF
    1. 10.1 DWARF レジスタの名前
    2. 10.2 呼び出しフレーム情報
    3. 10.3 ベンダー名
    4. 10.4 ベンダー拡張
  12. 11ELF オブジェクト ファイル (プロセッサ補足)
    1. 11.1 登録済みベンダ名
    2. 11.2 ELF ヘッダー
    3. 11.3 セクション
      1. 11.3.1 セクション インデックス
      2. 11.3.2 セクション タイプ
      3. 11.3.3 拡張セクション ヘッダー属性
      4. 11.3.4 サブセクション
      5. 11.3.5 特別なセクション
      6. 11.3.6 セクションの整列
    4. 11.4 シンボル テーブル
      1. 11.4.1 シンボル タイプ
      2. 11.4.2 共通ブロック シンボル
      3. 11.4.3 シンボル名
      4. 11.4.4 予約済みシンボル名
      5. 11.4.5 マッピング シンボル
    5. 11.5 再配置
      1. 11.5.1 再配置タイプ
        1. 11.5.1.1 絶対再配置
        2. 11.5.1.2 PC 相対再配置
        3. 11.5.1.3 データ セクションにおける再配置
        4. 11.5.1.4 C28x 命令の再配置
        5. 11.5.1.5 その他の再配置タイプ
      2. 11.5.2 再配置操作
      3. 11.5.3 未解決の弱参照の再配置
  13. 12ELF プログラムのロードと リンク (プロセッサ補足)
    1. 12.1 プログラム ヘッダー
      1. 12.1.1 ベース アドレス
      2. 12.1.2 セグメントの内容
      3. 12.1.3 スレッドローカル ストレージ
    2. 12.2 プログラムのロード
  14. 13ビルド属性
    1. 13.1 ビルド属性について
    2. 13.2 C28x ABI ビルド属性サブセクション
    3. 13.3 ビルド属性タグ
  15. 14コピー テーブルと変数の初期化
    1. 14.1 テーブルのコピーについて
    2. 14.2 コピー テーブルのフォーマット
    3. 14.3 圧縮データ フォーマット
      1. 14.3.1 RLE
      2. 14.3.2 LZSS フォーマット
    4. 14.4 変数の初期化
  16. 15改訂履歴
    1.     188

共通シーケンス

抽象的に見ると、すべてのアンワインドのシーケンスは次のような手順を踏みます。

  1. SP を復元する (SP += 定数)
  2. (任意) 呼び出し先保存レジスタを復元する (reg1 := SP[0]; reg2 := SP[-1]、など)
  3. リターンする

ステップ 1:SP を復元する

実際のエピローグでは、呼び出し先保存レジスタを復元されるまでは SP は復元されませんが、スタック アンワインドは仮想的な処理であるため、TDEH によるシミュレーション アンワインドでは先に SP の復元を行うことがあります。この仕組みにより、他の呼び出し先保存レジスタの復元が容易になります。

SP は、定数でインクリメントすることで復元されます。示的なインクリメントに加えて、呼び出し先保存領域のサイズ分だけ SP が暗黙的にインクリメントされます。

ステップ 2:レジスタを復元する

抽象的に見ると、呼び出し先保存レジスタは 安全なレジスタ デバッグ 順 (セクション 4.6.2) に従って復元されます。復元は (古い) SP が指す位置から始まり、アドレスを下げながら進みます。

ステップ 3:戻り値

すべてのアンワインド シーケンスは、暗黙的または明示的な「RET 」で終了し、これにより現在のフレームに対するアンワインドが完了したことが示されます。