ページの本文へ

Hitachi
お問い合わせお問い合わせ

最適化リンケージエディタ V.9情報

新機能

  1. オプションの追加
    以下のオプションを追加しました。
    1. cpu=strideオプション
      セクションがセクションの割り付けアドレスに対して、割り付けるメモリ範囲に収まらない場合に、次の同メモリ種別のセクションに配置、または、そのセクションを分割して配置することが可能になります。
    2. contiguous_sectionオプション
      本オプションで指定したセクションは、cpu=strideオプションが有効であっても分割せずに同メモリ種別の割り付け可能なアドレス領域に割り付けます。
    3. show=allオプション
      showオプションのサブオプションにallを追加しました。
      すべてのリスト内容を出力します。
  2. 機能追加
    以下の機能を追加しました。
    1. エラー出力があっても、リンケージマップを出力します。
    2. リロケータブルファイル出力時に、入力ファイルとしてバイナリファイルを指定できるようになりました。

改修内容

2009年3月2日掲載の以下の2点の問題を改修しました。

  • 異なる境界調整数のセクションのオーバーレイに関する注意事項(LNK-0004)
  • リンク時のdata_stuffオプションおよびnooptimizeオプション選択に関する注意事項(LNK-0005)

改修内容

2009年3月2日掲載の以下の2点の問題を改修しました。

  • 異なる境界調整数のセクションのオーバーレイに関する注意事項(LNK-0004)
  • リンク時のdata_stuffオプションおよびnooptimizeオプション選択に関する注意事項(LNK-0005)

新機能

以下の2つのオプションを追加しました。

  1. RTs_file
    特定エミュレータ向けの情報ファイルを出力します。
  2. CRc
    指定した範囲のCRC(Cyclic Redundancy Check)演算を行い、計算結果をメモリ内の指定されたアドレスに格納します。

改修内容

2008年7月30日掲載の以下の3点の問題を改修しました。

  • 引数格納レジスタ数を3で宣言したアセンブラルーチンを呼び出す際の注意事項 (LNK-0001)
  • 短絶対アドレッシングモード活用最適化オプション使用時の変数初期値に関する注意事項 (LNK-0002)
  • 共通コード統合最適化オプション使用に関する注意事項 (LNK-0003)

新機能

次のオプションを最適化リンケージエディタ(以降、リンカと略します)に追加しました。

  1. total_size
    total_sizeオプションを使用すると、標準出力へ下記種別ごとのセクション合計サイズを出力できます。
      - 実行可能セクション
      - ROM配置データセクション
      - RAM配置データセクション
  2. show=total_size
    show=total_sizeオプションを使用すると、上記種別ごとのセクションの合計サイズをリンケージリストに出力できます。

改修内容

  1. 下記番号のメッセージ表示を改善しました。
    該当メッセージ番号: L0300, L1330, L2220, L3110
    該当メッセージの原因となるファイルがライブラリファイル内の特定ライブラリモジュールである場合、V.9.03.00以降ではそのライブラリモジュール名まで表示します。

    改善前(リンカV.9.02.00以前)のメッセージ例
    ** L3110 (F) Illegal cpu type "<CPU種別>" in "<ライブラリ名>"

    改善後(リンカV.9.03.00以降)のメッセージ例
    ** L3110 (F) Illegal cpu type "<CPU種別>" in "<ライブラリ名> (<モジュール名>)"
    リンカのバージョンは以下の操作で確認できます。
    1. 統合開発環境High-performance Embedded Workshopのメニュー「ツール」->「アドミニストレーション」を選択します。
    2. 開いたツールアドミニストレーションダイアログボックスの「登録済みコンポーネント」リストの「Toolchains」の中から使用中のコンパイラパッケージを選択し、プロパティボタンをクリックします。
    3. 表示されたプロパティダイアログボックスの「情報」タブを選択するとバージョンが表示されます。

      表示例: Optimizing Linkage Editor (V.9.00.02)
  2. スタック解析ツールCall Walkerで、プログラムのスタック使用量が実際の使用量より少なく表示される問題を改修しました。
    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. コンパイル時に、最適化オプション -optimize=1を使用している。
    2. C言語ソースファイル内で、直後に記述した関数を呼び出している関数がある。
      Cソース例
      -----------------------------------------
      void f()
      {
           :
          g();  /*直後の関数gを呼び出している*/
      }
      void g()
      {
           :
      }
      -----------------------------------------

  3. レジスタ退避および回復の最適化機能が有効となるオプション(例えば、optimize=register)を使用することにより、退避するレジスタと回復するレジスタとが一致しなくなる問題を改修しました。
    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. コンパイル時にgoptimizeオプションを選択している。
    2. コンパイル時に下記のいずれかのマイコンを選択している。
      300, 300reg, 300hn, 300ha, 2000n, 2000a, 2600n, および2600a
      ただし、2000n, 2000a, 2600n, および2600aでは、コンパイラオプションlegacy=v4を使用している場合のみが該当する。
    3. 使用しているリンカのバージョンが、V.9.00.01以降である。
    4. リンク時に、レジスタ退避および回復の最適化機能が有効となるオプション(例えば、optimize=register)を使用している。
  4. 以下の内部エラーが発生する場合がある問題を改修しました。
      - L4000 (-) Internal Error : (1153)
      - L4000 (-) Internal Error : (3081)
      - L4000 (-) Internal Error : (8870)
      - L4000 (-) Internal Error : (8957)

新機能

  1. オプションbyte_countを新規追加しました。
    byte_countオプションを使用することにより、インテルHEX形式ファイルのデータレコードの最大バイト数を変更することができます。
  2. MCUの空きROMエリアへ乱数を充填する機能を追加しました。
    下記形式のファイルの空きエリアに、乱数を埋め込むことができるspace=randomオプションを新規追加しました。
      ・Sタイプファイル
      ・インテルHEX形式ファイル
      ・バイナリファイル
  3. メモリ使用量を削減するオプションmemory=lowが、ライブラリファイル作成時にも使用できるようになりました。

改修内容

  1. レジスタ退避および回復の最適化機能が有効となるオプション(例えばoptimize=register)を使用することによって、誤ったオブジェクトコードを生成する問題を改修しました。本問題は、以下の問題の発生条件AもしくはBに該当する場合に発生することがあります。
    問題の発生条件A:
    以下の条件をすべて満たす。
    1. コンパイル時にgoptimizeオプションを選択している。
    2. リンク時に、レジスタ退避および回復の最適化機能が有効となるオプション(例えばoptimize=register)を使用している。
    3. 下記いずれかの条件に該当している。
      (c-1) 下記の拡張言語仕様のいずれかを使用している。
      • ・__regsaveキーワード
      • ・__noregsaveキーワード
      • ・#pragma regsave
      • ・#pragma noregsave
      • ・__asmキーワード
        (c-2) コンパイルリストのアセンブリソース表示において、ある関数の関数ラベルf(関数の開始アドレスに付加される)と同じアドレスに別のラベルAが存在し、かつ関数f以外から関数ラベルfへ分岐する命令が存在する。
        補足:
        (c-2)に該当するかどうかは、コンパイルリスト(.lst)ファイルから確認できます。コンパイルリストを生成するには、コンパイル時に、listオプションshow=objectを選択してください。
    問題の発生条件B:
    以下の条件をすべて満たす。
    1. マイコン種別が、H8SXN, H8SXM, H8SXAおよびH8SXXのいずれかである。
    2. コンパイル時にgoptimizeオプションを使用している。
    3. リンク時に、レジスタ退避および回復の最適化機能が有効となるオプション(例えばoptimize=register)を使用している。
    4. コンパイルにより、以下のいずれかの命令が生成される。
        ・オペランドとして以下のアドレッシングを持つMOV命令
            @(<value>:16,SP)
        ・オペランドとして以下のいずれかのアドレッシングを持つADD,SUB, またはCMP命令
            @(<value>:2,SP)
            @(<value>:16,SP)
        注: SP(スタックポインタ)はER7レジスタのことです。
    5. dの命令が、同時に変数名を含むアドレッシングを持っている。
          例:MOV.L @(<value>:16,SP),@_<変数名>:32
      補足:
      dおよびeに該当するかどうかは、コンパイルリスト(.lst)ファイルから確認できます。コンパイルリストを生成するには、コンパイル時に、listオプションshow=objectを選択してください。
  2. 下記3つのオプションのパラメータであるファイル名やフォルダ名が文字コードに0x7cを含む文字(たとえば"ポ")を含む場合、誤ってエラーL3300となり、リンクできない問題を改修しました。
    • inputオプション(入力オブジェクトファイル選択)
    • libraryオプション
    • binaryオプション
  3. リンカが生成するインテルHEX形式ファイルの内容について、下記3点の問題を改修しました。
    1. 04レコードを出力する際に、これまで同時にベースアドレス0の02レコードを出力してきましたが、02レコードを出力しないようにしました。
    2. スタートアドレスを表すレコード(03レコードと05レコード)の出力位置を、エンドレコード(01レコード)の直前へと変更しました。
    3. 03レコードでのスタートアドレス表現が、インテルHEX形式仕様に準拠していなかった問題を改修しました。
      補足:
      インテルHEX形式ファイルの内容については、下記を参照してください。
      H8S、H8/300シリーズ C/C++コンパイラ、アセンブラ、最適化リンケージエディタユーザーズマニュアル(資料番号:RJJ10B0166-0100)
        19.1.2 インテルHEXファイル形式

新機能

  1. SEction_forbidオプションを新規に追加しました。
    本オプションにより、セクション単位で最適化を抑止することができます

  2. STARtオプションの機能を拡張して"()"の記法を新たに導入しました。

上記1.および2.のオプション機能の詳細は、コンパイラパッケージに 添付されている以下の資料を参照ください。
"最適化リンケージエディタ V.9.01 仕様追加オプションについて"

改修内容

  1. レジスタ退避/回復の最適化(optimize=register) によって、誤ったオブジェクトコードを生成する問題を改修しました。

    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. コンパイル時のマイコン種別に、H8SXN, H8SXM, H8SXAおよびH8SXXのいずれかを選択している。
    2. コンパイル時にgoptimizeオプションを使用している。
    3. リンク時に、レジスタ退避/回復の最適化 (optimize=register) を使用している。
    4. コンパイルにより、以下のいずれかのアドレッシングを持つMOV命令が生成される。*
      • ・@(<value>:2,SP)
      • ・@(<value>:16,SP)
      • ・@(<value>:32,SP)
        注: SP(スタックポインタ)はER7と同じレジスタ
    5. d.のMOV命令が、同時に変数名を参照するアドレッシングを持っている。
      例:MOV.L @(<value>:2,SP),@_<変数名>:32

    * コンパイルによって生成された命令は、コンパイルリスト(.lstファイル)で確認できます。コンパイル時にshow=objectオプションを使用してコンパイルリストを出力してください。
  2. レジスタ退避/回復の最適化(optimize=register)によって、goto文の分岐先ラベルが誤った位置へ移動してしまう問題を改修しました。

    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. コンパイル時のマイコン種別に、H8SXN, H8SXM, H8SXAおよびH8SXXのいずれかを選択している。
    2. コンパイル時にgoptimizeオプションを使用している。
    3. リンク時に、レジスタ退避/回復の最適化(optimize=register)を使用している。
    4. goto文の分岐先ラベルを記述している関数がある。
    5. コンパイルにより、d.の分岐先ラベルが関数の先頭位置に出力される。

  3. レジスタ退避/回復の最適化 (optimize=register)で、誤った実行時ルーチンを作成してしまう問題を改修しました。

    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. コンパイル時のマイコン種別に、300, 300L, 300reg, 300HNおよび300HAのいずれかを選択している。
    2. コンパイル時にgoptimizeオプションを使用している。
    3. リンク時に、レジスタ退避/回復の最適化 (optimize=register)を使用している。
    4. リンク時に、共通コードをサブルーチン化する最適化(optimize=same_code)を使用している。
    5. c.の最適化により、以下の名前の実行時ルーチンが生成される。*
      • ・"_opt_regsvpat<数字>"
      • ・"_opt_regldpat<数字>"
    * 実行ルーチンが生成された場合は、リンカにメッセージ(メッセージ番号L0002)を表示させることができます。リンカのmessageオプションを使用して、このメッセージを表示させてください。

  4. リンク時に1byteサイズのconst修飾付き変数の設定値が誤って0になる問題を改修しました。

    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. 使用しているリンカのバージョンが、V.9.00.00以降である。**
    2. コンパイル時にgoptimizeオプションを選択している。
    3. リンク時に未参照シンボル削除の最適化(optimize=symbol_delete)を使用している。
    4. リンク時に、定数/文字列の統合の最適化(optimize=string_unify)を使用している。
    5. c.の最適化により、削除される関数がある。
    6. e.の削除される関数からのみ参照される、1byteサイズのconst修飾付き変数がある*

    * 変数および関数が削除された場合は、リンカにメッセージ(メッセージ番号L0004)を表示させることができます。リンカのmessageオプションを使用して、このメッセージを表示させてください。

  5. スタック解析ツールCall Walkerで、.stack制御命令で記述したスタック使用量が正しく表示されない場合がある問題を改修しました。

    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. アセンブリソースで、シンボル (関数やデータ) を定義している。
    2. a.のシンボルを、別のアセンブリソースから参照している。
    3. a.のアセンブリソースでは、シンボルに対して.stack制御命令を記述しておらず、b.のアセンブリソースでは、シンボルに対して.stack制御命令を記述している。

  6. リンケージリストファイル (.map) の関数アクセス最適化対象シンボル情報(シンボルの参照回数)の表示で、誤ったシンボル名(_$ind_opt<数字>)を表示する問題を改修しました。

  7. 以下の2点の、エラーが発生する問題を改修しました。
    1. リンク時に、定数/文字列の統合の最適化(optimize=string_unify)と未参照シンボルの削除の最適化(optimize=symbol_delete)を同時に使用し、ELF/DWARFフォーマットコンバータ(HELFCNV)を使用した場合、エラーが発生して以下のメッセージが表示される。
      G2003 (E)Illegal file format "ファイル名"
    2. CPUオプションSBRで任意のアドレスを設定し、かつリンク時に短絶対アドレッシングモード活用の最適化(optimize=variable_access)を使用した場合、エラーが発生して以下のメッセージが表示される。
      L2330 (E)Relocation size overflow

  8. 以下の4点の、内部エラーが発生する問題を改修しました。
    1. .EQUラベルをアセンブリソース内で記述し、リンク時に最適化を使用すると、内部エラー(エラー番号L4001)が発生する場合がある。
    2. outputオプションで、アドレス範囲を記述して出力ファイルを分割すると、内部エラー (エラー番号L4000-5560) が発生する場合がある。
    3. バージョンV.9.00.03のリンカを使用していて、マイコン種別に300, 300L, 300reg, 300HNおよび300HAのいずれかを選択すると、内部エラー (エラー番号 L4001) が発生する場合がある。**
    4. stackオプションを使用すると、内部エラー (エラー番号 L4000) が発生する場合がある。

** リンカのバージョンの確認方法

  1. 統合開発環境High-performance Embedded Workshopの メニュー「ツール」->「アドミニストレーション」を選択する。
  2. 開いたツールアドミニストレーションダイアログボックスの「登録済コンポーネント」リストの「Toolchains」の中から使用中のコンパイラパッケージを選択し、プロパティボタンをクリックする。
  3. 表示されたプロパティダイアログボックスの情報タブを選択すると リンカのバージョンが表示される。
    表示例: Optimizing Linkage Editor (V.9.00.02)

改修内容

  1. リンカが生成するリンケージリストファイルに関する問題を改修しました。
  2. 以下のエラー L0103が誤って出力される問題を改修しました。
    ** L0103 (I) Multiple stack sizes specified to the symbol "関数名"

    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. リンカのバージョンが V.9.00.00 以降である(*)。
    2. C/C++ソースファイルで定義した関数と同じ名前の変数 (extern修飾子 付き)が別のC/C++ソースファイルに存在する。 もしくは、「_<関数名>」というimportラベルがアセンブリソースファイルに存在する。
    3. リンク時にmessageオプションを使用している。
    4. リンク時にstackオプションを使用している。

  3. 誤ったスタック情報ファイル (.sni)を生成する問題を改修しました。

    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. リンカのバージョンが V.9.00.00 以降である(*)。
    2. C/C++ソースファイルで定義した関数と同じ名前の変数 (extern修飾子 付き)が別のC/C++ソースファイルに存在する。 もしくは、「_<関数名>」というimportラベルがアセンブリソースファイルに存在する。
    3. リンク時にstackオプションを使用している。

    注意:
    該当の.sniファイルを、スタック解析ツール (Call Walker)に 入力すると、誤ったスタック使用量が表示されます。

  4. 未参照シンボル削除の最適化 (optimize=symbol_delete)によって、 誤ったオブジェクトコードが生成されることがある問題を改修しました。

    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. リンカのバージョンが V.9.00.00 以降である(*)。
    2. コンパイル時にgoptimizeオプションを選択している。
    3. コンパイル時にpack=1オプションを選択している。 もしくは、C/C++ソースファイル中に「#pragma pack 1」を記述している。
    4. リンカの未参照シンボル削除の最適化が有効になっている。
      以下のいずれかの場合に有効になります。
      • ・optimize=symbol_deleteオプションを使用している
      • ・optimize=speedオプションを使用している
      • ・optimizeオプションを使用している
      • ・nooptimizeオプションを使用していない
    5. d.の最適化によって、定数(const修飾子付き変数)、および初期値付き変数が削除される。
  5. デバッグ情報圧縮機能(compressオプション)を使用すると、誤ったデバッグ情報を生成する問題を改修しました。

    問題の発生条件:
    以下の条件をすべて満たす場合に発生することがあります。
    1. リンカのバージョンが V.7.0 以降である(*)。
    2. コンパイル時にdebugオプションを選択している。
    3. リンカでcompressオプションを使用して、リロケータブルファイル (.rel)を生成している。
    4. c.の.relファイルをリンカに入力し、compressオプションを使用して ロードモジュールを生成している。

    注意:
    該当のロードモジュールをデバッガにロードすると誤った 内容を表示します。

  6. 下記のいずれかの条件に該当する場合、内部エラーが発生する場合が ある問題を改修しました。
    • ・アセンブリソース記述の.EQUシンボルを含んだ.relファイルを リンカに入力している。(発生する内部エラー: L4000-8010)
    • ・.EQUシンボルを呼び出す関数コールを持つオブジェクトファイルを リンカに入力している。(発生する内部エラー: L4000-8874)
    • ・.relファイルをリンカに入力している。(発生する内部エラー: L4000-8027または L4001)

* リンカのバージョンの確認方法

  1. 統合開発環境High-performance Embedded Workshopの メニュー「ツール」->「アドミニストレーション」を選択する。
  2. 開いたツールアドミニストレーションダイアログボックスの 「登録済コンポーネント」リストの「Toolchains」の中から 使用中のコンパイラパッケージを選択し、プロパティボタンをクリックする。
  3. 表示されたプロパティダイアログボックスの情報タブを選択すると リンカのバージョンが表示される。
    表示例: Optimizing Linkage Editor (V.9.00.02)

新機能

次の機能を追加しました。

binaryオプション入力セクションへの境界調整数指定機能
binaryオプションに指定するセクションに対して、境界調整数を指定することができます。

クロスリファレンス情報出力機能
show=xreferenceオプション指定により、クロスリファレンス情報をリンケージリスト内に出力します。これにより、変数または関数がどこから参照されているのかを知ることができます。

参照されないシンボルの通知機能
msg_unusedオプション指定により、最適化を使用しない状況でも参照されないシンボルの存在を知ることができます。

改修内容

以降6点の問題を改修しました。

共通コード統合最適化指定時のデバッグ情報
共通コード統合最適化(optimize=same_code)が有効な場合、生成されたデバッグ情報をもとにデバッガでステップ実行を行うと意図しない関数へ飛ばされる場合がある。

サブコマンドファイルのinputオプション記述に対する不正なウォーニング出力
サブコマンドファイル内で、例のような記述がされた場合、不正なウォーニングメッセージ(L1010)が出力される。

例:
-----------------
  -input=a.obj
  -input=b.obj
  -input=
-----------------

共通コード統合最適化による内部エラーの発生または不正なオブジェクト生成
共通コード統合最適化が有効な場合に不正なコードが生成される、または、他のリンク時最適化の際に内部エラーとなる場合がある。

発生条件:以下の条件をすべて満たす場合、発生する可能性があります。

  1. コンパイル時にgoptimizeオプションを指定している。
  2. 共通コード統合最適化(optimize=same_code)が有効である。
  3. optlnk V.8.00.03以降のバージョンを使用している。
  4. 外部変数へのアクセスや関数呼び出しがないオブジェクトファイル(もしくはライブラリモジュール)がリンクされる。
  5. 4.のコードが2.の最適化の対象となる。

短絶対アドレッシング活用の最適化によるエラー発生
短絶対アドレッシング活用の最適化が有効な場合、不正なエラー(L2330)が出力される場合がある。

発生条件:以下の条件をすべて満たす場合、発生する可能性があります。

  1. コンパイル時にgoptimizeオプションを指定している。
  2. 短絶対アドレッシング活用の最適化(optimize=variable_access)が有効である。
  3. 下記のいずれかの条件に該当する。
    3a. sbrオプションの指定アドレスが16bit絶対アドレス範囲外である。
    3b. 16bit絶対アドレス範囲内に配列や構造体変数が割りついている。

レジスタ退避および回復コードの最適化による不正なオブジェクト生成
コンパイル時に引数格納レジスタ指定を行った場合、レジスタ退避および回復コードの最適化によって不正なコードが生成される場合がある。

発生条件:以下の条件をすべて満たす場合、発生する可能性があります。

  1. コンパイル時にgoptimizeオプションを指定している。
  2. コンパイル時にregparam=3オプションを指定している、または、__regparam3キーワードを指定している関数がある。
  3. リンク時にレジスタ退避および回復コードの最適化(optimize=register)が有効である。

内部エラー
以下に該当する場合に内部エラーが発生する。

  1. 未参照シンボル削除最適化(optimize=symbol_delete)が有効な場合にoutputオプションで分割出力指定する(内部エラー(L4000-7041)発生)。
  2. 短絶対アドレッシング活用の最適化(optimize=variable_access)が有効な場合(内部エラー(L4000-8996)発生)。
  3. レジスタ退避および回復最適化(optimize=register)が有効な場合(内部エラー(L4000-8416)発生)。

お問い合わせ

本件に関する詳細について、フォームからお問い合わせいただけます。

お問い合わせフォーム