(57)【要約】【課題】データがハードウェアによって暗示的に更新されうることを考慮したソースコード解析を可能にする技術を提供する。【解決手段】到達定義計算部は、制御フロー情報に基づき、ソースコードのプログラムによって明示的に更新される明示的変数の到達するソースコード上の位置を示す明示的変数到達定義と、ハードウェアによって暗示的に更新される暗示的変数の到達定義である暗示的変数到達定義と、を生成する。候補値計算部は、制御フロー情報と明示的変数到達定義と暗示的変数到達定義に基づいて、明示的変数または暗示的変数が取りうる候補値を計算する。参照定義集合情報取得部は、制御フロー情報と明示的変数到達定義と暗示的変数到達定義と候補値とに基づいて、ソースコードにおいて、明示的変数を参照する任意の命令と当該命令において参照される当該明示的変数を定義する命令との連鎖を示す参照定義集合情報を生成する。【選択図】図２
2016110257.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードを入力とし、前記ソースコードに対応する制御フローを示す制御フロー情報を生成する制御フローグラフ取得部と、
前記制御フロー情報に基づき、前記ソースコードのプログラムによって明示的に更新される変数である明示的変数の到達する前記ソースコード上の位置を示す到達定義である明示的変数到達定義と、ハードウェアによって暗示的に更新される変数である暗示的変数の到達定義である暗示的変数到達定義と、を生成する到達定義計算部と、
前記制御フロー情報と前記明示的変数到達定義と前記暗示的変数到達定義に基づいて、前記明示的変数または前記暗示的変数が取りうる候補値を計算する候補値計算部と、
前記制御フロー情報と前記明示的変数到達定義と前記暗示的変数到達定義と前記候補値とに基づいて、前記ソースコードにおいて、明示的変数を参照する任意の命令と当該命令において参照される当該明示的変数を定義する命令との連鎖を示す参照定義集合情報を生成する参照定義集合情報取得部と、
を有するソースコード処理装置。
【請求項２】
前記参照定義集合情報取得部は、
前記参照定義集合情報の生成に必要な候補値の計算を前記候補値計算部に要求し、
前記候補値計算部は、前記参照定義集合情報取得部からの要求に応じて前記候補値を計算し、前記参照定義集合情報取得部に提供する、
請求項１に記載のソースコード処理装置。
【請求項３】
前記ソースコードに間接アドレッシングモードの命令がある場合、
前記到達定義計算部は、前記間接アドレッシングモードの命令を除外して前記明示的変数到達定義と前記暗示的変数到達定義とを生成し、
前記参照定義集合情報取得部は、前記間接アドレッシングモードの命令を除外して生成された前記明示的変数到達定義と前記暗示的変数到達定義とに基づき、解決可能な間接アドレッシングモードの命令において参照される明示的変数の参照定義集合情報を生成し、
前記候補値計算部は、他の間接アドレッシングモードの命令の影響を受けない間接アドレッシングモードの命令において参照される明示的変数または暗示的変数の候補値を計算し、
前記制御フローグラフ取得部は、前記計算された候補値を前記制御フロー情報に反映し、
前記制御フロー情報に変化があれば、
前記到達定義計算部は、変化した前記制御フロー情報に基づいて、前記明示的変数到達定義と前記暗示的変数到達定義とを生成しなおし、
前記参照定義集合情報取得部は、解決できていない間接アドレッシングモードの命令において参照される明示的変数の参照定義集合情報を生成する、
請求項１に記載のソースコード処理装置。
【請求項４】
前記候補値計算部は、分岐命令の条件判定において参照される変数が取りうる候補値を計算し、
前記参照定義集合情報取得部は、前記候補値に基づいて前記分岐命令における分岐先を判定し、前記条件判定において変数を参照する命令と当該命令において参照される前記変数を定義する命令との連鎖を示す参照定義集合情報に反映させる、
請求項１に記載のソースコード処理装置。
【請求項５】
前記参照定義集合情報取得部は、前記候補値計算部で計算された前記候補値に基づき、分岐条件を満たさない分岐先の参照定義集合情報を除去する、請求項４に記載のソースコード処理装置。
【請求項６】
前記参照定義集合情報に基づいて、前記ソースコードを、前記ソースコードと形式が異なり前記ソースコードと同じ処理結果が得られるソースコードに変換するコード変換処理部を更に有する、請求項１に記載のソースコード処理装置。
【請求項７】
前記ソースコードの処理を効率化する最適化部をさらに有し、
前記参照定義集合情報取得部は、前記参照定義集合情報に対する所定の最適化処理を行い、前記最適化部に提供する、請求項６に記載のソースコード処理装置。
【請求項８】
前記参照定義集合情報取得部は、前記最適化部が必要とする情報に応じて調整した参照定義集合情報を前記最適化部に提供する、請求項７に記載のソースコード処理装置。
【請求項９】
前記最適化部は、命令が実行される直前における変数の候補値のみを必要とし、
前記参照定義集合情報取得部は、前記参照定義集合として変数の候補値のみを出力する、
請求項８に記載のソースコード処理装置。
【請求項１０】
前記最適化部が参照経路の情報を必要とし、
前記参照定義集合情報取得部は、参照経路の情報を含む参照定義集合情報を出力する、請求項８に記載のソースコード処理装置。
【請求項１１】
前記最適化部は前記明示的変数については参照経路を必要とし、前記暗示的変数については候補値を必要とし、
前記参照定義集合情報取得部は、前記明示的変数の参照経路と、前記暗示的変数の候補値とを出力する、
請求項８に記載のソースコード処理装置。
【請求項１２】
前記到達定義計算部は、１つの命令で更新される明示的変数と暗示的変数の到達定義を分離し、それぞれを明示的変数到達定義と暗示的変数到達定義として別々に生成する、請求項１に記載のソースコード処理装置。
【請求項１３】
ソースコードを入力とし、前記ソースコードに対応する制御フローを示す制御フロー情報を生成し、
前記制御フロー情報に基づき、前記ソースコードのプログラムによって明示的に更新される変数である明示的変数の到達する前記ソースコード上の位置を示す到達定義である明示的変数到達定義と、ハードウェアによって暗示的に更新される変数である暗示的変数の到達定義である暗示的変数到達定義と、を生成し、
前記制御フロー情報と前記明示的変数到達定義と前記暗示的変数到達定義に基づいて、前記明示的変数または前記暗示的変数が取りうる候補値を計算し、
前記制御フロー情報と前記明示的変数到達定義と前記暗示的変数到達定義と前記候補値とに基づいて、前記ソースコードにおいて、明示的変数を参照する任意の命令と当該命令において参照される当該明示的変数を定義する命令との連鎖を示す参照定義集合情報を生成する、
ソースコード処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、あるマイクロコントローラ（以下「マイコン」ともいう）向けに記述されたソフトウェアのソースコードを、アーキテクチャが異なる他のマイコンで実行可能な形式に変換するソースコード変換技術に関する。
【背景技術】
【０００２】
あるマイコンで動作するソースコードを他のマイコンで実行可能な形式へ変換するソースコード変換技術がある。例えば既存のマイコンで動作するソフトウェアと同じ機能を最新のマイコンでも使いたいという要求があり、それを実現する上で、このソースコード変換技術は重要である。
【０００３】
しかし、既存のマイコンからアーキテクチャが異なる他のマイコンへソフトウェアを移植する作業は容易ではない。例えば、ソフトウェアのマイコン間の変換では、マイコンの内部処理、メモリマップ、周辺回路の互換、およびエンディアンなどのデータフォーマットの変換を含めて、ソースコードの様々な部分を変換する必要ある。
【０００４】
まず既存マイコンのソースコードを解析し、そこから変換に必要な情報を抽出する。例えば、エンディアンを変換する必要がある場合、利用する可能性があるデータの箇所をワードサイズにより同定し、当該箇所のデータのエンディアンを変換する。
【０００５】
このように、ソフトウェアの変換においては、ソースコードの解析処理が重要であり、とりわけソースコードの処理に基づくデータの流れ（データフロー）の解析が重要である。これに関する技術として特許文献１に開示された技術がある。特許文献１には、Ｃ言語などの高級言語で記述されたソースコードをコンパイルするにあたり、冗長な命令の削除などの最適化処理において、命令間のデータフローを解析し、変数の連鎖情報（参照と定義の連鎖情報）を導出する技術が開示されている。特許文献１の技術を用いれば、変数を参照するにあたり、参照される変数の値を定義した命令を把握することができる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００２−３４２０８９号公報
【非特許文献】
【０００７】
【非特許文献１】「コンパイラの構成と最適化  第二版」、中田育男著、朝倉書店、２００９年１１月
【発明の概要】
【発明が解決しようとする課題】
【０００８】
一方、ソフトウェアの多くはマイコンのハードウェア動作を意識したプログラミングがされている。そのため、あるマイコン向けのソースコードを他のマイコン向けに変換するとき、マイコン間でハードウェア動作の違いを意識して参照定義集合情報を取得する必要がある。
【０００９】
ハードウェア動作を意識したプログラミングの例として、例えば、命令を実行する毎に暗示的に更新されるＣＰＵ内部フラグの値を意図的に利用するようなプログラムを作成する場合もある。このＣＰＵ内部フラグは、マイコンによっては、ステータスレジスタ、コンディションコードレジスタなどと呼ばれる。
【００１０】
周辺回路の仕様によっては、プログラムが周辺回路の機能を呼び出した後でメモリの所定番地の値を暗示的に変更する場合がある。そのようなメモリ番地には、周辺回路が実行した処理結果のデータや制御情報を記録するためのレジスタが割り当てられていることが多い。そして、これら暗示的に更新される値は、それ以降のプログラムの処理に影響を与える場合がある。例えば、分岐処理の判断に、これらの暗示的に更新される値を利用する場合がある。
【００１１】
特許文献１の技術によれば変数の参照定義集合情報を取得することは可能であるが、ＣＰＵ内部フラグあるいは周辺回路が利用する専用レジスタなど、暗示的に更新されるデータを含めて参照定義集合情報を取得することはできない。
【００１２】
本発明の目的は、データがハードウェアによって暗示的に更新されうることを考慮したソースコード解析を可能にする技術を提供することである。
【課題を解決するための手段】
【００１３】
本発明の一態様によるソースコード処理装置は、ソースコードを入力とし、前記ソースコードに対応する制御フローを示す制御フロー情報を生成する制御フローグラフ取得部と、前記制御フロー情報に基づき、前記ソースコードのプログラムによって明示的に更新される変数である明示的変数の到達する前記ソースコード上の位置を示す到達定義である明示的変数到達定義と、ハードウェアによって暗示的に更新される変数である暗示的変数の到達定義である暗示的変数到達定義と、を生成する到達定義計算部と、前記制御フロー情報と前記明示的変数到達定義と前記暗示的変数到達定義に基づいて、前記明示的変数または前記暗示的変数が取りうる候補値を計算する候補値計算部と、前記制御フロー情報と前記明示的変数到達定義と前記暗示的変数到達定義と前記候補値とに基づいて、前記ソースコードにおいて、明示的変数を参照する任意の命令と当該命令において参照される当該明示的変数を定義する命令との連鎖を示す参照定義集合情報を生成する参照定義集合情報取得部と、を有している。
【発明の効果】
【００１４】
本発明によれば、ハードウェアによるデータの暗示的な更新を含めたソースコードの解析を行うので、ＣＰＵ内部フラグあるいは周辺回路が利用する専用レジスタなど、ハードウェアの動作を考慮した処理を含めてソースコードの解析が可能である。
【図面の簡単な説明】
【００１５】
【図１】本実施形態によるソースコード変換装置のブロック図である。
【図２】コード解析処理部１００のブロック図である。
【図３】制御フローグラフオブジェクトＯＢ１０２に含まれる情報を説明するための図である。
【図４】コード解析処理部１００へ入力される解析対象プログラムのソースコードの一例を示す図である。
【図５】ソースコードと、それに対応する参照定義集合の一例を示す図である。
【図６】コード解析処理部１００が参照定義集合情報を生成する処理を示すフローチャートである。
【図７】制御フローグラフ取得部ＢＬ１０１が制御フローグラフオブジェクトの生成に用いるライブラリの一例を示す図である。
【図８】複雑な参照定義集合の一例を示す図である。
【図９】候補値を一意に決定できない変数を処理に用いるプログラムのソースコードの一例を示す図である。
【図１０】明示的変数の候補値を計算する処理を示すフローチャートである。
【図１１】暗示的変数の候補値を計算する処理を示すフローチャートである。
【図１２】分岐命令の条件判定に用いる参照定義集合を最適化する例を示す図である。
【図１３】間接アドレッシングモードの命令を含むプログラムの参照定義集合を取得する処理を示すフローチャートである。
【発明を実施するための形態】
【００１６】
本発明の実施形態によるソースコード変換装置について図面を参照して説明する。なお、ここではソースコード変換装置が処理する以下に示す処理を実現する方法をソースコード変換方法という。
【００１７】
図１は、本実施形態によるソースコード変換装置のブロック図である。
【００１８】
ソースコード変換装置１０は、あるマイコン向きに記述されたプログラムのソースコードを、他のマイコンで実行可能な形式であり同じ処理結果が得られるソースコードに変換する装置である。そのプログラムによって明示的に更新される変数（以下「明示的変数」という）だけでなく、ＣＰＵ内部フラグ、周辺回路が利用する専用レジスタ、マイコン内部機能の制御レジスタなどのようなハードウェアによって暗示的に更新される変数（以下「暗示的変数」という）を含めてソースコードを解析し、変換することができる。
【００１９】
図１を参照すると、ソースコード変換装置１０は、コード解析処理部１００とコード変換処理部２００と最適化器３００を有している。
【００２０】
コード解析処理部１００は、明示的変数を参照する任意の命令とその命令において参照されるその明示的変数を定義する命令との連鎖（以下「参照定義集合」という）を示す情報である参照定義集合情報を生成する。参照定義集合情報の詳細およびその生成方法については後述する。
【００２１】
最適化器３００は、ソースコードの処理を効率化し、実行時間およびメモリ使用量を最小化する処理を実行する。本実施形態の最適化器３００は、コード解析処理部１００で生成される参照定義集合情報ＯＢ１０５をその最適化の処理に利用する。
【００２２】
コード変換処理部２００は、コード解析処理部１００が生成した参照定義集合情報に基づいて、ソースコード変換装置１０の入力であるソースコードを、そのソースコードと形式が異なりながらそのソースコードと同じ処理結果が得られるソースコードに変換する。
【００２３】
図２は、コード解析処理部１００のブロック図である。
【００２４】
コード解析処理部１００は、制御フローグラフ取得部ＢＬ１０１、到達定義計算部ＢＬ１０２、参照定義集合情報取得部ＢＬ１０３、および候補値計算部ＢＬ１０４を有している。
【００２５】
制御フローグラフ取得部ＢＬ１０は、解析対象であるソースコードＯＢ１０１を入力とし、ソースコードＯＢ１０１に対応する制御フローを示す情報である制御フローグラフオブジェクトＯＢ１０２を生成する。制御フローグラフオブジェクトＯＢ１０２の詳細は後述する。
【００２６】
到達定義計算部ＢＬ１０２は、制御フローグラフオブジェクトＯＢ１０２に基づき、ソースコードＯＢ１０１のコードあるいはニーモニックによって明示的に更新される明示的変数の到達定義である明示的変数到達定義ＯＢ１０３と、ＣＰＵ内部フラグなどハードウェアによって暗示的に更新される暗示的変数の到達定義である暗示的変数到達定義ＯＢ１０４とを生成する。到達定義は、ある命令によって定義された変数が有効であるプログラム位置である。
【００２７】
候補値計算部ＢＬ１０４は、制御フローグラフオブジェクトＯＢ１０２と明示的変数到達定義ＯＢ１０３と暗示的変数到達定義ＯＢ１０４に基づいて、明示的変数または暗示的変数が取りうる候補値を計算する。取りうる候補値は単数の場合もあり、複数の場合もある。
【００２８】
参照定義集合情報取得部ＢＬ１０３は、制御フローグラフオブジェクトＯＢ１０２と明示的変数到達定義ＯＢ１０３と暗示的変数到達定義ＯＢ１０４と、必要があれば更に候補値計算部ＢＬ１０４が計算した候補値とに基づいて、ソースコードＯＢ１０において、明示的変数を参照する任意の命令とその命令において参照される明示的変数を定義する命令との連鎖を示す参照定義集合情報ＯＢ１０５を生成する。
【００２９】
一動作例として、参照定義集合情報取得部ＢＬ１０３は、候補値の計算を候補値計算部ＢＬ１０４に候補値取得要求を送り、候補値計算部ＢＬ１０４は、参照定義集合情報取得部ＢＬ１０３からの候補値取得要求に応じて候補値を計算し、参照定義集合情報取得部ＢＬ１０３に提供する。
【００３０】
以上のように、本実施形態によれば、ハードウェアによるデータの暗示的な更新を含めたソースコードＯＢ１０１の解析を行うので、ＣＰＵ内部フラグあるいは周辺回路が利用する専用レジスタなど、ハードウェアの動作を考慮した処理を含めてソースコードの解析が可能である。
【００３１】
なお、制御フローグラフ取得部ＢＬ１０１は、入力されたソースコードＯＢ１０１の構文を解析することにより、プログラムを実行したときに通過する可能性がある全経路を取得し、全経路の制御フローについて制御フローグラフオブジェクトＯＢ１０２を生成して出力する。
【００３２】
図３は、制御フローグラフオブジェクトＯＢ１０２に含まれる情報を説明するための図である。
【００３３】
制御フローグラフオブジェクトＯＢ１０２は、プログラムの制御フローをグラフで表した制御フローグラフの情報である。制御フローグラフは基本ブロックと制御構造情報とを含む。
【００３４】
基本ブロックは、１つ以上の命令情報で構成され、内部に分岐または合流が存在しない処理単位である。基本ブロックはそれぞれを識別するためのブロック識別情報を有する。各基本ブロックは、その基本ブロックを構成する各命令を識別するための命令識別情報と、当該命令の種類に関する情報（命令種類情報）と、当該命令を実行することによって定義される変数（定義変数情報）および参照される変数の情報（参照変数情報）とを有する。また、基本ブロックは、当該基本ブロックに先行する基本ブロックである先行ブロックのブロック識別情報を有する。また、基本ブロックは、当該基本ブロックに後続する基本ブロックである後続ブロックのブロック識別情報を有する。
【００３５】
制御構造情報は、基本ブロック同士を接続する、分岐あるいは合流などの制御構造を表わす情報である。
【００３６】
例えば、”MOV R0,R1”という命令は、レジスタＲ１の値をレジスタＲ０の値へコピーする命令である。基本ブロックに、この”MOV R0,R1”という命令があれば、当該命令を実行することで、レジスタＲ１の値が定義され、レジスタＲ０の値が参照される。そのため、当該基本ブロックは、定義変数情報としてR1を有し、参照変数情報としてR0を有する。
【００３７】
また、レジスタＲ１．Ｒ０のようなレジスタの他、当該命令の実行結果に応じて、ＣＰＵ内部フラグの値も更新される場合もある。例えば，当該命令によってコピーされた値が負数（最上位ビットが１）である場合、（演算結果が負数であることを表すネガティブフラグの値が１となる。また、コピーされた値が零である場合、演算結果が零であることを表すゼロフラグの値が１に更新される。
【００３８】
このように、更新される可能性があるＣＰＵ内部フラグが存在する場合、そのＣＰＵ内部フラグも定義変数情報として基本ブロックに保持される。例を挙げると、ある命令によってネガティブフラグ（Ｆｌａｇ．Ｎ）とゼロフラグ（Ｆｌａｇ．Ｚ）が更新される可能性がある場合、基本ブロックにネガティブフラグとゼロフラグを参照変数情報として”Flag.N”と”Flag.Z”といった形式で保持する。
【００３９】
なお、ここではMOV命令というフラグを更新する命令を示したが、分岐命令など当該フラグを参照する命令であれば、前述した定義変数情報と同様の形式で参照変数情報が基本ブロックに保持される。
【００４０】
本実施形態における制御フローグラフは非特許文献１にも詳細な記載がある。
【００４１】
上述したように、到達定義計算部ＢＬ１０２は、制御フローグラフオブジェクトＯＢ１０２に基づいて到達定義を計算する。
【００４２】
図４は、コード解析処理部１００へ入力される解析対象プログラムのソースコードの一例を示す図である。例えば、図４に示すように、あるプログラムがあり、そのプログラムのニーモニックの各命令に対して100から109という命令識別情報が割り当てられているとする。このプログラムにおいて、変数R0の値を定義する命令は、命令識別情報100、101、102、105、106、107が割り当てられた命令である。これら各命令における変数の定義に対する到達定義を以下に示す。
【００４３】
100（R0） = {101、 102、 103、 104、 105、 108、 109}
101（R1） = {102}
102（R1） = {103、 104、 105、 106、 108、 109}
105（R0） = {106、 107、 108、 109}
106（R1） = {107}
107（R1） = {108、 109}
【００４４】
各命令の到達定義の中括弧内に示された命令識別番号は、当該命令識別番号の命令を実行する直前において、左辺の命令識別番号で示された命令の実行結果が有効であることを意味する。また、左辺の小括弧内に示された変数は、当該命令によって更新される変数を表す。
【００４５】
なお、以上は、簡単のため、命令単位で到達定義を整理した例について説明したが、それに限定されることはない。他の例として、到達定義を基本ブロック単位で整理し、左辺の命令識別番号によって示された命令で定義された変数が有効であるプログラム位置を基本ブロックの単位で示すことも可能である。その場合、上記等式右辺の中括弧内には、左辺の命令で定義された変数が有効であるプログラム位置である基本ブロックを示す基本ブロック識別情報が記載される。
【００４６】
到達定義を基本ブロックで整理する場合、基本データフロー内のデータフローの解析が必要となるが、基本ブロック内には１つ以上の命令が存在するが、基本ブロック内には分岐および合流が存在しないため、基本ブロック内におけるデータフローの解析は容易である。
【００４７】
なお、非特許文献１には、到達定義の具体的な計算方法が詳しく述べられている。
【００４８】
上述のように到達定義計算部ＢＬ１０２は、明示的変数到達定義ＯＢ１０３および暗示的変数到達定義ＯＢ１０４を生成し、出力する。
【００４９】
例えば、図４に示したプログラムにおいて、識別番号100の命令は、レジスタR0を更新するだけでなく、更新内容に応じて、暗示的にＣＰＵ内部フラグを更新する場合もある。その場合、更新されるＣＰＵ内部フラグは命令に対応して定まる場合が多い。つまり、同じ命令によって更新されるフラグが同じである場合が多い。また、明示的変数の到達定義が上記100（R0） = {101、 102、 103、 104、 105、 108、 109}といったものであるのに対し、ＣＰＵ内部フラグの到達定義は100（Flag.X） = {101}のように明示的変数とは異なったものとなる。
【００５０】
到達定義計算部ＢＬ１０２は、１つの命令で更新される明示的変数と暗示的変数の到達定義を分離し、それぞれを明示的変数到達定義ＯＢ１０３と暗示的変数到達定義ＯＢ１０４として別々に生成しておくと、到達定義を元に参照定義集合情報を取得する際の処理効率がよくなる。
【００５１】
これは、一般に、プログラム全体で、暗示的変数が参照される頻度が、明示的変数が参照される頻度と比較して平均的に少ないため、明示的変数の到達定義と暗示的変数の到達定義のデータベースを分離すれば、データ検索処理の効率が高まるからである。
【００５２】
上述のように、参照定義集合情報取得部ＢＬ１０３は、明示的変数到達定義ＯＢ１０３、暗示的変数到達定義ＯＢ１０４および制御フローグラフオブジェクトＯＢ１０２に基づき、参照定義集合情報ＯＢ１０５を取得する。参照定義集合は、ある命令と、その命令によって参照される変数の値を決定するのに関与する他の命令との変数による連鎖を表している。
【００５３】
図５は、ソースコード（図中右）と、それに対応する参照定義集合（図中左側）の一例を示す図である。
【００５４】
例えば、識別番号102の命令は、定義されるレジスタＲ１の演算結果を決定するにあたり、先行する命令である識別番号100および101の命令を参照する必要がある。その連鎖を表わす参照定義集合は図５の左上段に示された形式で表される。
【００５５】
識別番号108の命令は、分岐命令のジャンプ先によって二通りの候補が得られる。その場合の参照定義集合は、図５の左中段および左下段に示された形式で表される。
【００５６】
参照定義集合情報ＯＢ１０５は、１つ以上の参照定義集合から構成され、解析対象となっている命令毎のその命令で参照される変数の定義への連鎖を示す情報を有する。
【００５７】
候補値計算部ＢＬ１０４は、参照定義集合情報取得部ＢＬ１０３からの要求に応じて、参照定義集合情報ＯＢ１０５を元に特定命令の識別情報において定義される変数の候補値を計算し、計算結果である候補値を参照定義集合情報取得部ＢＬ１０３へ返す。参照定義集合情報取得部ＢＬ１０３は、候補値計算部ＢＬ１０４から得られた候補値を元に、参照定義集合情報ＯＢ１０５の最適化処理を行い、最適化された参照定義集合情報ＯＢ１０５を生成する。参照定義集合情報取得部ＢＬ１０５による最適化処理は、最適化器３００の最適化とは別のものである。最適化器３００は、ソースコードの効率化を行うが、参照定義集合情報取得部ＢＬ１０５による最適化処理は参照定義集合情報ＯＢ１０５に対する処理であｒ。参照定義集合情報取得部ＢＬ１０５は、例えば、参照定義集合情報ＯＢ１０５から不要な参照経路の参照定義集合を除去したり、参照定義集合から不要な部分を除去したり、重複した情報を共通化したりする処理である。
【００５８】
図６は、コード解析処理部１００が参照定義集合情報を生成する処理を示すフローチャートである。図６を参照しながらコード解析処理部１００の全体動作（参照定義集合取得処理）について説明する。
【００５９】
まず、コード解析処理部１００は、制御フローグラフ取得部ＢＬ１０１において、ソースコードＯＢ１０１を入力として制御フローグラフオブジェクトＯＢ１０２を生成する（ステップＳ５０００）。
【００６０】
制御フローグラフ取得部ＢＬ１０１は、命令またはソースコード毎にその命令またはソースコードによって定義される変数、あるいはその命令またはソースコードによって参照される変数に関する情報を保持するライブラリを有する。このライブラリは、制御フローグラフ取得部ＢＬ１０１が制御フローグラフオブジェクトＯＢ１０２を生成するのに利用される。
【００６１】
図７は、制御フローグラフ取得部ＢＬ１０１が制御フローグラフオブジェクトの生成に用いるライブラリの一例を示す図である。図７のライブラリには、命令と、その命令で定義される変数およびその命令で参照される変数との対応づけ情報が記録されている。
【００６２】
制御フローグラフ取得部ＢＬ１０１は、ソースコードＯＢ１０１の構文を解析し、解析結果と図７に記載されているライブラリＯＢ６００とのパターンマッチング処理を実行する。
【００６３】
ソースコードＯＢ１０１を解析した結果として得られた命令が、ライブラリＯＢ６００に含まれているいずれかの命令フォーマットのパターンに合致すると、制御フローグラフオブジェクトＯＢ１０２の空オブジェクトに対し、その命令の定義変数情報および／または参照変数情報を格納する。
【００６４】
また、制御フローグラフ取得部ＢＬ１０１は、プログラムの制御構造の解析を行う。その際、制御フローグラフ取得部ＢＬ１０１は、ライブラリＯＢ６００とソースコードＯＢ１０１の構文解析結果とのパターンマッチングを行い、ソースコードＯＢ１０１から分岐先および／または合流点を抽出する。また、抽出した分岐先および合流点を基に基本ブロックと基本ブロック間の制御構造を判断する。
【００６５】
これにより得られた制御構造の情報は、命令の場合と同様、制御フローグラフ取得部ＢＬ１０１により、空の制御フローグラフオブジェクトＯＢ１０２に対して格納される。
【００６６】
以上の一連の処理により、ソースコードＯＢ１０１に関する情報を有する制御フローグラフオブジェクトＯＢ１０２が制御フローグラフ取得部ＢＬ１０１によって生成される。
【００６７】
以上の一例の処理により制御フローグラフオブジェクトＯＢ１０２が生成された後、到達定義計算部ＢＬ１０２が、明示的に更新または参照される明示的変数と、暗示的に更新または参照される暗示的変数とのそれぞれ毎に到達定義を計算する（ステップＳ５０１０）。
【００６８】
この際、到達定義計算部ＢＬ１０２は、制御フローグラフオブジェクトＯＢ１０２の情報を基に明示的変数および暗示的変数の判定を行う。制御フローグラフオブジェクトＯＢ１０２は明示的変数到達定義ＯＢ１０３および暗示的変数到達定義ＯＢ１０４の計算に必要な全ての情報を有しているので、到達定義計算部ＢＬ１０２は制御フローグラフオブジェクトＯＢ１０２以外の情報を参照する必要が無い。
【００６９】
明示的変数到達定義ＯＢ１０３および暗示的変数到達定義ＯＢ１０４を計算した後、参照定義集合情報取得部ＢＬ１０３は、参照定義集合情報を取得するための解析の対象である命令（解析対象命令）を決定し（ステップＳ５０２０）、各到達定義ｐと制御フローグラフオブジェクトＯＢ１０２を基に、解析対象命令における参照定義集合情報を取得する（ステップＳ５０３０）。
【００７０】
解析対象の命令を決定するに当たっては、コマンドラインなどのインタフェース経由で、ユーザが直接命令を指定する場合と、ツールによって自動的に命令が指定される場合がある。ツール等によって全ての命令に対して解析対象命令が指定される場合であっても、参照定義集合情報を取得する処理は同様である。
【００７１】
なお、解析対象命令における参照定義集合情報を取得する過程において、他の変数の候補値を決定する必要がある場合がある。例えば、命令の参照定義集合を導出する過程において、フラグなどの暗示的変数が参照される場合がある。その場合、図８に例示するように、参照定義集合が複雑になる場合がある。
【００７２】
図８は、複雑な参照定義集合の一例を示す図である。
【００７３】
図８の例では、破線矢印で示されているように、識別情報がｘｙｙである命令が、暗示的変数であるＦｌａｇ．Ｃを参照する場合、参照定義集合情報取得部ＢＬ１０３は、暗示的変数到達定義ＯＢ１０４から、命令ｘｙｙにおける暗示的変数の参照定義集合を取得する必要がある。
【００７４】
暗示的変数の参照定義集合は、明示的変数における処理結果に依存するため、参照定義集合情報取得部ＢＬ１０３は、命令ｘｙｙの暗示的変数における参照定義集合の末端にある明示的変数（ｘｙａ、ｘｙｂ）の参照グラフも取得する必要がある。
【００７５】
図８に示した命令ｘｘｘのように、参照定義集合を取得する処理に暗示的変数の参照定義集合が関係する場合、参照定義集合が非常に複雑となってしまう。
【００７６】
一方、ある命令における候補値を見積もることが可能である場合、参照定義集合は簡素化することができる。
【００７７】
例えば、図８において命令ｘｙｙにおけるＦｌａｇ．Ｃの値が常に１であることが分かる場合には、命令ｘｙｙにおける暗示的変数の参照定義集合を出力する必要はない。その場合、参照定義集合情報取得部ＢＬ１０３または不図示の最適化器は最適化処理を実行する際に暗示的変数を意識することなく参照定義集合を利用することが可能となる。なお、ある変数における候補値が必要となるその他のケースについては後述する。
【００７８】
以上のようにして、参照定義集合情報取得部ＢＬ１０３は、参照定義集合情報ＯＢ１０６内の命令が参照する変数の候補値を取得することが必要か否か判定し（ステップＳ５０４０）、必要な場合には当該変数を定義する命令の明示的変数または暗示的変数における参照定義集合を取得する（ステップＳ５０５０）。
【００７９】
また、変数の候補値は必ずしも決定できるわけではない。図９は、候補値を一意に決定できない変数を処理に用いるプログラムのソースコードの一例を示す図である。図９に示すようなプログラムについては、命令２０３におけるレジスタＲ１の候補値はメモリＭＥＭ１の値だけでなく、プログラムのループ回数にも依存する。
【００８０】
メモリＭＥＭ１の値を見積もることが可能であれば、変数の候補値を取得することが可能となる場合もあるが、例えばＭＥＭ１がＡＤ変換回路から得られた情報を格納するレジスタである場合のように値を見積もれない場合、候補値を計算することは困難である。このように候補値を計算できない場合はエラーとして処理を終了する（ステップＳ５０６０）。
【００８１】
一方、変数の候補値が計算することが可能である場合は、当該命令における変数の候補値を計算する（ステップＳ５０７０）。
【００８２】
また、ある変数の候補値を計算する過程において、他の変数の候補値を計算する必要がある場合もある。その場合はステップＳ５０５０〜Ｓ５０７０の処理と同様に、対象の命令における候補値を計算することが可能か否か判定し、計算が可能である場合は、その命令における変数の候補値を計算する（ステップＳ５０８０）。
【００８３】
なお、上述したステップＳ５０４０〜Ｓ５０７０の処理をアルゴリズムとして実装する際は、ステップＳ５０５０〜Ｓ５０７０の処理を関数とした再帰呼び出しとすることで実装可能である。
【００８４】
ステップＳ５０４０〜Ｓ５０８０の処理によって変数の候補値を決定できた場合、それら候補値を参照定義集合情報ＯＢ１０６を取得するプロセスへ反映し、解析対象命令における参照定義集合情報ＯＢ１０６を最適化する（ステップＳ５０９０）。
【００８５】
参照定義集合情報取得部ＢＬ１０３は、以上の一例の処理を、解析対象命令における参照定義集合を取得する上で候補値が必要となる全ての変数に対して繰り返し実行し、最適化された参照定義集合情報ＯＢ１０５を生成する（ステップＳ５１００）。
【００８６】
この生成された最適化された参照定義集合情報ＯＢ１０５は、ソースコードＯＢ１０１を変換する上で必要な最適化処理に利用される。
【００８７】
＜候補値計算処理＞
【００８８】
以下、候補値計算部ＢＬ１０４が参照定義集合から変数の候補値を計算する処理について説明する。
【００８９】
候補値の計算において候補値計算部ＢＬ１０４は参照定義集合を入力とする。処理の過程で制御フローグラフオブジェクトＯＢ１０２に含まれている命令情報に基づき、命令の処理内容を模擬する命令パーサが存在するものとする。
【００９０】
この命令パーサは、例えば、”MOV %8、 R0”という命令情報があれば、Ｒ０＝８を計算し、”ADD %1、 R1”という命令情報あれば、Ｒ１（命令実行後）＝Ｒ１（命令実行前）＋１を計算する。
【００９１】
併せて、命令パーサは、ＣＰＵ内部フラグなど暗示的に更新される変数があれば、その変数を更新する処理を実行する。例えば、”MOV %8、 R0”の命令の場合、Ｒ０へコピーされる値は非ゼロ正数であるため、命令パーサは、Ｆｌａｇ．Ｚ＝０、Ｆｌａｇ．Ｎ＝０とし、それを処理結果として出力する。
【００９２】
図１０は、明示的変数の候補値を計算する処理を示すフローチャートである。この明示的変数候補値計算処理は図６のステップＳ５０７０に含まれる詳細処理である。明示的変数の候補値を計算するのに参照定義集合情報ＯＢ１０５が用いられる。
【００９３】
最初に、候補値計算部ＢＬ１０４は入力された参照定義集合に対し、根ノードの命令情報を取得する（ステップＳ９０００）。根ノードは参照定義集合の最上流のノードであり、図５の左上段の例では命令１０２が根ノードである。
【００９４】
次に、候補値計算部ＢＬ１０４は、根ノードの命令を実行したときに参照される変数を定義する次の命令が存在するか否か確認する（ステップＳ９０１０）。次の命令が存在しない場合、候補値計算部ＢＬ１０４は根ノードの命令情報のみで、その命令が定義する変数の値を計算することが可能である。その場合、候補値計算部ＢＬ１０４は命令パーサによって変数の値を計算する（ステップＳ９０９０）。
【００９５】
一方、次の命令が存在する場合、候補値計算部ＢＬ１０４は、その命令がＣＰＵ内部フラグなどの暗示的変数を定義する命令であるか否か確認する（ステップＳ９０２０）。
【００９６】
命令が暗示的変数を定義する命令である場合、候補値計算部ＢＬ１０４は、暗示的変数到達定義ＯＢ１０４から当該暗示的変数に関する参照定義集合を取得し、当該暗示的変数の候補値を計算する（ステップＳ９０６０）。ステップＳ９０６０の具体的な処理内容は後述する。
【００９７】
ステップＳ９０２０において命令が暗示的変数を定義する命令でない場合、候補値計算部ＢＬ１０４は、他の命令によって定義された明示的変数を参照するか否か判定する（ステップＳ９０３０）。参照する命令が存在する場合、候補値計算部ＢＬ１０４は、当該次に参照する命令を取得する（ステップＳ９０４０）。明示的変数または暗示的変数を参照する命令が存在しない場合、候補値計算部ＢＬ１０４は命令パーサにより変数の値を計算する（ステップＳ９０９０）。
【００９８】
ステップＳ９０４０またはステップＳ９０６０の後、候補値計算部ＢＬ１０４は、その命令が他の明示的変数または暗示的変数を参照する場合、ステップＳ９０１０から処理を再帰的に実行し、明示的変数または暗示的変数を参照しなくなるまでステップＳ９０１０からＳ９０４０の処理を繰り返す（ステップＳ９０５０）。
【００９９】
以上の処理により、明示的変数および暗示的変数を参照しない命令（参照定義集合における末端ノードに対応する命令）の実行結果が分かる。
【０１００】
続いて、候補値計算部ＢＬ１０４は、各末端ノードの命令における計算結果に基づき、参照元の命令における処理結果を命令パーサにより計算する（ステップＳ９０７０）。この計算は、参照定義集合の根ノードの命令について計算が終わるまで繰り返される（ステップＳ９０８０）。
【０１０１】
以上の処理により、候補値計算部ＢＬ１０４は入力された参照定義集合に対し、当該参照定義集合の根ノードにあたる命令を実行した結果（候補値）を得ることができる（ステップＳ９１００）。
【０１０２】
次にステップＳ９０６０に示した暗示的変数の候補値計算処理について説明する。図１１は、暗示的変数の候補値を計算する処理を示すフローチャートである。この暗示的変数候補値計算処理は図１０のステップＳ９０６０に含まれる詳細処理である。
【０１０３】
最初に、候補値計算部ＢＬ１０４は、入力された暗示的変数を参照する命令を根ノードとし、当該命令の参照定義集合を暗示的変数到達定義ＯＢ１０４から取得する（ステップＳ１００１０）。ここで取得した参照定義集合は、ＣＰＵ内部フラグなど暗示的に更新される変数の値を定義する命令のみから構成される。また、このときに得られる参照定義集合は複数である場合がある。複数となるか単数となるかは、解析対象となっているプログラムの制御構造に依存する。
【０１０４】
次に、候補値計算部ＢＬ１０４は、前述の参照定義集合の根ノードに対応する命令情報を取得し（ステップＳ１００２０）、明示的変数の場合と同様、根ノードの命令を実行したときに参照される変数を定義する次の命令が存在するか否か確認する（ステップＳ１００３０）。次の命令が存在する場合、候補値計算部ＢＬ１０４は再帰的に命令を参照し、ステップＳ１００１０で得た参照定義集合の末端ノードを参照するまで処理を繰り返す（ステップＳ１００４０）。
【０１０５】
暗示的変数の候補値を決定するには、暗示的変数を定義する命令の明示的変数の候補値を計算する必要がある。そのため、候補値計算部ＢＬ１０４は、明示的変数到達定義ＯＢ１０３から当該命令における明示的変数の参照定義集合を求め（ステップＳ１００５０）、図１０に示した明示的変数候補値計算処理を実行する（ステップＳ１００６０）。
【０１０６】
この際、解析対象であるプログラムの制御構造によっては、複数の参照定義集合が得られ、候補値を計算すべき明示的変数が複数となる場合がある。
【０１０７】
次に、候補値計算部ＢＬ１０４は、ステップＳ１００６０で得られた明示的変数の候補値を元に、当該命令によって更新される暗示的変数の候補値を、前述の命令パーサを利用して計算する（ステップＳ１００７０）。この際、明示的変数の候補値が複数であり、かつその中に重複が存在する場合、重複する候補値を１つにまとめることもできる。
【０１０８】
候補値計算部ＢＬ１０４はステップＳ１００５０〜Ｓ１００７０の処理を暗示的変数の参照定義集合の根ノードまで実行し（ステップＳ１００８０）、得られた入力された命令における暗示的変数の候補値を得る（ステップＳ１００９０）。
【０１０９】
以上、図１１に示した処理により暗示的変数の１つ以上の候補値が計算される。暗示的変数の候補値が複数である場合、呼び出し元の明示的変数における計算結果も複数となる。そのため、暗示的変数の候補値のそれぞれ毎に計算を行い、明示的変数についても複数の候補値を得る。また、その際、複数の候補値に重複するものがあれば、それらを１つにまとめて出力してもよい。
【０１１０】
＜候補値が必要となるケースの他の例＞
【０１１１】
変数の候補値が必要となる処理の例として、参照定義集合情報ＯＢ１０５を取得する際に参照定義集合を簡素化する処理は既に例示したが、変数の候補値が必要となる処理は他にも存在する。以下、その具体例について説明する。
【０１１２】
（例１：分岐先の判定）
【０１１３】
多くのマイコンでは、ＣＰＵ内部フラグの値を参照することで分岐先が判定される。言い換えれば、分岐命令を実行する直前のＣＰＵ内部フラグの候補値を見積もることができれば、分岐先を一意に決めることができるケースもあると言える。その場合、参照定義集合の参照経路を更に簡素化することができる場合もある。
【０１１４】
図１２は、分岐命令の条件判定に用いる参照定義集合を最適化する例を示す図である。
【０１１５】
例えば、図１２に示すように、プログラム内に分岐命令が存在し、そのせいで参照しうる経路が複数となる場合がある。しかし、仮にＣＰＵ内部フラグの候補値を計算することで分岐先が一意であると認められれば、前述の複数の参照経路のうち、分岐されない参照経路を除去できる。
【０１１６】
図１０に示す例の場合、命令１０４におけるＣＰＵ内部フラグの候補値を計算してみると、常に分岐条件（Ｆｌａｇ．Ｚ ∪ （Ｆｌａｇ．Ｎ ＸＯＲ Ｆｌａｇ．Ｖ）＝０）が成立しないことが分かる。したがって、到達定義から参照定義集合が２つ求められた場合、分岐条件が成立すると仮定した計算で導出される参照定義集合は除去できる。すわなち、参照定義集合情報ＯＢ１０５に対し、不要な参照経路を除去する最適化処理を施すことができる。
【０１１７】
以上のように、本例では、候補値計算部ＢＬ１０４は、分岐命令の条件判定において参照される変数が取りうる候補値を計算し、参照定義集合情報取得部ＢＬ１０３は、その候補値に基づいて分岐命令における分岐先を判定し、条件判定において変数を参照する命令と当該命令において参照される変数を定義する命令との連鎖を示す参照定義集合情報ＯＢ１０５に反映させる。分岐命令における分岐先を判定して参照定義集合情報に反映させるので、分岐命令を含むソースコードも容易に解析することができる。
【０１１８】
また、その際、参照定義集合情報取得部ＢＬ１０３は、候補値計算部ＢＬ１０４で計算された候補値に基づき、分岐条件を満たさない分岐先の参照定義集合情報ＯＢ１０５を除去する。分岐命令において分岐条件を満たさない分岐先については参照定義集合情報ＯＢ１０５が除去されるので、不要な参照経路を除く最適化が可能である。
【０１１９】
（例２：間接アドレッシングモード）
【０１２０】
参照定義集合の参照経路が更に間接アドレッシングモードの命令により制約を受ける場合がある。例えば、レジスタやメモリの内容を間接アドレッシングモードで参照する場合、分岐先のメモリ番地が算術演算の結果によって変わる。変数の参照定義集合情報は、プログラムの分岐方向によって大きく左右される。
【０１２１】
間接アドレッシングモードの命令では、レジスタまたはメモリ等が保持する値をアドレス番地として更新先または参照先の変数を指定する。例えばアドレス番地を決定できなければ、更新または参照される変数を決定できない。また、ジャンプ命令の分岐先のアドレス番地が間接アドレッシングモードで指定されている場合、分岐先を決定することができず、参照定義集合情報ＯＢ１０５を取得できないといったことが起こりえる。
【０１２２】
したがって、間接アドレッシングモードでは、変数に格納されるアドレスを含めて候補値を見積もり、それを参照定義集合に反映させる必要がある。
【０１２３】
間接アドレッシングモードの命令を含む制御フローグラフオブジェクトＯＢ１０２から計算した到達定義は、分岐先またはデータの参照先または更新先が一意でない。そのため、間接アドレッシングモードの命令を実行する直前のアドレス番地を格納する変数の候補値を可能な限り算出し、候補値毎に制御フローグラフオブジェクトＯＢ１０２を再構築し、併せて到達定義を再計算する。
【０１２４】
これら再計算された到達定義を基に参照定義集合を計算することで、間接アドレッシングモードの命令に対応した参照定義集合を計算することが可能となる。
【０１２５】
図１３は、間接アドレッシングモードの命令を含むプログラムの参照定義集合を取得する処理を示すフローチャートである。図１３には具体的な処理フローが示されている。
【０１２６】
最初に、参照定義集合情報取得部ＢＬ１０３は制御フローグラフオブジェクトＯＢ１０２内に間接アドレッシングモードの命令が存在するか否か確認する（ステップＳ１２０００）。
【０１２７】
間接アドレッシングモードの命令が存在する場合、参照定義集合情報取得部ＢＬ１０３は間接アドレッシングモードの命令を除いた状態で明示的変数到達定義ＯＢ１０３および暗示的変数到達定義ＯＢ１０４を計算する（ステップＳ１２０１０）。なお、この場合、制御フローグラフオブジェクトＯＢ１０２は、例えば図３における命令種類情報において、命令が間接アドレッシングモードであると記録されているものとする。
【０１２８】
その後、参照定義集合情報取得部ＢＬ１０３は、間接アドレッシングモードの命令を除いて計算された明示的変数到達定義ＯＢ１０３および暗示的変数到達定義ＯＢ１０４に基づき、各間接アドレッシングモードの命令が参照する変数（アドレス番地情報を格納する変数）の参照定義集合を計算する（ステップＳ１２０２０）。
【０１２９】
次に、参照定義集合情報取得部ＢＬ１０３は、この参照定義集合に基づく計算によって変数の候補値を取得する（ステップＳ１２０３０）。この際、候補値を計算する対象となっている間接アドレッシングモードの命令以外の間接アドレッシングモードの命令による影響の有無を調べ、影響がない場合に限り、候補値を計算する。
【０１３０】
例えば、メモリ域は間接アドレッシングモードの命令によって指定される可能性があるが、汎用レジスタあるいはＣＰＵ内部フラグは間接アドレッシングモードの命令によって指定されることはない。
【０１３１】
そのため、一例として、ここでは間接アドレッシングモードの命令を受けない命令を参照する間接アドレッシングモードの命令を先に解析するものとする。この条件を満たすか否かは、ステップＳ１２０２０で導出した参照定義集合の各ノードの命令情報を参照することで判断することが可能である。また、間接アドレッシングモードの命令がプログラム中に１つである場合は、候補値を取得できる可能性を判定する処理は実行する必要が無い。
【０１３２】
以上の処理で得られた間接アドレッシングモードの候補値は、制御フローグラフオブジェクトＯＢ１０２へ反映させる（ステップＳ１２０４０）。仮に候補値が複数となる場合は、現在の制御フローグラフオブジェクトＯＢ１０２のコピーを生成し、コピーされた各制御フローグラフオブジェクトＯＢ１０２に対して候補値を反映させる。
【０１３３】
続いて、参照定義集合情報取得部ＢＬ１０３は、候補値を反映させた結果として制御フローグラフオブジェクトＯＢ１０２に変化があったか否か確認し（ステップＳ１２０５０）、内容に変化があった場合、更新された制御フローグラフオブジェクトＯＢ１０２から各到達定義を再計算する（ステップＳ１２０６０）。
【０１３４】
また、ステップＳ１２０４０にて制御フローグラフオブジェクトＯＢ１０２が複数となった場合、参照定義集合情報取得部ＢＬ１０３は、各間接アドレッシングモードの命令の候補値を反映したそれぞれの制御フローグラフオブジェクトＯＢ１０２を基にした各到達定義を計算する。
【０１３５】
その後、プログラム中でアドレス番地の候補値が解決できていない間接アドレッシングの命令が存在する場合、参照定義集合情報取得部ＢＬ１０３は、ステップＳ１２０６０にて更新された到達定義を基に参照定義集合を再計算し（ステップＳ１２０７０）、その候補値が見積もり可能であるか否か判定する（ステップＳ１２０８０）。候補値が見積もり可能である場合は、参照定義集合情報取得部ＢＬ１０３は、ステップＳ１２０３０〜ステップＳ１２０７０の処理を、制御フローグラフオブジェクトＯＢ１０２の変化がなくなるまで繰り返す。
【０１３６】
参照定義集合情報取得部ＢＬ１０３は、ステップＳ１２０５０で制御フローグラフオブジェクトＯＢ１０２の変化がなくなるか、ステップＳ１２０８０で候補値を取得できない間接アドレッシングモードの命令がなくなるまで処理を繰り返し、プログラム内のすべての間接アドレッシングモードの命令に対して候補値を解決できたか否か判定する（ステップＳ１２０９０）。
【０１３７】
プログラム内のすべての間接アドレッシングモードの命令に対して候補値を解決できた場合、参照定義集合情報取得部ＢＬ１０３は、そのときの制御フローグラフオブジェクトＯＢ１０２と、各到達定義から必要とする参照定義集合を計算することにより、参照定義集合情報ＯＢ１０５を得る（ステップＳ１２１００）。
【０１３８】
一方、候補値を取得できない間接アドレッシングモードの命令が存在する場合は、参照定義集合情報取得部ＢＬ１０３は完全な解析が不可であることを示すエラーを生成し、可能な範囲で参照定義集合情報ＯＢ１０５を生成する（ステップＳ１２１１０）。
【０１３９】
以上のように、本実施形態では、ソースコードに間接アドレッシングモードの命令がある場合、到達定義計算部ＢＬ１０２は、間接アドレッシングモードの命令を除外して明示的変数到達定義ＯＢ１０３と暗示的変数到達定義ＯＢ１０４とを生成する。参照定義集合情報取得部ＢＬ１０３は、その間接アドレッシングモードの命令を除外して生成された明示的変数到達定義ＯＢ１０３と暗示的変数到達定義ＯＢ１０４とに基づき、解決可能な間接アドレッシングモードの命令において参照される明示的変数の参照定義集合情報ＯＢ１０５を生成する。候補値計算部ＢＬ１０４は、他の間接アドレッシングモードの命令の影響を受けない間接アドレッシングモードの命令において参照される明示的変数または暗示的変数の候補値を計算し、制御フローグラフ取得部ＢＬ１０１は、その計算された候補値を制御フロー情報に反映する。その結果、制御フロー情報に変化があれば、到達定義計算部ＢＬ１０２は、変化した制御フロー情報に基づいて、明示的変数到達定義ＯＢ１０３と暗示的変数到達定義ＯＢ１０４とを生成しなおす。参照定義集合情報取得部ＢＬ１０３は、解決できていない間接アドレッシングモードの命令において参照される明示的変数の参照定義集合情報を生成する。すなわち、間接アドレッシングモードの命令がある場合、間接アドレッシングモードの命令を除外して処理を進め、解決可能になった間接アドレッシングモードの命令を解決して処理を再び進めるので、間接アドレッシングモードの命令があってもソースコード解析の処理を進めることができる。
【０１４０】
以上により、解析対象のプログラムが間接アドレッシングモードの命令を含むソースコードであっても、間接アドレッシングモードの命令を解決できる場合があり、その場合には完全な参照定義集合情報ＯＢ１０５を得ることができる。また、すべての間接アドレッシングモードの命令を解析できない場合においても、可能な範囲で参照定義集合情報ＯＢ１０５の完成度を高めることができる。
【０１４１】
＜他の実施形態＞
【０１４２】
上述した実施形態の他にも様々な実施形態が可能である。例えば、最適化器３００がソースコードを最適化するとき、どのような情報を必要とするかに応じて、コード解析処理部１００側で参照定義集合情報を最適化する度合いを調整することにしてもよい。
【０１４３】
例えば、最適化器３００が、ある命令が実行される直前における変数の候補値のみを必要とする場合、コード解析処理部１００が出力する参照定義集合としては変数の候補値の情報のみがあればよい。その場合、コード解析処理部１００の参照定義集合情報取得部ＢＬ１０３は参照定義集合情報ＯＢ１０５の参照変数については候補値のみ出力すればよい。逆に、最適化器３００で詳細な参照経路情報が必要とされる場合、コード解析処理部１００は、図８で表した複雑な参照経路（連鎖）を表わす参照定義集合情報ＯＢ１０５をそのまま出力するとよい。
【０１４４】
また、最適化器３００がレジスタあるいはメモリなどの明示的変数については参照経路を必要とし、ＣＰＵ内部フラグなどの暗示的変数は候補値のみでよい場合も考えられる。その場合、コード解析処理部１００は、暗示的変数の候補値と、明示的変数の参照経路のみを表した情報を参照定義集合情報として出力すればよい。
【０１４５】
このように、参照定義集合情報取得部ＢＬ１０３は最適化した参照定義集合情報を最適化器３００に提供するので、参照定義集合情報ＯＢ１０５の情報量を低減するとともに最適化器３００の処理を効率化することができる。
【０１４６】
その際、参照定義集合情報取得部ＢＬ１０３は、最適化器３００が必要とする情報を含み不要な情報を含まないように参照定義集合情報ＯＢ１０５を生成し、最適化器３００に提供するので、最適化器３００に合う態様で、参照定義集合情報ＯＢ１０５の情報量の削減になるとともに、最適化器３００における処理の効率化になる。
【０１４７】
＜候補値を見積もりできなかった場合の代替処理＞
【０１４８】
上述した実施形態では、必要な変数の候補値を見積もれない場合にはエラーを出力することとしたが、これに限定されることはない。候補値を見積もることができなくても、候補値の範囲を見積もることができる場合もある。
【０１４９】
例えば、ある変数の値が８ビットの任意の値となることが分かっている場合、変数が取り得る値は２５６通りである。既存のマイコンのうち生産が終了しているマイコンの多くは８ビットマイコンあるいは１６ビットマイコンである。変数が取り得る値によっては、各変数の値に対応した参照定義集合情報ＯＢ１０５を求めることができる場合もあり、その場合はエラー出力ではなく、参照定義集合情報ＯＢ１０５を出力してもよい。
【０１５０】
以上説明した各実施形態によれば、ＣＰＵあるいは周辺回路などのハードウェアによって暗示的に更新されるＣＰＵ内部フラグおよび専用レジスタを含めた参照定義集合情報および変数が取り得る値を計算することができる。したがって、ハードウェアの動作を意識した処理を含めたプログラムの解析が可能となる。その解析結果を最適化し、解析結果に基づいてソースコードを変換することで、ハードウェアの動作を含めた処理を再現可能なプログラムのソースコード変換を行うことができる。また、解析結果に基づき最適化処理を調整することにより、効率よいソースコード変換が可能となる。
【０１５１】
また、参照定義集合を取得する過程で必要となる変数の候補値を適宜計算するので、参照定義集合を簡約化することができ、また間接アドレッシングモードの命令を含むプログラムの参照定義集合を求めることも可能となる。
【０１５２】
また、上述した他の実施形態では、得られた参照定義集合情報を利用した最適化処理において、最適化処理を実行する最適化器３００が必要とする情報に応じて、参照定義集合情報の部分的、または全体において参照される変数を候補値に置き換えた情報を出力できる。その結果、最適化器３００側で参照定義集合情報を再整理不要となり、最適化器の構成を簡約化できる。
【０１５３】
なお、ここでは、あるマイコンのＣＰＵが処理することが可能な形式で記述されたソースコードを、アーキテクチャが異なる別のマイコンが処理することが可能な形式、あるいはＣ言語などの上位言語へ変換する装置におけるソースコード解析技術を前提とする例を示した。しかし、本発明がこれに限定されることはなく、Ｃ言語などの上位言語からＣＰＵが直接認識可能な機械語へ変換する（コンパイル）する解析処理においても同様に本発明を利用可能である。このように、上述した本発明の実施形態は、本発明の説明のための例示であり、本発明の範囲をそれらの実施形態にのみ限定する趣旨ではない。当業者は、本発明の要旨を逸脱することなしに、他の様々な態様で本発明を実施することができる。
【符号の説明】
【０１５４】
ＢＬ１０１…制御フローグラフ取得部、ＢＬ１０２…到達定義計算部、ＢＬ１０３…参照定義集合情報取得部、ＢＬ１０４…候補値計算部ＢＬ、ＢＬ１０５…参照定義集合情報取得部、１０…ソースコード変換装置、１００…コード解析処理部、２００…コード変換処理部、３００…最適化器
【図１】
2016110257.tif 000003
【図２】
2016110257.tif 000004
【図３】
2016110257.tif 000005
【図４】
2016110257.tif 000006
【図５】
2016110257.tif 000007
【図６】
2016110257.tif 000008
【図７】
2016110257.tif 000009
【図８】
2016110257.tif 000010
【図９】
2016110257.tif 000011
【図１０】
2016110257.tif 000012
【図１１】
2016110257.tif 000013
【図１２】
2016110257.tif 000014
【図１３】
2016110257.tif 000015