(57)【要約】【課題】フラッシュメモリのブロック情報の準備を不要とする。【解決手段】ｃソースをコンパイル・リンクする時に関数名、配置アドレス、最大サイズ、ダミー関数有無フラグの情報を格納した関数情報を作成し、ある関数を修正後に再度コンパイル・リンクする時に、その情報を基に関数単位でコードサイズが修正前より大きくなった場合、修正前のサイズを超えたサイズ分をダミー関数として出力することで、ｃソースの変更に着目せず、コードサイズでの差分に着目し、分岐命令出力を最小限に抑える。このようにして、ｃソースのコンパイル、リンク時に関数情報を自動で作成及び更新する。【選択図】図３
2011028648.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータにより実現されるオブジェクトコード生成システムであって、
第１のソースファイルを読み込み、前記第１のソースファイルに含まれる関数の配置及びサイズを示す関数情報と、前記第１のソースファイルの実行形式ファイルと、を生成する第１のオブジェクトコード生成処理手段と、
前記実行形式ファイルに対するデバッグの結果に基づいて前記第１のソースファイルを修正した第２のソースファイルと、前記関数情報と、を読み込み、前記第２のソースファイルの中に、前記関数情報に含まれる関数のサイズよりも大きなサイズとなる関数を発見した場合は、当該関数に対応するダミー関数を生成して、前記ダミー関数を前記関数とは異なる箇所に配置し、前記関数の配置箇所には、前記ダミー関数への分岐命令を配置する第２のオブジェクトコード生成処理手段と
を含む
オブジェクトコード生成システム。
【請求項２】
請求項１に記載のオブジェクトコード生成システムであって、
前記第２のオブジェクトコード生成処理手段は、前記関数のコードサイズと前記ダミー関数への分岐命令コードサイズとの合計サイズが前記関数情報に含まれる関数の最大サイズ内に収まるサイズで、前記関数を分割して前記ダミー関数を生成する
オブジェクトコード生成システム。
【請求項３】
請求項１又は２に記載のオブジェクトコード生成システムであって、
前記第２のオブジェクトコード生成処理手段は、前記関数に所定のオプションが指定されているか確認し、前記関数に前記所定のオプションが指定されていれば、前記関数を分割して前記ダミー関数を生成する
前記オブジェクトコード生成システム。
【請求項４】
請求項１乃至３のいずれか一項に記載のオブジェクトコード生成システムであって、
前記第２のオブジェクトコード生成処理手段は、前記関数情報について、関数単位で配置アドレスと配置アドレスの上位側までの最大サイズを更新する
オブジェクトコード生成システム。
【請求項５】
請求項１乃至４のいずれか一項に記載のオブジェクトコード生成システムであって、
前記実行形式ファイルに対するデバッグを行うデバッグ処理手段
を更に含み、
前記デバッグ処理手段は、
前記実行形式ファイルを読み込んで、前記実行形式ファイルからオブジェクトコード、デバッグ情報、及びシンボル情報を取得し、前記取得されたオブジェクトコード、デバッグ情報、及びシンボル情報を、一時的にデータを保持するためのテンポラリ領域に格納し、前記格納されたシンボル情報のシンボルインデクスを使用して当該関数のデバッグ情報へのポインタを設定し、関数単位のデバッグ情報数の設定とデバッグ情報を読み込み、指示されたコマンドを読み込む入力処理手段と、
関数内の残りデバッグ情報数が０か確認し、関数内にデバッグ情報があれば、１行分のデバッグ情報を読み込み、デバッグ情報数を１行分減らし、読み込まれた１行分のデバッグ情報がダミー関数への分岐命令か否かを命令分岐フラグの有無で判断し、読み込まれた１行分のデバッグ情報がダミー関数への分岐命令で無いならば、前記読み込まれたコマンドを実行し、関数内の残りデバッグ情報数が０になった場合、関数単位で読み込まれたデバッグ情報に基づくデバッグがダミー関数内のデバッグであるかをチェックし、ダミー関数内のデバッグであるならば、無条件ジャンプ命令の戻りアドレスから関数のデバッグ情報へのポインタを決定し、該当する関数のデバッグ情報を読み込み、デバッグ情報数を設定し、戻りアドレスとデバッグ情報内アドレスが一致するまでスキップし、スキップ分をデバッグ情報数から差し引いた後、前記読み込まれたコマンドの処理を続行するコマンド実行手段と、
前記読み込まれたコマンドの実行結果を出力する表示手段と
を具備する
オブジェクトコード生成システム。
【請求項６】
コンピュータに実行させるオブジェクトコード生成方法であって、
第１のオブジェクトコード生成処理において、第１のソースファイルを読み込み、前記第１のソースファイルに含まれる関数の配置及びサイズを示す関数情報と、前記第１のソースファイルの実行形式ファイルと、を生成することと、
第２のオブジェクトコード生成処理において、前記実行形式ファイルに対するデバッグの結果に基づいて前記第１のソースファイルを修正した第２のソースファイルと、前記関数情報と、を読み込み、前記第２のソースファイルの中に、前記関数情報に含まれる関数のサイズよりも大きなサイズとなる関数を発見した場合は、当該関数に対応するダミー関数を生成して、前記ダミー関数を前記関数とは異なる箇所に配置し、前記関数の配置箇所には、前記ダミー関数への分岐命令を配置することと
を含む
オブジェクトコード生成方法。
【請求項７】
請求項６に記載のオブジェクトコード生成方法であって、
前記第２のオブジェクトコード生成処理において、前記関数のコードサイズと前記ダミー関数への分岐命令コードサイズとの合計サイズが前記関数情報に含まれる関数の最大サイズ内に収まるサイズで、前記関数を分割して前記ダミー関数を生成すること
を更に含む
オブジェクトコード生成方法。
【請求項８】
請求項６又は７に記載のオブジェクトコード生成方法であって、
前記第２のオブジェクトコード生成処理において、前記関数に所定のオプションが指定されているか確認し、前記関数に前記所定のオプションが指定されていれば、前記関数を分割して前記ダミー関数を生成すること
を更に含む
前記オブジェクトコード生成方法。
【請求項９】
請求項６乃至８のいずれか一項に記載のオブジェクトコード生成方法であって、
前記第２のオブジェクトコード生成処理において、前記関数情報について、関数単位で配置アドレスと配置アドレスの上位側までの最大サイズを更新すること
を更に含む
オブジェクトコード生成方法。
【請求項１０】
請求項６乃至９のいずれか一項に記載のオブジェクトコード生成方法であって、
前記実行形式ファイルに対するデバッグを行うデバッグ処理において、
前記実行形式ファイルを読み込んで、前記実行形式ファイルからオブジェクトコード、デバッグ情報、及びシンボル情報を取得し、前記取得されたオブジェクトコード、デバッグ情報、及びシンボル情報を、一時的にデータを保持するためのテンポラリ領域に格納し、前記格納されたシンボル情報のシンボルインデクスを使用して当該関数のデバッグ情報へのポインタを設定し、関数単位のデバッグ情報数の設定とデバッグ情報を読み込み、指示されたコマンドを読み込むことと、
関数内の残りデバッグ情報数が０か確認し、関数内にデバッグ情報があれば、１行分のデバッグ情報を読み込み、デバッグ情報数を１行分減らし、読み込まれた１行分のデバッグ情報がダミー関数への分岐命令か否かを命令分岐フラグの有無で判断し、読み込まれた１行分のデバッグ情報がダミー関数への分岐命令で無いならば、前記読み込まれたコマンドを実行することと、
関数内の残りデバッグ情報数が０になった場合、関数単位で読み込まれたデバッグ情報に基づくデバッグがダミー関数内のデバッグであるかをチェックし、ダミー関数内のデバッグであるならば、無条件ジャンプ命令の戻りアドレスから関数のデバッグ情報へのポインタを決定し、該当する関数のデバッグ情報を読み込み、デバッグ情報数を設定し、戻りアドレスとデバッグ情報内アドレスが一致するまでスキップし、スキップ分をデバッグ情報数から差し引いた後、前記読み込まれたコマンドの処理を続行することと、
前記読み込まれたコマンドの実行結果を出力することと
を更に含む
オブジェクトコード生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オブジェクトコード生成システムに関し、特に組込みマイコン用Ｃコンパイラのオブジェクトコード生成システムに関する。
【背景技術】
【０００２】
図１に、一般的なソフトウェア開発のためのシステムブロック図を示す。Ｃコンパイラのオブジェクトコード生成方法では、ソースプログラム（ソースコード）の変更箇所がアドレスの先頭の近い程に、ソースプログラム変更時に生じるオブジェクトコードの差異は膨大になる。ソースプログラム変更前と変更後でオブジェクトコードの差異が膨大であれば、組込みマイコンが内蔵されているフラッシュメモリにおいて書き換えるコードのサイズも膨大となる。そのため、差異を最小にするＣコンパイラのコード生成方法の効率化が望まれている。
【０００３】
組込みマイコン用Ｃコンパイラのオブジェクトコード生成方法に関し、効率良くオブジェクトコードを配置するシステムが、特開２００７−１６４２４２号公報（特許文献１）に記載されている。この特許文献１の図１に、従来技術のソフトウェア開発においてソースプログラム変更前と変更後で生成されるオブジェクトコードの差異を最小限に抑えることで、組込みマイコンに内蔵されるフラッシュメモリの書き換えブロック数を最小限に抑えるシステム図が示されている。
【０００４】
従来技術でのオブジェクトコード生成までの動作を、以下の（１）〜（６）に説明する。
【０００５】
（１）ソースプログラムに変更前と変更後の両方のプログラムをＯＬＤとＮＥＷで区別して記述し、コンパイラで両方を翻訳する。
【０００６】
（２）事前にＣコンパイルする前に準備されたデバイス毎に異なるフラッシュメモリのブロック情報ファイルを読み込む。
【０００７】
（３）Ｃコンパイラはソースプログラムの変更前と変更後のコードサイズの差異、及びフラッシュメモリのブロック構成を参照してオブジェクトコードの生成を行う。
【０００８】
（４）Ｃコンパイラはソースプログラムがオブジェクトコードのコードサイズを増加させる記述の場合、ソースプログラムが変更された箇所は分岐命令に置換えてコード生成、追加されたソースプログラムは変更前にはオブジェクトコードが配置されてブロックに対応する箇所にコード生成を行う。
【０００９】
（５）前記分岐命令のオブジェクトコードがブロック情報と比較して２ブロックにまたがって配置されている場合、分岐命令が配置された箇所からアドレスが小さい方向に配置されている命令を変更前にはオブジェクトコードが配置されていなかったブロックに対応する箇所に移動して、その空いた箇所に分岐命令を配置する。
【００１０】
（６）Ｃコンパイラはソースプログラムがオブジェクトコードのコード数を減少させる記述の場合、ソースプログラムが変更された箇所に削除されたソースプログラムのコード数分のダミー命令を追加してコード生成を行う。
【００１１】
組み込みシステムのプログラム開発を想定した場合、メモリの配置先が変わることによりプログラムの実行速度、実行タイミング及び実行の挙動が変わってくるため、変更していないプログラムは、変更後も変更前と同じ配置である必要がある。また、同じ配置場所で、変更していないプログラムであるならば、テスト時間も効率化できる。
【００１２】
しかし、従来技術では、オブジェクトコードの未修正部のアドレスを変更せずに、変更部のオブジェクトコードを空いた領域へジャンプさせる方法として、変更前と変更後のプログラムをコンパイラがコンパイル時にオブジェクトコードを比較しながら必要に応じてジャンプ命令を生成している。この方法では、オブジェクトサイズのみ着目しているため、予め決められたフラッシュメモリのブロック情報が別途必要となる。
【００１３】
また、関連する技術として、設計上の論理的なまとまりとしてプログラムの修正情報を得ることを可能にする修正プログラムの比較方法が、特開２００６−２７７１２７号公報（特許文献２）に記載されている。この関連技術では、比較対象のプログラムにおいて、設計上の論理構造であるモジュール、ファイル、関数、ソースコードの階層構造毎に、比較すべき項目を定義し、比較を行う。また、比較結果をプログラム修正情報として一旦修正内容保持部に記録する。また、修正内容保持部のプログラム修正情報から、階層構造をもつ修正情報出力画面を作成して表示する。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】特開２００７−１６４２４２号公報
【特許文献２】特開２００６−２７７１２７号公報
【発明の概要】
【発明が解決しようとする課題】
【００１５】
特開２００７−１６４２４２号公報（特許文献１）には、フラッシュメモリに対して、オブジェクトコードの書き換えを行う技術が記載されている。具体的には、ソースプログラムの変更により、オブジェクトコード数が増加した場合には、フラッシュメモリの未使用の領域に、変更後のオブジェクトコードで追加された部分をサブルーチン化して配置している。
【００１６】
しかしながら、上記の技術では、サブルーチン化はブロック単位となっている。従って、１つの関数のコードサイズが大きく、複数のブロックを消費するような場合は、ソースプログラムの変更内容によっては、サブルーチンと分岐命令が多数生成されてしまい、効率の悪いものになってしまう場合がある。
【００１７】
例えば、１つの関数が、４つのブロックにわたるようなものであった場合に、３つのブロックに相当する部分でコード数が増加する変更を行うと、３つのブロック分のサブルーチンと分岐命令が生成されることになってしまう。
【課題を解決するための手段】
【００１８】
本発明のオブジェクトコード生成システムは、コンピュータにより実現されるオブジェクトコード生成システムであって、第１のオブジェクトコード生成処理手段と、第２のオブジェクトコード生成処理手段とを含む。第１のオブジェクトコード生成処理手段は、第１のソースファイルを読み込み、第１のソースファイルに含まれる関数の配置及びサイズを示す関数情報と、第１のソースファイルの実行形式ファイルと、を生成する。第２のオブジェクトコード生成処理手段は、実行形式ファイルに対するデバッグの結果に基づいて第１のソースファイルを修正した第２のソースファイルと、関数情報と、を読み込み、第２のソースファイルの中に、関数情報に含まれる関数のサイズよりも大きなサイズとなる関数を発見した場合は、当該関数に対応するダミー関数を生成して、ダミー関数を当該関数とは異なる箇所に配置し、当該関数の配置箇所には、ダミー関数への分岐命令を配置する。
【００１９】
本発明のオブジェクトコード生成方法は、コンピュータに実行させるオブジェクトコード生成方法であって、第１のオブジェクトコード生成処理と、第２のオブジェクトコード生成処理を含む。本発明のオブジェクトコード生成方法では、第１のオブジェクトコード生成処理において、第１のソースファイルを読み込み、第１のソースファイルに含まれる関数の配置及びサイズを示す関数情報と、第１のソースファイルの実行形式ファイルと、を生成する。次に、第２のオブジェクトコード生成処理において、実行形式ファイルに対するデバッグの結果に基づいて第１のソースファイルを修正した第２のソースファイルと、関数情報と、を読み込み、第２のソースファイルの中に、関数情報に含まれる関数のサイズよりも大きなサイズとなる関数を発見した場合は、当該関数に対応するダミー関数を生成して、ダミー関数を当該関数とは異なる箇所に配置し、当該関数の配置箇所には、ダミー関数への分岐命令を配置する。
【発明の効果】
【００２０】
修正前の関数のコードサイズと修正後の関数のコードサイズを比較し、修正後の関数のコードサイズの方が大きい場合、修正後の関数のみダミー関数を生成し、他の修正していない関数の配置アドレスを変更しないため、最小限の分岐命令に抑えることができる。
【図面の簡単な説明】
【００２１】
【図１】従来技術におけるソフトウェア開発のためのシステムブロック図である。
【図２】本発明を説明するためのソースプログラムの修正前、修正後のサンプル例を説明するための図である。
【図３】本発明におけるシステム構成図である。
【図４】本発明における関数情報の例を説明するための図である。
【図５】本発明におけるデバッグ情報の例を説明するための図である。
【図６】本発明におけるシンボル情報の例を説明するための図である。
【図７】本発明における修正前の関数情報、デバッグ情報、シンボル情報の例を説明するための図である。
【図８】本発明におけるソースプログラムの修正後、ダミー関数生成後のサンプル例を説明するための図である。
【図９】本発明におけるコンパイル処理のフローチャートである。
【図１０】本発明における修正関数のコンパイル後の関数情報、デバッグ情報、シンボル情報の例を説明するための図である。
【図１１】本発明におけるリンク処理のフローチャートである。
【図１２】本発明における修正関数のリンク後の関数情報、デバッグ情報、シンボル情報の例を説明するための図である。
【図１３】本発明におけるデバッグのフローチャートである。
【図１４】本発明の第２実施形態におけるコンパイル処理のフローチャートである。
【図１５】本発明の第２実施形態におけるソースプログラムの修正後、ダミー関数生成後のサンプル例を説明するための図である。
【図１６】本発明の第２実施形態における修正関数のリンク後の関数情報、デバッグ情報、シンボル情報の例を説明するための図である。
【図１７】本発明の第３実施形態におけるコンパイル処理のフローチャートである。
【発明を実施するための形態】
【００２２】
＜第１実施形態＞
以下に、本発明の第１実施形態について添付図面を参照して説明する。
図２のサンプルソースを参照し、本実施形態において、修正後コードサイズが増加した例を説明する。
【００２３】
図２の修正前のｃソース（Ｃ言語で記述されたソースプログラム）１０は、「ｍａｉｎ」、「Ｆｕｎｃ−Ａ」、「Ｆｕｎｃ−Ｂ」の各関数を含んでいる。ここでは、修正前の「Ｆｕｎｃ−Ａ」は「０ｘ０１０００番地」に配置されており、修正前の「Ｆｕｎｃ−Ｂ」は「０ｘ１５００番地」に配置されていることを示している。
【００２４】
図２の修正後のｃソース２０は、修正後の「Ｆｕｎｃ−Ａ」にフォーカスしたサンプルソースで、修正後の「Ｆｕｎｃ−Ａ」が修正前に比べて増加していることを示している。
【００２５】
（システム構成）
図３に、本発明におけるシステム構成図を示す。
本発明のオブジェクトコード生成システムは、コンパイル処理部１００と、リンク処理部２００と、デバッグ処理部３００を備える。
【００２６】
コンパイル処理部１００は、コンパイルを行い、ソースプログラム（ソースコード）を、機械語の集合であるオブジェクトコードに変換する。リンク処理部２００は、リンク処理を行い、オブジェクトコードを解析して、参照している他のオブジェクトコードやライブラリ等を探し出し、必要なものを結合して実行形式のファイルを作成する。デバッグ処理部３００は、デバッグを行い、プログラムの不具合（バグ）の発見や修正を支援する。デバッグ処理部３００は、必要に応じて、プログラムの実行を特定の位置で中断する「ブレークポイント」機能や、一段階ずつ動作を確認しながら実行する「ステップ実行」機能、実行中のメモリやレジスタ、変数等の状態を見る「トレース」機能を有する。
【００２７】
コンパイル処理部１００の例として、コンパイラが考えられる。リンク処理部２００の例として、リンカが考えられる。デバッグ処理部３００の例として、デバッガが考えられる。なお、コンパイル処理部１００、リンク処理部２００、及びデバッグ処理部３００の具体的なハードウェアの例として、ＰＣ（パソコン）やサーバ等のコンピュータ装置、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）やマイクロプロセッサ（ｍｉｃｒｏｐｒｏｃｅｓｓｏｒ）等の処理装置、又は同様の機能を有する半導体集積回路（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ（ＩＣ））等が考えられる。また、コンパイル処理部１００、リンク処理部２００、及びデバッグ処理部３００で入出力される情報を記憶するためのハードウェアの例として、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）やＥＥＰＲＯＭ（Ｅｌｅｃｔｒｉｃａｌｌｙ  Ｅｒａｓａｂｌｅ  ａｎｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、或いはフラッシュメモリ等の不揮発性メモリ等が考えられる。但し、実際には、これらの例に限定されない。
【００２８】
コンパイル処理部１００は、入力処理部１０１と、シンボル登録部１０２と、コード情報生成部１０３と、デバッグ情報生成部１０４と、コード・デバッグ情報更新部１０５と、出力処理部１０６を備える。
【００２９】
入力処理部１０１は、ｃソースファイル４０１を入力し、ｃソースファイル４０１に対する構文解析を行う。ここでは、ｃソースファイル４０１は、修正前のｃソース１０又は修正後のｃソース２０が記述されたファイルである。シンボル登録部１０２は、構文解析によりシンボル情報１０７へシンボル（デバッグシンボル）を登録する。コード情報生成部１０３は、ｃソースファイル４０１に基づいて、オブジェクトコードを生成する。デバッグ情報生成部１０４は、ｃソースファイル４０１に基づいて、デバッグ情報１０８を生成する。コード・デバッグ情報更新部１０５は、デバッグ情報１０８と関数情報４０３との差分があれば、その差分を基に、オブジェクトコード及びデバッグ情報１０８を更新する。出力処理部１０６は、コンパイラの出力結果であるＯＭＦ（オブジェクトモジュールファイル）４０２を出力する。ＯＭＦは、コンパイル時のオブジェクトコードとデバッグ情報１０８とシンボル情報１０７を含んでいる。
【００３０】
リンク処理部２００は、入力処理部２０１と、配置処理部２０２と、シンボル解決部２０３と、コード生成部２０４と、関数情報更新部２０５と、出力処理部２０６を備える。
【００３１】
入力処理部２０１は、ＯＭＦ４０２を入力し、ＯＭＦ４０２に基づいて、配置情報２０７とシンボル情報２０８とデバッグ情報２０９を作成する。配置処理部２０２は、関数の配置を行い、配置アドレスを決定する。このとき、配置処理部２０２は、決定された配置アドレスに基づいて、配置情報２０７を更新する。シンボル解決部２０３は、配置アドレスの決定に応じて、当該関数のシンボル値を補正し決定する。このとき、シンボル解決部２０３は、決定されたシンボル値に基づいて、シンボル情報２０８を更新する。コード生成部２０４は、決定されたシンボル値を使い、実行形式のオブジェクトコードを生成する。関数情報更新部２０５は、実行形式のオブジェクトコードが確定したら、関数情報４０３に対し、配置アドレス、サイズ情報を更新する。出力処理部２０６は、リンカの出力結果であるＬＭＦ（ロードモジュールファイル）４０４を出力する。ＬＭＦは、リンク時のオブジェクトコードとデバッグ情報２０９とシンボル情報２０８を含んでいる。
【００３２】
デバッグ処理部３００は、入力処理部３０１と、コマンド実行部３０２と、表示部３０３を備える。
【００３３】
入力処理部３０１は、ＬＭＦ４０４を入力し、ＬＭＦ４０４からデバッグ準備としてオブジェクトコード及びデバッグ情報を読み込み、デバッグ情報３０４とシンボル情報３０５を作成する。コマンド実行部３０２は、ユーザが指定するデバッグコマンドを解析し、このデバッグコマンドを設定・実行する。表示部３０３は、デバッグコマンドの入出力結果を入出力装置４０５に表示する。
【００３４】
図４は、本発明における関数情報４０３の詳細な図である。
関数情報４０３は、関数名と、配置アドレスと、最大サイズと、ダミー関数有無フラグを有する。これらの情報は、互いに紐付けられている。
【００３５】
関数名は、関数を識別するための名称を示す「Ｆｕｎｃ−Ａ」、「Ｆｕｎｃ−Ｂ」、「Ｄ＿Ｆｕｎｃ−Ａ」等の情報を保持する。配置アドレスは、各関数が配置された領域の先頭アドレスを示す「０ｘ０１０００番地」、「０ｘ１５００番地」、「０ｘ８００００番地」等の情報を保持する。最大サイズは、各関数が配置された領域のサイズを示す「０ｘ５００」、「０ｘ１００」、「０ｘ０８０」等の情報を保持する。ダミー関数有無フラグは、各関数に対応するダミー関数の有無を示す「Ｄ＿Ｆｕｎｃ−Ａ」、「０」等の情報を保持する。図４では、ダミー関数有無フラグは、各関数に対応するダミー関数が存在する場合、そのダミー関数の関数名を保持し、各関数に対応するダミー関数が存在しない場合、「０」を保持する。
【００３６】
図５は、本発明におけるデバッグ情報１０８、２０９、３０４の詳細な図である。
デバッグ情報１０８、２０９、３０４の各々は、行と、アドレスと、命令分類フラグと、ダミー関数内フラグと、シンボルインデクスを有する。これらの情報は、互いに紐付けられている。
【００３７】
行は、当該関数内の各々の行（Ｌｉｎｅ）を識別するための名称を示す「Ｌｉｎｅ１’」、「Ｌｉｎｅ１」、「Ｌｉｎｅ２」、「Ｌｉｎｅ３」、「Ｌｉｎｅ４」等の情報を保持する。アドレスは、当該行が配置された領域の先頭アドレスを示す「０ｘ０１０００番地」、「０ｘ８００００番地」、「０ｘ８０２００番地」、「０ｘ８０４００番地」、「０ｘ８０６００番地」等の情報を保持する。命令分類フラグは、当該行がダミー関数への分岐命令か否かを示す「分岐」、「通常」等の情報を保持する。ダミー関数内フラグは、ダミー関数内のデバッグであるかをチェックするためのダミー関数の有無を示す「Ｆｕｎｃ−Ａ」、「Ｄ＿Ｆｕｎｃ−Ａ」等の情報を保持する。シンボルインデクスは、シンボルの識別番号を示す「１１」、「１４」等の情報を保持する。
【００３８】
本説明におけるデバッグ情報１０８、２０９、３０４は、当該関数分のみ記載してある。
【００３９】
図６は、本発明におけるシンボル情報１０７、２０８、３０５の詳細な図である。
シンボル情報１０７、２０８、３０５は、シンボルインデクスと、シンボル名と、シンボル値と、定義関数のシンボルインデクスと、ダミー関数が属する関数のシンボル情報内インデクスと、生成したダミー関数のシンボル情報内インデクスと、デバッグ情報へのポインタを有する。これらの情報は、互いに紐付けられている。
【００４０】
シンボルインデクスは、シンボルの識別番号を示す「１０」〜「１４」等の情報を保持する。シンボル名は、シンボルの識別情報として、当該シンボルに対応するファイル名や関数名を示す「Ｃ１．ｃ」、「Ｆｕｎｃ−Ａ」、「Ｆｕｎｃ−Ｂ」、「Ｄ＿Ｆｕｎｃ−Ａ」等の情報を保持する。シンボル値は、当該シンボルが配置された領域の先頭アドレスを示す「０ｘ０１０００番地」、「０ｘ１５００番地」、「０ｘ８００００番地」等の情報を保持する。定義関数のシンボルインデクスは、当該シンボルが関数を表している場合に、シンボル情報内における当該関数が属するファイルのシンボルインデクスを示す「１０」等の情報を保持する。ダミー関数が属する関数のシンボル情報内インデクスは、当該シンボルがダミー関数を表している場合に、シンボル情報内における当該ダミー関数を生成した関数のシンボルインデクスを示す「１１」等の情報を保持する。生成したダミー関数のシンボル情報内インデクスは、当該シンボルが関数を表し、当該関数がダミー関数を生成している場合に、シンボル情報内における当該関数により生成されたダミー関数のシンボルインデクスを示す「１４」等の情報を保持する。デバッグ情報へのポインタは、当該シンボルインデクスに対応するデバッグ情報内のシンボルインデクスを参照するためのポインタを示す情報を保持する。
【００４１】
（ＬＭＦ作成処理）
初めに、修正前のｃソース１０を使用してＬＭＦ４０４を作成するまでの処理の説明を行う。
【００４２】
コンパイル処理部１００は、入力処理部１０１で修正前のｃソース１０を入力し、シンボル登録部１０２、コード情報生成部１０３、デバッグ情報生成部１０４の処理後、コード・デバッグ情報更新部１０５で関数情報４０３を更新し、出力処理部１０６でＯＭＦ４０２と関数情報４０３を出力する。ここでは、入力処理部１０１は、修正前のｃソース１０を入力する。シンボル登録部１０２は、修正前のｃソース１０に基づいて、シンボル情報１０７を生成する。コード情報生成部１０３、修正前のｃソース１０に基づいて、オブジェクトコードを生成する。デバッグ情報生成部１０４は、修正前のｃソース１０に基づいて、デバッグ情報１０８を生成する。コード・デバッグ情報更新部１０５は、関数情報４０３を更新する。出力処理部１０６は、ＯＭＦ４０２と関数情報４０３を出力する。
【００４３】
リンク処理部２００は、入力処理部２０１でＯＭＦ４０２を入力し、配置処理部２０２、シンボル解決部２０３、コード生成部２０４の処理後、関数情報更新部２０５で関数情報４０３を更新し、出力処理部２０６でＬＭＦ４０４を出力する。また、リンク処理部２００は、関数情報更新部２０５で関数単位で配置アドレスと配置アドレスの上位側までの最大サイズを更新する。ここでは、入力処理部２０１は、ＯＭＦ４０２を入力する。配置処理部２０２は、ＯＭＦ４０２に基づいて、配置アドレスを決定する。シンボル解決部２０３は、ＯＭＦ４０２に基づいて、シンボル値を更新する。コード生成部２０４は、シンボル値に基づいて、オブジェクトコードを完成させる。配置処理部２０２、シンボル解決部２０３、コード生成部２０４の処理後、関数情報更新部２０５は、関数情報４０３を更新する。出力処理部２０６は、ＬＭＦ４０４を出力する。このとき、関数情報更新部２０５は、関数単位で配置アドレスと配置アドレスの上位側までの最大サイズを更新する。
【００４４】
なお、本発明においては、上記のように、コンパイル処理部１００が入力処理部１０１で修正前のｃソース１０を入力し、リンク処理部２００が関数情報更新部２０５で最大サイズを更新し出力処理部２０６でＬＭＦ４０４を出力するまでの一連の処理を、第１のオブジェクトコード生成処理と呼ぶ。また、修正前のｃソース１０に対する処理を行うコンパイル処理部１００とリンク処理部２００を組み合わせたものを、第１のオブジェクトコード生成処理手段と呼ぶ。
【００４５】
図７に、この時点（ＬＭＦ作成処理直後）の関数情報、シンボル情報１０７、デバッグ情報１０８を示す。
【００４６】
次に、図８に示すように、修正前のｃソース１０の関数「Ｆｕｎｃ−Ａ」を、修正後のｃソース２０に修正した場合の説明を行う。
【００４７】
（修正後コンパイル処理）
図９を参照して、コンパイル処理部１００における処理について説明する。
【００４８】
（１）ステップＳ１０１
コンパイル処理部１００は、修正後のｃソース２０を読み込み、シンボル登録部１０２、コード情報生成部１０３、デバッグ情報生成部１０４の処理により、関数単位で、オブジェクトコードとデバッグ情報１０８を生成し、生成途中でシンボル情報１０７、デバッグ情報１０８も生成する。ここでは、入力処理部１０１は、修正後のｃソース２０を入力する。シンボル登録部１０２は、修正後のｃソース２０に基づいて、修正後の関数のシンボル情報１０７を生成する。コード情報生成部１０３は、修正後のｃソース２０に基づいて、修正後の関数のオブジェクトコードを生成する。デバッグ情報生成部１０４は、修正後のｃソース２０に基づいて、修正後の関数のデバッグ情報１０８を生成する。
【００４９】
（２）ステップＳ１０２
コード・デバッグ情報更新部１０５は、修正前コンパイル時に作成された関数情報４０３を読み込む。ここでは、コード・デバッグ情報更新部１０５は、入力処理部１０１を介して、修正前コンパイル時に作成された関数情報４０３を読み込む。
【００５０】
（３）ステップＳ１０３
コード・デバッグ情報更新部１０５は、修正後の関数のオブジェクトコードサイズが関数情報４０３内の修正前の関数の最大サイズより大きいか確認する。ここでは、コード・デバッグ情報更新部１０５は、ステップＳ１０１で生成された修正後の関数のオブジェクトコードサイズと関数情報４０３内の修正前の関数の最大サイズとを比較する。このとき、コード・デバッグ情報更新部１０５は、修正後の関数のオブジェクトコードサイズが関数情報４０３内の修正前の関数の最大サイズ以下であれば、そのまま修正後の関数のオブジェクトコードを使用する。
【００５１】
（４）ステップＳ１０４
コード・デバッグ情報更新部１０５は、修正後の関数のオブジェクトコードサイズが関数情報４０３内の修正前の関数の最大サイズより大きければ、ダミー関数への分岐命令コードサイズを含めて最大サイズ内に収まるように、元関数（修正後の関数）とダミー関数とに、コードとデバッグ情報１０８を分割して、最大サイズ内に収まるオブジェクトコードの生成を行う。また、コード・デバッグ情報更新部１０５は、ダミー関数への分岐命令及び戻り処理の際の無条件ジャンプ命令を生成する。ここでは、コード・デバッグ情報更新部１０５は、元関数を分割し、ダミー関数を生成する。このとき、コード・デバッグ情報更新部１０５は、元関数のコードサイズとダミー関数への分岐命令コードサイズとの合計サイズが修正前の関数の最大サイズ内に収まるサイズで、元関数を分割し、ダミー関数を生成する。また、コード・デバッグ情報更新部１０５は、生成されたダミー関数に基づいて、デバッグ情報１０８を更新する。以降、この元関数のコードとダミー関数のコードが、それぞれ修正後の関数のオブジェクトコードとなる。また、コード・デバッグ情報更新部１０５は、ダミー関数への分岐命令及び戻り処理のため、無条件ジャンプ命令を使用する。図８の修正後のｃソース２０に、無条件ジャンプ命令の例として、「ｊｍｐ（ｌｐ）」を示す。
【００５２】
（５）ステップＳ１０５
コード・デバッグ情報更新部１０５は、修正後の関数のオブジェクトコードを修正後のＯＭＦ４０２へ出力する。ここでは、コード・デバッグ情報更新部１０５は、関数毎に、修正後の関数のオブジェクトコードを、修正後のＯＭＦ４０２へ追加する。修正後のＯＭＦ４０２は、修正前のＯＭＦ４０２に、ダミー関数への分岐命令及び戻り処理の際の無条件ジャンプ命令を追加したものである。コード・デバッグ情報更新部１０５は、全ての関数について、修正後の関数のオブジェクトコードを修正後のＯＭＦ４０２へ出力した場合、修正後のＯＭＦ４０２を確定する。その後、出力処理部１０６は、修正後のＯＭＦ４０２を出力する。
【００５３】
図１０に、この時点（修正後コンパイル処理直後）の関数情報、シンボル情報、デバッグ情報を示す。
【００５４】
（リンク処理）
図１１を参照して、リンク処理部２００における処理について説明する。
【００５５】
（１）ステップＳ２０１
入力処理部２０１は、コンパイル処理部１００から出力されたＯＭＦ４０２を入力する。ここでは、入力処理部２０１は、読み取り可能な全てのＯＭＦ４０２を読み込む。
【００５６】
（２）ステップＳ２０２
配置処理部２０２は、ＯＭＦ４０２に基づいて、関数単位、セグメント単位で配置を行い、配置アドレスを決定する。このとき、配置処理部２０２は、決定された配置アドレスについて、配置情報２０７への更新処理も同時に行う。
【００５７】
（３）ステップＳ２０３
シンボル解決部２０３は、ＯＭＦ４０２に基づいて、シンボル値を更新する。このとき、シンボル解決部２０３は、更新されたシンボル値について、シンボル情報２０８への更新処理も同時に行う。
【００５８】
（４）ステップＳ２０４
コード生成部２０４は、シンボル値を基にリロケーション（再配置）を解決し、オブジェクトコードを完成させる。ここでは、コード生成部２０４は、決定されたシンボル値を使い、当該関数を再配置し、実行形式のオブジェクトコードを生成する。
【００５９】
（５）ステップＳ２０５
コード生成部２０４は、実行形式のオブジェクトコードを修正後のＬＭＦ４０４へ出力する。ここでは、コード生成部２０４は、関数単位、セグメント単位で、実行形式のオブジェクトコードを修正後のＬＭＦ４０４に追加する。コード生成部２０４は、全ての関数について、実行形式のオブジェクトコードを修正後のＬＭＦ４０４へ出力した場合、修正後のＬＭＦ４０４を確定する。その後、出力処理部２０６は、修正後のＬＭＦ４０４を出力する。
【００６０】
（６）ステップＳ２０６
関数情報更新部２０５は、コード生成部２０４が実行形式のオブジェクトコードを修正後のＬＭＦ４０４へ出力する際、更新された配置情報２０７、シンボル情報２０８を参照し、関数情報４０３内の情報も更新する。ここでは、関数情報更新部２０５は、関数情報４０３の配置アドレスと最大サイズを更新する。
【００６１】
図１２に、この時点（リンク処理直後）の関数情報、シンボル情報、デバッグ情報を示す。
【００６２】
なお、本発明においては、上記のように、コンパイル処理部１００が入力処理部１０１で修正後のｃソース２０を入力し、リンク処理部２００が関数情報更新部２０５で最大サイズを更新し出力処理部２０６でＬＭＦ４０４を出力するまでの一連の処理を、第２のオブジェクトコード生成処理と呼ぶ。また、修正後のｃソース２０に対する処理を行うコンパイル処理部１００とリンク処理部２００を組み合わせたものを、第２のオブジェクトコード生成処理手段と呼ぶ。
【００６３】
（デバッグ処理）
図１３を参照して、デバッグ処理部３００における処理について説明する。ここでは、リンク処理部２００から出力されたＬＭＦ４０４を使ったデバッグについて説明する。
【００６４】
（１）ステップＳ３０１
入力処理部３０１は、ＬＭＦ４０４を読み込んで、ＬＭＦ４０４からオブジェクトコード、デバッグ情報３０４、シンボル情報３０５を取得し、オブジェクトコード、デバッグ情報３０４、シンボル情報３０５をテンポラリ領域に格納し、シンボル情報３０５のシンボルインデクスを使用して当該関数のデバッグ情報３０４へのポインタを設定する。テンポラリ領域とは、バッファやキャッシュ等、一時的にデータを保持するための記憶領域である。
【００６５】
（２）ステップＳ３０２
入力処理部３０１は、関数単位のデバッグ情報数の設定とデバッグ情報３０４を読み込む。ここでは、入力処理部３０１は、関数単位でデバッグ情報３０４を読み込む。また、入力処理部３０１は、関数単位でデバッグ情報数を設定する。
【００６６】
（３）ステップＳ３０３
入力処理部３０１は、入出力装置４０５でユーザが指示した実行コマンドを読み込む。実行コマンドの例としては、デバッグにおけるコードのステップ実行等が考えられる。
【００６７】
（４）ステップＳ３０４
コマンド実行部３０２は、関数内の残りデバッグ情報数が０か確認する。ここでは、コマンド実行部３０２は、関数内のデバッグ情報が無くなるまで処理を続ける。
【００６８】
（５）ステップＳ３０５
コマンド実行部３０２は、関数内にデバッグ情報があれば、１行分のデバッグ情報を読み込み、デバッグ情報数を−１する（ｄｅｃｒｅｍｅｎｔ）。すなわち、コマンド実行部３０２は、１行ずつデバッグ情報を読み込み、読み込まれたデバッグ情報の行数の分だけ、関数内の残りデバッグ情報数を減少させる。
【００６９】
（６）ステップＳ３０６
コマンド実行部３０２は、読み込まれた１行分のデバッグ情報がダミー関数への分岐命令か否かを判断する。ここでは、コマンド実行部３０２は、ダミー関数への分岐命令か否かについて、当該読み込まれた１行分のデバッグ情報内の命令分岐フラグの有無で判断する。このとき、コマンド実行部３０２は、ダミー関数への分岐命令ならば、当該読み込まれた１行分のデバッグ情報に対する処理を終了し、次の行のデバッグ情報を読み込む。
【００７０】
（７）ステップＳ３０７
コマンド実行部３０２は、ダミー関数への分岐命令で無いならば、読み込まれたコマンドを実行する。このとき、表示部３０３は、コマンドの実行結果を入出力装置４０５に出力する。その後、コマンド実行部３０２は、再度、関数単位のデバッグ情報数の設定とデバッグ情報３０４を読み込む。
【００７１】
（８）ステップＳ３０８
次に、コマンド実行部３０２は、関数内のデバッグ情報が無くなった場合、関数単位で読み込まれたデバッグ情報に基づくデバッグがダミー関数内のデバッグであるかをチェックする。このとき、コマンド実行部３０２は、ダミー関数外のデバッグである（ダミー関数内のデバッグでない）ならば、当該関数のデバッグを終了する。
【００７２】
（９）ステップＳ３０９
コマンド実行部３０２は、ダミー関数内のデバッグであるならば、無条件ジャンプ命令の戻りアドレスから関数のデバッグ情報へのポインタを決定し、該当する関数のデバッグ情報３０４を読み込む。更に、コマンド実行部３０２は、デバッグ情報数を設定する。
【００７３】
（１０）ステップＳ３１０
コマンド実行部３０２は、戻りアドレスとデバッグ情報内アドレスが一致するまでスキップし、スキップ分をデバッグ情報数から差し引いた後、ユーザが指示した実行コマンドの処理を続行する。
【００７４】
本発明では、ｃソースをコンパイル・リンクする時に関数名、配置アドレス、最大サイズ、ダミー関数有無フラグの情報を格納した関数情報を図４のように作成し、ある関数を修正後に再度コンパイル・リンクする時にその情報を基に関数単位でコードサイズが修正前より大きくなった場合、修正前のサイズを超えたサイズ分をダミー関数として出力することで、ｃソースの変更に着目せず、コードサイズでの差分に着目することで分岐命令出力を最小限に抑えている。
【００７５】
＜第２実施形態＞
以下に、本発明の第２実施形態について説明する。
第１実施形態は、修正後のコードサイズにおいて、修正前のコードサイズ分を元の配置場所に置き、増加分をダミー関数として出力する実施例であるが、関数内の途中に分岐命令を自動で挿入したり、割り込みがかかることを避ける必要がある場合も組み込みプログラム開発では有りうるので、その対策として第２実施形態を記載する。
【００７６】
本実施形態のシステム構成及び基本的フローは第１実施形態と同じであり、修正後のコードサイズが修正前よりも大きい場合は、無条件でダミー関数を生成することにより、関数内の途中において分岐命令を自動で挿入することと、割り込みがかかることを避けることができる。
【００７７】
（第２実施形態におけるコンパイル処理）
図１４に、本発明の第２実施形態におけるコンパイル処理のフローチャートを示す。図１４では、図９に示す第１実施形態のコンパイル処理のフローチャートにおけるステップＳ１０４に相当する処理を変更してある。
【００７８】
（１）ステップＳ４０１
コンパイル処理部１００は、修正後のｃソース２０を読み込み、シンボル登録部１０２、コード情報生成部１０３、デバッグ情報生成部１０４の処理により、関数単位で、オブジェクトコードとデバッグ情報１０８を生成し、生成途中でシンボル情報１０７、デバッグ情報１０８も生成する。ここでは、入力処理部１０１は、修正後のｃソース２０を入力する。シンボル登録部１０２は、修正後のｃソース２０に基づいて、修正後の関数のシンボル情報１０７を生成する。コード情報生成部１０３は、修正後のｃソース２０に基づいて、修正後の関数のオブジェクトコードを生成する。デバッグ情報生成部１０４は、修正後のｃソース２０に基づいて、修正後の関数のデバッグ情報１０８を生成する。この処理は、図９に示すステップＳ１０１と同じである。
【００７９】
（２）ステップＳ４０２
コード・デバッグ情報更新部１０５は、修正前コンパイル時に作成された関数情報４０３を読み込む。ここでは、コード・デバッグ情報更新部１０５は、入力処理部１０１を介して、修正前コンパイル時に作成された関数情報４０３を読み込む。この処理は、図９に示すステップＳ１０２と同じである。
【００８０】
（３）ステップＳ４０３
コード・デバッグ情報更新部１０５は、修正後の関数のオブジェクトコードサイズが関数情報４０３内の修正前の関数の最大サイズより大きいか確認する。ここでは、コード・デバッグ情報更新部１０５は、ステップＳ４０１で生成された修正後の関数のオブジェクトコードサイズと関数情報４０３内の修正前の関数の最大サイズとを比較する。この処理は、図９に示すステップＳ１０３と同じである。
【００８１】
（４）ステップＳ４０４
コード・デバッグ情報更新部１０５は、修正後の関数のオブジェクトコードサイズが関数情報４０３内の修正前の関数の最大サイズより大きければ、無条件で元関数（修正後の関数）を分割してダミー関数を生成し、元関数にダミー関数への分岐命令コードを生成する。また、コード・デバッグ情報更新部１０５は、ダミー関数について、コードとデバッグ情報１０８を生成する。更に、コード・デバッグ情報更新部１０５は、ダミー関数への分岐命令及び戻り処理の際の無条件ジャンプ命令を生成する。ここでは、コード・デバッグ情報更新部１０５は、元関数のコード中にダミー関数への分岐命令コードを追加する。また、コード・デバッグ情報更新部１０５は、ダミー関数への分岐命令が追加された行に関する情報をデバッグ情報１０８に追加する。この処理は、図９に示すステップＳ１０４と相違する。
【００８２】
（５）ステップＳ４０５
コード・デバッグ情報更新部１０５は、修正後の関数のオブジェクトコードを修正後のＯＭＦ４０２へ出力する。ここでは、コード・デバッグ情報更新部１０５は、関数毎に、修正後の関数のオブジェクトコードを、修正後のＯＭＦ４０２へ追加する。修正後のＯＭＦ４０２は、修正前のＯＭＦ４０２に、ダミー関数への分岐命令及び戻り処理の際の無条件ジャンプ命令を追加したものである。コード・デバッグ情報更新部１０５は、全ての関数について、修正後の関数のオブジェクトコードを修正後のＯＭＦ４０２へ出力した場合、修正後のＯＭＦ４０２を確定する。その後、出力処理部１０６は、修正後のＯＭＦ４０２を出力する。この処理は、図９に示すステップＳ１０５と同じである。
【００８３】
図１５に、本発明の第２実施形態におけるソースプログラムの修正後、ダミー関数生成後のサンプル例を示す。
【００８４】
図１６に、本発明の第２実施形態における修正関数のリンク後の関数情報、デバッグ情報、シンボル情報の例を示す。
【００８５】
＜第３実施形態＞
以下に、本発明の第３実施形態について説明する。
【００８６】
本発明の第３実施形態における基本的フローは、第１実施形態、及び第２実施形態と同じである。なお、本実施形態では、修正後の関数をユーザが“＃ｐｒａｇｕｒａ”等のオプションを使い、コマンド行やｃソース中で指定することにより、ダミー関数を生成するかを判別している。
【００８７】
（第３実施形態におけるコンパイル処理）
図１７に、本発明の第３実施形態におけるコンパイル処理のフローチャートを示す。図１７では、図９に示す第１実施形態のコンパイル処理のフローチャートにおけるステップＳ１０３に相当する処理を変更してある。
【００８８】
（１）ステップＳ５０１
コンパイル処理部１００は、修正後のｃソース２０を読み込み、シンボル登録部１０２、コード情報生成部１０３、デバッグ情報生成部１０４の処理により、関数単位で、オブジェクトコードとデバッグ情報１０８を生成し、生成途中でシンボル情報１０７、デバッグ情報１０８も生成する。ここでは、入力処理部１０１は、修正後のｃソース２０を入力する。シンボル登録部１０２は、修正後のｃソース２０に基づいて、修正後の関数のシンボル情報１０７を生成する。コード情報生成部１０３は、修正後のｃソース２０に基づいて、修正後の関数のオブジェクトコードを生成する。デバッグ情報生成部１０４は、修正後のｃソース２０に基づいて、修正後の関数のデバッグ情報１０８を生成する。この処理は、図９に示すステップＳ１０１と同じである。
【００８９】
（２）ステップＳ５０２
コード・デバッグ情報更新部１０５は、修正前コンパイル時に作成された関数情報４０３を読み込む。ここでは、コード・デバッグ情報更新部１０５は、入力処理部１０１を介して、修正前コンパイル時に作成された関数情報４０３を読み込む。この処理は、図９に示すステップＳ１０２と同じである。
【００９０】
（３）ステップＳ５０３
コード・デバッグ情報更新部１０５は、修正後の関数が“＃ｐｒａｇｕｒａ”指定関数（“＃ｐｒａｇｕｒａ”が指定されている関数）であるか確認する。ここでは、コード・デバッグ情報更新部１０５は、修正後の関数をユーザが“＃ｐｒａｇｕｒａ”等のオプションを使い、コマンド行やｃソース中で指定しているか判定する。コード・デバッグ情報更新部１０５は、“＃ｐｒａｇｕｒａ”等のオプションにより、ダミー関数を生成するか否かを判別している。この処理は、図９に示すステップＳ１０３と相違する。このとき、コード・デバッグ情報更新部１０５は、修正後の関数が“＃ｐｒａｇｕｒａ”指定関数でなければ、そのまま修正後の関数のオブジェクトコードを使用する。
【００９１】
（４）ステップＳ５０４
コード・デバッグ情報更新部１０５は、修正後の関数が“＃ｐｒａｇｕｒａ”指定関数であれば、元関数（修正後の関数）を分割してダミー関数の生成を行う。ここでは、コード・デバッグ情報更新部１０５は、ダミー関数への分岐命令及び戻り処理の際の無条件ジャンプ命令を生成する。この処理は、図９に示すステップＳ１０４、又は図１４に示すステップＳ４０４と同じである。
【００９２】
（５）ステップＳ５０５
コード・デバッグ情報更新部１０５は、修正後の関数のオブジェクトコードを修正後のＯＭＦ４０２へ出力する。ここでは、コード・デバッグ情報更新部１０５は、関数毎に、修正後の関数のオブジェクトコードを、修正後のＯＭＦ４０２へ追加する。修正後のＯＭＦ４０２は、修正前のＯＭＦ４０２に、ダミー関数への分岐命令及び戻り処理の際の無条件ジャンプ命令を追加したものである。コード・デバッグ情報更新部１０５は、全ての関数について、修正後の関数のオブジェクトコードを修正後のＯＭＦ４０２へ出力した場合、修正後のＯＭＦ４０２を確定する。その後、出力処理部１０６は、修正後のＯＭＦ４０２を出力する。この処理は、図９に示すステップＳ１０５と同じである。
【００９３】
なお、上記の各実施形態は、組み合わせて実施することも可能である。
【００９４】
以上のように、本発明のオブジェクトコード生成システムでは、修正前のｃソースのコンパイル、リンク時に作成した関数情報を自動で作成／更新する。
【００９５】
また、本発明のオブジェクトコード生成システムでは、修正前関数のコードサイズと修正後のコードサイズを比較し、修正後が大きい場合修正関数のみダミー関数を生成することにより他の修正していない関数の配置アドレスを変更する必要がないため、最小限の分岐命令に抑えることができる。
【００９６】
また、本発明のオブジェクトコード生成システムでは、変更前関数のデバッグ情報でダミー関数を特定させることで、ユーザはデバッグ時に変更前関数からダミー関数へジャンプを意識することなく変更後ｃソースデバッグができる。
【００９７】
更に、本発明のオブジェクトコード生成システムでは、他の修正していない関数の配置アドレスを変更しないので、修正していない関数のデバッグを割愛できる。
【００９８】
本発明のオブジェクトコード生成システムは、関数情報を作成するコンパイラを備える。
【００９９】
このコンパイラは、関数情報を再度読み込み、修正後のサイズと元のサイズを比較し、修正後のサイズが元のサイズより大きい場合、ダミー関数を生成する。
【０１００】
このコンパイラは、ダミー関数を生成しても元関数と分断されることなくデバッグ情報を生成する。
【０１０１】
また、本発明のオブジェクトコード生成システムは、リンク結果を関数情報へ更新するリンカを備える。
【０１０２】
このリンカは、関数情報を基に修正前と同じアドレスに関数を配置する。
【０１０３】
また、本発明のオブジェクトコード生成システムは、ダミー関数と元関数とを分断されることなく出力されたデバッグ情報を基にダミー関数に切り替る時、ダミー関数から戻る時にユーザに意識させることなくデバッグできるデバッガを備える。
【０１０４】
本発明では、修正前のｃソースのコンパイル、リンク時に作成した関数情報を自動で作成及び更新することにより、従来技術のようにフラッシュメモリのブロック情報を別途ユーザが準備する必要がない。上記関数情報において、修正後のｃソースのコンパイル時に保存しておいた関数情報内のコードサイズ情報との差分を基に変更後のコードサイズにおいて変更前関数の増加分をダミー関数として生成し、変更前関数からダミー関数へ分岐命令（ジャンプ命令）を生成する。従来技術では、関数内に複数個の修正箇所がある場合、関数内のオブジェクトコードに修正箇所と同じ数のジャンプ命令を挿入しているが、本発明では１箇所のジャンプ命令の生成で済む。
【０１０５】
また、本発明では、ダミー関数を空き領域に配置するが、変更前関数のデバッグ情報でダミー関数を特定させることで、ユーザはデバッグ時に変更前関数からダミー関数へのジャンプを意識することなく変更後ｃソースのデバッグが可能である。更に、他の修正していない関数の配置アドレスを変更しないので、修正していない関数のデバッグは割愛できる。
【０１０６】
以上、本発明の実施形態を詳述してきたが、実際には、上記の実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の変更があっても本発明に含まれる。
【符号の説明】
【０１０７】
１００…  コンパイル処理部
１０１…  入力処理部
１０２…  シンボル登録部
１０３…  コード情報生成部
１０４…  デバッグ情報生成部
１０５…  コード・デバッグ情報更新部
１０６…  出力処理部
１０７、２０８、３０５…  シンボル情報
１０８、２０９、３０４…  デバッグ情報
２００…  リンク処理部
２０１…  入力処理部
２０２…  配置処理部
２０３…  シンボル解決部
２０４…  コード生成部
２０５…  関数情報更新部
２０６…  出力処理部
２０７…  配置情報
３００…  デバッグ処理部
３０１…  入力処理部
３０２…  コマンド実行部
３０３…  表示部
４０１…  ｃソースファイル
４０２…  ＯＭＦ（オブジェクトモジュールファイル）
４０３…  関数情報
４０４…  ＬＭＦ（ロードモジュールファイル）
４０５…  入出力装置
【図１】
2011028648.tif 000003
【図２】
2011028648.tif 000004
【図３】
2011028648.tif 000005
【図４】
2011028648.tif 000006
【図５】
2011028648.tif 000007
【図６】
2011028648.tif 000008
【図７】
2011028648.tif 000009
【図８】
2011028648.tif 000010
【図９】
2011028648.tif 000011
【図１０】
2011028648.tif 000012
【図１１】
2011028648.tif 000013
【図１２】
2011028648.tif 000014
【図１３】
2011028648.tif 000015
【図１４】
2011028648.tif 000016
【図１５】
2011028648.tif 000017
【図１６】
2011028648.tif 000018
【図１７】
2011028648.tif 000019