(57)【要約】【課題】グローバル変数領域（ＲＡＭ使用量）を削減することができるコンパイラ装置、コンパイラ方法及びプログラムを提供する。【解決手段】コンパイラ８は、グローバル変数の使用範囲を調査して有効範囲を変更する有効範囲変更部８４と、有効範囲変更部によって有効範囲を変更した変数情報を保有する有効範囲変更変数一覧表を格納する格納部８７と、を有する。有効範囲変更部８４は、有効範囲変更変数一覧表より複数のグローバル変数を同一アドレスの領域に配置することが可能な変数を抽出し、変数領域として割り当てする。【選択図】図１
2011180814.tif 000002
【特許請求の範囲】
【請求項１】
グローバル変数の使用範囲を調査して有効範囲を変更する有効範囲変更部と、
有効範囲変更部によって有効範囲を変更した変数情報を保有する有効範囲変更変数一覧表を格納する格納部と、を有し、
前記有効範囲変更部は、有効範囲変更変数一覧表より複数のグローバル変数を同一アドレスの領域に配置することが可能な変数を抽出し、変数領域として割り当てする、コンパイラ装置。
【請求項２】
前記有効範囲変更部は、有効範囲変更可能と判断した変数のみのグローバル変数一覧を生成し、このグローバル変数一覧に基づき、有効範囲変更変数一覧表を生成する、請求項１に記載のコンパイラ装置。
【請求項３】
前記有効範囲変更部は、前記グローバル変数一覧を参照し、有効範囲変更変数同士で有効範囲が重ならない変数を判断し、同一領域に配置できる有効範囲変更変数を決定し、有効範囲変更変数一覧表を作成する、請求項１又は２に記載のコンパイラ装置。
【請求項４】
前記有効範囲変更部は、特定の修飾子を指定した変数を除外した前記グローバル変数一覧を生成する、請求項１乃至３のいずれか１項記載のコンパイラ装置。
【請求項５】
前記有効範囲変更部は、初期値を持つ変数を除外した前記グローバル変数一覧を生成する、請求項１乃至４のいずれか１項記載のコンパイラ装置。
【請求項６】
前記有効範囲変更部は、変数のリード／ライト箇所を調査して変数の有効範囲を特定した前記グローバル変数一覧を生成する、請求項１乃至５のいずれか１項記載のコンパイラ装置。
【請求項７】
前記有効範囲変更部は、有効範囲を特定不可能な変数を除外した前記グローバル変数一覧を生成する、請求項１乃至６のいずれか１項記載のコンパイラ装置。
【請求項８】
前記有効範囲変更部は、有効範囲入口でリードを行う変数を除外した前記グローバル変数一覧を生成する、請求項１乃至７のいずれか１項記載のコンパイラ装置。
【請求項９】
前記有効範囲変更部は、変数の有効範囲を変更した前記グローバル変数一覧を生成する、請求項１乃至８のいずれか１項記載のコンパイラ装置。
【請求項１０】
前記有効範囲変更部は、有効範囲が重ならない変数を同一領域に配置した前記グローバル変数一覧を生成する、請求項１乃至９のいずれか１項記載のコンパイラ装置。
【請求項１１】
ソースプログラムに対して構文解析を行い中間コードを生成する構文解析部と、
前記中間コードよりソースプログラムの関数の呼び出し関係を調査し、コールツリーを作成し、中間コードに追加して出力するコールツリー作成部と、
中間コードから、ソースプログラムの変数の定義状況を調査し、前記グローバル変数一覧表を生成する変数配置部とを更に有する、請求項１乃至１０のいずれか１項記載のコンパイラ装置。
【請求項１２】
グローバル変数の使用範囲を調査して有効範囲を変更し、
有効範囲を変更した変数情報を保有する有効範囲変更変数一覧表を生成し、
有効範囲変更変数一覧表より複数のグローバル変数を同一アドレスの領域に配置することが可能な変数を抽出し、変数領域として割り当てる、コンパイル方法。
【請求項１３】
半導体集積回路用のコンパイラ装置に所定の動作を実行させるためのプログラムであって、
グローバル変数の使用範囲を調査して有効範囲を変更し、
有効範囲を変更した変数情報を保有する有効範囲変更変数一覧表を生成し、
有効範囲変更変数一覧表より複数のグローバル変数を同一アドレスの領域に配置することが可能な変数を抽出し、変数領域として割り当てる、プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、半導体集積回路用コンパイラ装置、コンパイル方法及びプログラムに関し、特にコンパイラ装置におけるコード生成方法に関する。
【背景技術】
【０００２】
近年、製品規模の増大により使用されている組み込み用の半導体集積回路の機能も複雑化してきており、半導体集積回路を動作させるためのプログラム開発用のコンパイラ装置においても大規模化したプログラムをコード効率が良くかつ使用するメモリを少なくすることが望まれている。その流れの中で、プログラムの大規模化により多人数の開発を行なう関係上、グローバル変数等の変数領域増加に伴い、ＲＡＭ領域の使用効率を向上させ、使用するＲＡＭ容量の増大を避ける技術が求められている。
【０００３】
例えば、特許文献１に記載のプログラム変換方法にかかる技術は、関数呼び出しをまたがって存在するグローバル変数の使用における冗長なメモリ参照を削除することを目的としている。
【０００４】
図１５は、一般的なコンパイラが稼動する計算機システムの構成図である。図１５に示すように、計算機システムはＣＰＵ１０１、主記憶装置１０４、外部記憶装置１０５、ディスプレイ装置１０２、キーボード１０３より構成されている。外部記憶装置１０５にはソースプログラム１０６、オブジェクトプログラム１０７が格納される。主記憶装置１０４には、コンパイラ１０８と、コンパイル処理過程で必要となる中間コード１０９、変数参照表１１０および引数変換表１１１が保持される。コンパイル処理はＣＰＵ１０１がコンパイラプログラム１０８を実行することにより行われる。キーボード１０３はユーザからのコマンドをコンパイラ１０８に与えるのに用いる。ディスプレイ装置１０２はコンパイルの終了またはエラーをユーザに知らせる。
【０００５】
図１６は、コンパイル処理の流れを示したフローチャートである。コンパイラの処理は、まずステップ２０１で、構文解析を行う。構文解析はソースプログラム１０６を読み出し、コンパイラ内部で処理可能な中間コード１０９を作成する。構文解析処理については、たとえばエイホ、セシィ、ウルマン著：コンパイラII（サイエンス社、１９９０年）（以下、非特許文献という。）の３０頁〜７４頁に記載されている。次にステップ２０２で、変数参照解析を行う。
【０００６】
変数参照解析についても非特許文献の７４１頁〜７７２頁に記載がある。変数参照解析により、プログラムに含まれる各文において参照される変数の集合および参照の種類（定義、使用）が求められ、これが変数参照表１１０に記録される。次にステップ２０３で、未処理の関数があるか調べる。なければステップ２０６へ進み、オブジェクトコードを生成して終了する。オブジェクトコード生成については、同じく非特許文献の６２４頁〜７０７頁に記載がある。未処理の関数があればステップ２０４で関数を１つ取り出す（ｎとする）。そしてステップ２０５で、ｎ中のグローバル変数に対してグローバル変数のローカル変数変換処理を行う。この処理の後はステップ２０３から繰り返す。
【０００７】
図１７は、従来技術のグローバル変数のローカル変数変換の例を示す図である。図１６のステップ２０５でグローバル変数のローカル変数変換処理が行われる。図１７（ａ）のようなプログラムの場合で、ｔｒｉｍ（文６１３）に対して引数変換を適用する。
【０００８】
まず、ｔｒｉｍ（文６１３）をクローニングした関数ｔｒｉｍ２(図１７（ｂ）の文７１３)を作成する。図１７（ａ）の引数変換表を見て、ｔｒｉｍに対して登録されているグローバル変数のうち未処理のものがあるかを調べ、Ｇを選択する。Ｇと同じ型の引数ｇをｔｒｉｍ２に追加する（図１７（ｂ）の文７１３参照）。図１７（ｂ）のｔｒｉｍ２内の文６１６、６１７におけるＧの使用をローカル変数ｇに置き換える。図１７（ｂ）の変換結果は、ｔｒｉｍ２に置き換えを行った結果である。
【０００９】
次に図１７（ａ）の引数変換表をもとに引数変換を行った関数に対応するコールサイトを引数変換後の関数呼び出しに置き換える（図１７（ｂ）の文７１６、７１７）。図１７（ａ）の文６０８におけるｔｒｉｍの呼び出しは、ｔｒｉｍ２への呼び出しに置き換えられ、引数として新しくＧが追加される（図１７（ｂ）の文７０８）。図１７（ｂ）のｍａｉｎは、変換した結果である。
【００１０】
最後にグローバル変数のローカル変数変換を行う。変換結果は図１７（ｂ）の変換結果のようになる。ｔｒｉｍ内のグローバル変数Ｇの使用がｍａｉｎ内に移動した後、グローバル変数のローカル変数変換によってループの外に出されている。これにより、ｔｒｉｍの呼び出し毎に生じていたＧの使用における冗長なメモリ参照が削除され、ループ入口で一度だけ生じることになる。これによって、プログラムの実行時のメモリ参照量を減少させ、プログラム実行の高速化に効果がある。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２００２−０９９４２５（図１、図２、図６、図７）
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、上記特許文献１に記載の技術は、グローバル変数を宣言した分のＲＡＭ領域サイズが不変であるため、ＲＡＭ領域が足りなくなるという問題点がある。その理由は以下の通りである。プログラム内で宣言されたグローバル変数に対して引数変換表を用いて、プログラム内で使用しているグローバル変数をローカル変数に置き換えても支障が無い場合に、関数の引数にローカル変数を追加してグローバル変数でのやり取りではなく、ローカル変数でのやり取りに置き換える。この際、グローバル変数を宣言した分だけＲＡＭの領域が確保されるため、ＲＡＭ容量に制限がある組み込みシステムでは、プログラム量が膨大になると、決められたＲＡＭ容量に収まらず、リンクエラーとなるためである。
【課題を解決するための手段】
【００１３】
本発明に係るコンパイラ装置は、グローバル変数の使用範囲を調査して有効範囲を変更する有効範囲変更部と、有効範囲変更部によって有効範囲を変更した変数情報を保有する有効範囲変更変数一覧表を格納する格納部と、を有し、前記有効範囲変更部は、有効範囲変更変数一覧表より複数のグローバル変数を同一アドレスの領域に配置することが可能な変数を抽出し、変数領域として割り当てするものである。
【００１４】
本発明に係るコンパイル方法は、グローバル変数の使用範囲を調査して有効範囲を変更し、有効範囲を変更した変数情報を保有する有効範囲変更変数一覧表を生成し、有効範囲変更変数一覧表より複数のグローバル変数を同一アドレスの領域に配置することが可能な変数を抽出し、変数領域として割り当てるものである。
【００１５】
また、本発明に係るプログラムは、上述したコンパイル処理をコンピュータに実行させるものである。
【００１６】
本発明においては、有効範囲変更変数一覧表より複数のグローバル変数を同一アドレスの領域に配置することが可能な変数を抽出し、変数領域として割り当てすることにより、同一の領域にグローバル変数を重ねて配置することが可能となり、ＲＡＭのグローバル変数領域を削減することができる。
【発明の効果】
【００１７】
本発明によれば、グローバル変数領域（ＲＡＭ使用量）を削減することができるコンパイラ装置、コンパイル方法及びプログラムを提供することができる。
【図面の簡単な説明】
【００１８】
【図１】本発明の実施の形態にかかるコンパイラ装置のブロック図である。
【図２】本発明の実施の形態にかかるコンパイル処理の流れを示したフローチャートである。
【図３】本発明の実施の形態にかかるコンパイラの動作を説明するためのソースプログラム例を示す図である。
【図４】本発明の実施の形態にかかるコンパイル実行時に出力される関数の呼び出し関連図である。
【図５】本発明の実施の形態にかかるコンパイル実行の変数配置時に作成されるグローバル変数一覧表を示す図である。
【図６】本発明の実施の形態におけるｖｏｌａｔｉｌｅ修飾変数付きグローバル変数一覧表を示す図である。
【図７】本発明の実施の形態における初期値を持つ変数付きグローバル変数一覧表を示す図である。
【図８】本発明の実施の形態における関数毎のリード／ライト調査結果付きグローバル変数一覧表を示す図である。
【図９】本発明の実施の形態における変数の使用範囲調査結果付きグローバル変数一覧表を示す図である。
【図１０】本発明の実施の形態における変数の使用範囲の入口調査結果付きグローバル変数一覧表を示す図である。
【図１１】本発明の実施の形態におけるライトより先にリードが行われる変数であるかの調査結果付きグローバル変数一覧表である。
【図１２】本発明の実施の形態における有効範囲変更可能と判断されたグローバル変数一覧表を示す図である。
【図１３】図１２で有効範囲変更可能と判断された変数の変更後の有効範囲を示す関数の呼び出し関連図である。
【図１４】本発明の実施の形態における有効範囲変更変数一覧表を示す図である。
【図１５】一般的なコンパイラが稼動する計算機システムの構成図である。
【図１６】従来のコンパイル処理の流れを示したフローチャートである。
【図１７】従来技術によるグローバル変数をローカル変数に変換する例を示した図である。
【発明を実施するための形態】
【００１９】
以下、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。この実施の形態は、本発明を、半導体集積回路用コンパイラ装置に適用したものである。
【００２０】
本実施の形態においては、コンパイラ装置は、グローバル変数の使用範囲を調査して有効範囲を変更する有効範囲変更部と有効範囲変更部によって有効範囲を変更した変数情報を保有する有効範囲変更変数一覧表を格納する格納部とを有する。有効範囲変更部は、有効範囲変更変数一覧表より複数のグローバル変数を同一アドレスの領域に配置することが可能な変数を抽出し、変数領域として割り当てする。
【００２１】
この有効範囲変更部は、特定の修飾子を指定した変数と初期値を有する変数をグローバル変数一覧より除外する処理を行い、次に、グロ-バル変数のリード／ライト箇所を調査して変数の有効範囲を特定して有効範囲を特定不可能な変数及び有効範囲入口でリードを行う変数をグローバル変数一覧より除外する処理を行う。更に、変数の有効範囲を変更して有効範囲が重ならない変数を同一領域に配置することにより、グローバル変数の有効範囲を狭めてグローバル変数の有効範囲外実行時には領域を確保しないようにできる。これにより、グローバル変数領域（ＲＡＭ使用量）を削減することができる。
【００２２】
図１は、本発明の実施の形態にかかるコンパイラ装置のブロック図である。コンパイラ装置４は、コンパイラ８とリンカ９とで構成される。
【００２３】
外部記憶装置５は、１つ以上のソースファイルで構成されるソースプログラム６とコンパイルした結果のオブジェクトプログラム７とライブラリ９１と実行ファイル１０とで構成される。
【００２４】
コンパイラ８は、１つ以上のソースファイルで構成されるソースプログラム６を外部記憶装置５から入力し、コンパイルを実行する。
【００２５】
コンパイラ８は、入力されたソースプログラム６の構文解析を構文解析部８１にて行う。
構文解析部８１は、入力されたソースプログラム６に記述されたプログラム言語を解析し、以降のコンパイル処理に適した形式の中間コードに変換する。
【００２６】
コールツリー作成部８２は、構文解析部８１が出力した中間コードを入力として、ソースプログラム６に記述された関数の呼び出し関係を調査し、結果を中間コードに追加して出力する。
【００２７】
変数配置部８３は、コールツリー作成部８２が出力した中間コードを入力として、ソースプログラム６に記述された変数の定義・使用状況を調査し、結果を中間コードに追加して出力する。
【００２８】
有効範囲変更部８４は、変数配置部８３が出力した中間コードを入力として、有効範囲変更処理を行い、有効範囲変更変数一覧表８７を作成し、中間コードに追加して出力する。
【００２９】
最適化部８５は、有効範囲変更部８４が出力した中間コードを入力として、冗長な中間コードを削除するなど最適化を行なった中間コードを出力する。
【００３０】
コード生成部８６は、最適化部８５が出力した中間コードと、中間コードに含まれる有効範囲変更変数一覧表８７を入力として、組み込み用の半導体集積回路に適した機械語に変換し、オブジェクトプログラム７を出力する。
【００３１】
リンカ９は、１つ以上のオブジェクトファイルで構成されるオブジェクトプログラム７とライブラリ９１を外部記憶装置５から入力し、リンクを実行し、実行ファイル１０を出力する。
【００３２】
図２は、本発明のコンパイル処理の流れを示したフローチャートである。図３は、本発明のコンパイラ実行時の動作を説明するためのソースプログラム例であり、各行の"："までが行番号を示し、以降がプログラム部分で構成される。
【００３３】
図４は、本発明のコンパイラ実行時に出力される関数の呼び出し関連図である。図４は、図３のソースプログラムの各関数の呼び出し関係を、５行目のｍａｉｎ（）関数部分よりツリー形式にて構成したものである。図３の各関数は、ｍａｉｎ（）関数以外に、１０行目のｆｕｎｃ１（）関数、１４行目のｆｕｎｃ２（）関数、１７行目のｆｕｎｃ３（）関数、２２行目のｆ１（）関数、２７行目のｆ２（）関数、３２行目のｆ３（）関数、３５行目のｆ４（）関数、４０行目のｆ５（）関数で構成されている。ｍａｉｎ（）関数は、ｆｕｎｃ１（）関数、ｆ１（）関数、ｆ２（）関数を呼び出し、ｆｕｎｃ１（）関数はｆｕｎｃ２関数を呼び出し、ｆｕｎｃ２（）関数はｆｕｎｃ３（）関数を呼び出している。
【００３４】
またｆ１（）関数は、ｆ２（）関数を呼び出し、ｆ２（）関数はｍａｉｎ（）関数から呼び出され、かつｆ１（）関数からも呼び出される。ｆ２（）関数は、ｆ３（）関数とｆ４（）関数を呼び出し、ｆ４（）関数はｆ５（）関数を呼び出している構成になっている。
【００３５】
図５は、本発明のコンパイラ実行時に出力されるグローバル変数一覧表を示す。図５の各行は、グローバルシンボル名、ｖｏｌａｔｉｌｅ修飾子、初期値指定、リード関数、ライト関数、使用範囲、使用範囲の入口の処理、有効範囲変更可否で構成される。
【００３６】
図６乃至図１２は、図５のグローバル変数一覧表に各処理を実行した結果が書き込まれた図であり、構成に関しては図５と同一である。図６は、本発明の実施の形態におけるｖｏｌａｔｉｌｅ修飾変数付きグローバル変数一覧表、図７は、初期値を持つ変数付きグローバル変数一覧表を示す図である。図８は、関数毎のリード／ライト調査結果付きグローバル変数一覧表、図９は、変数の使用範囲調査結果付きグローバル変数一覧表を示す図である。図１０は、変数の使用範囲の入口調査結果付きグローバル変数一覧表、図１１は、ライトより先にリードが行われる変数であるかの調査結果付きグローバル変数一覧表、図１２は、有効範囲変更可能と判断されたグローバル変数一覧表を示す図である。
【００３７】
図１３は、図１２で有効範囲変更可能と判断された変数の変更後の有効範囲を示す関数の呼び出し関連図である。基本的な関数の構成が図４と同じあり、変数ｇｌｏｂａｌの有効範囲４００となる関数は、ｆｕｎｃ１（）関数からｆｕｎｃ２（）関数が呼び出され、ｆｕｎｃ２（）関数からｆｕｎｃ３（）関数が呼び出される構成になっており、変数ｖａｒ４の有効範囲４０１となる関数は、ｆ２（）関数からｆ３（）関数、ｆ４（）関数が呼び出され、ｆ４（）関数からｆ５（）関数が呼び出される構成になっている。
【００３８】
図１４は、本発明の有効範囲変更変数一覧表を示す。図１４の各行は、グローバルシンボル名、有効範囲、有効範囲が重ならない有効範囲変更変数、有効範囲変更変数領域に領域確保、同一アドレスに定義される変数で構成される。
【００３９】
図３乃至図１４を参照して、図１の本実施の形態にかかるコンパイラ装置の動作及び図２に示す本実施の形態にかかるコンパイル処理の流れを示したフローチャートについて説明する。
【００４０】
図２に示すように、構文解析部８１は、図３のソースプログラムに対して構文解析を行い、従来技術と同様に中間コードを出力する（ステップＳ１）。
【００４１】
コールツリー作成部８２は、構文解析部８１の出力した中間コードより図３のソースプログラムの関数の呼び出し関係を調査し、図４のコールツリーを作成し、中間コードに追加して出力する（ステップＳ２）。
【００４２】
変数配置部８３は、コールツリー作成部８２の出力した中間コードから、図３のソースプログラムの変数の定義状況を調査し、図５に示すグローバル変数一覧表を作成する（ステップＳ３）。ここで作成されるグローバル変数一覧表は、ステップＳ３においてグローバル変数一覧表内のグローバルシンボル名の欄にグローバルシンボル情報が記載される。図３のソースプログラムでは、変数ｇｌｏｂａｌ（１行目）、変数ｖａｒ１（２行目）、変数ｖａｒ２（３行目）、変数ｖａｒ３（４行目）、変数ｖａｒ４（４行目）、変数ｖａｒ５（４行目）が該当する変数となる。
【００４３】
次に、有効範囲変更部８４は、図２のフローチャートのステップＳ５の処理を行なう。図５のグローバル変数一覧よりｖｏｌａｔｉｌｅ修飾された変数が存在するかを判断し（図６）、存在する場合はその変数を除外して図７のグローバル変数一覧を作成する（ステップＳ１０１）。図３のソースプログラムでは、２行目の変数ｖａｒ１がｖｏｌａｔｉｌｅ修飾されているため、除外して図７のグローバル変数一覧を作成する。
【００４４】
次に、図７のグローバル変数一覧より、初期値を持つ変数が存在するかを判断し、存在する場合はその変数を除外して図８のグローバル変数一覧を作成する（ステップＳ１０２）。図３のソースプログラムでは、３行目の変数ｖａｒ２が初期値１０を与えられているため、除外して図８のグローバル変数一覧を作成する。
【００４５】
次に、図８のグローバル変数一覧に登録されている各変数に対し、変数配置部８３が出力した中間コードよりリード／ライト箇所を調査して図８のグローバル変数一覧を作成する（ステップＳ１０３）。
【００４６】
図３のソースプログラムでは、変数ｇｌｏｂａｌはｆｕｎｃ１（）関数（図３の１１行目）でライトが行われ、ｆｕｎｃ３（）関数（図３の１９行目）でリードが行われる。変数ｖａｒ３は、ｆ１（）関数（図３の２５行目、２３行目）、ｆ４（）関数（図３の３６行目）でライトが行われ、ｆ１（）関数（図３の２５行目）、ｆ２（）関数（図３の２８行目）、ｆ３（）関数（図３の３３行目）でリードが行われる。変数ｖａｒ４は、ｆ２（）関数（図３の２９行目）、ｆ４（）関数（図３の３７行目）、ｆ５（）関数（図３の４１行目）でライトが行われ、ｆ２（）関数（図３の３０行目）でリードが行われる。変数ｖａｒ５は、ｆ５（）関数（図３の４２行目、４３行目）でライトが行われ、ｆ５（）関数（図３の４２行目）でリードが行われる。
【００４７】
次に、図８のグローバル変数一覧と図４コールツリーより、変数を使用している範囲を特定して図９のグローバル変数一覧を作成する（ステップＳ１０４）。図３のソースプログラムでは、図８より変数ｇｌｏｂａｌがｆｕｎｃ１（）関数でライトが行われ、ｆｕｎｃ３（）関数でリードが行われる。図４のコールツリーより、ｆｕｎｃ１（）関数からｆｕｎｃ２（）関数が呼び出され、ｆｕｎｃ２（）関数からｆｕｎｃ３（）関数が呼び出される構成になっているため、使用範囲はｆｕｎｃ１（）関数、ｆｕｎｃ２（）関数、ｆｕｎｃ３（）関数となる。
【００４８】
変数ｖａｒ３は、図８よりｆ１（）関数、ｆ２（）関数、ｆ３（）関数でライトが行われ、ｆ１（）関数、ｆ４（）関数でリードが行われる。図４のコールツリーより、ｆ１（）関数からｆ２（）関数が呼び出され、ｆ２（）関数からｆ３（）関数、ｆ４（）関数が呼び出され、ｆ４（）関数からｆ５（）関数が呼び出される構成になっているため、使用範囲はｆ１（）関数、ｆ２（）関数、ｆ３（）関数、ｆ４（）関数、ｆ５（）関数となる。
【００４９】
変数ｖａｒ４は、図８よりｆ２（）関数でライトが行われ、ｆ２（）関数、ｆ４（）関数、ｆ５（）関数でリードが行われる。図４のコールツリーより、ｆ２（）関数からｆ３（）関数、ｆ４（）関数が呼び出され、ｆ４（）関数からｆ５（）関数が呼び出される構成になっているため、使用範囲はｆ２（）関数、ｆ３（）関数、ｆ４（）関数、ｆ５（）関数となる。
【００５０】
変数ｖａｒ５は、図８よりｆ５（）関数でライトが行われ、ｆ５（）関数でリードが行われる。図４のコールツリーより、ｆ５（）関数から呼び出される関数は存在しないため、使用範囲はｆ５（）関数となる。
【００５１】
次に、グローバル変数を使用している範囲に間接関数呼び出しが存在して静的に呼び出し関数が特定できない場合、使用範囲を特定できないため、その変数を除外する（ステップＳ１０５）。図３のソースプログラム例では、間接関数呼び出しが存在しないため、変数の除外は行われない。
【００５２】
次に、図９のグローバル変数一覧と図４コールツリーより、変数を使用している範囲の全ての入口を特定して図１０のグローバル変数一覧を作成する（ステップＳ１０６）。図３のソースプログラムでは、変数ｇｌｏｂａｌがｍａｉｎ（）関数から呼び出されるｆｕｎｃ１（）関数が使用範囲の入口となり、ｆｕｎｃ１（）関数（図３の１１行目）で必ず１のライトが行われる。変数ｖａｒ３は、ｍａｉｎ（）関数から呼び出されるｆ１（）関数と、ｍａｉｎ（）関数、ｆ１（）関数から呼び出されるｆ２（）関数が使用範囲の入口となる。変数ｖａｒ４は、ｍａｉｎ（）関数、ｆ１（）関数から呼び出されるｆ２（）関数が使用範囲の入口となる。変数ｖａｒ５は、ｆ４（）関数から呼び出されるｆ５（）関数が使用範囲の入口となる。
【００５３】
次に、図１０のグローバル変数一覧と変数配置部８３が出力した中間コードより、関数の入口における変数の使用状況を調査して図１１のグローバル変数一覧を作成し、前記一覧より、変数のライトより先に変数のリードが行われる変数を判断し、対象の変数を除外して図１２のグローバル変数一覧を作成する（ステップＳ１０７）。
【００５４】
図３のソースプログラムでは、変数ｇｌｏｂａｌがｆｕｎｃ１（）関数（図３の１１行目）で必ず"１"のライトが行われる。変数ｖａｒ３は、ｆ１（）関数（図３の２３行目）で必ず"１"のライトが行われ、ｆ２（）関数（図３の２８行目）で必ずリードが行われる。変数ｖａｒ４は、ｆ２（）関数（図３の２９行目）で必ず"０"のライトが行われる。変数ｖａｒ５は、ｆ５（）関数（図３の４２行目）で変数ｖａｒ１の値によりリードが行われる場合がある。変数ｖａｒ３と変数ｖａｒ５が１箇所でも変数のライトより先に変数のリードが行われる変数と判断し、図１１のグローバル変数一覧より除外して図１２のグローバル変数一覧を作成する。
【００５５】
ステップＳ１０１〜Ｓ１０７により、有効範囲変更可能と判断した変数のみのグローバル変数一覧（図１２）となり、図１２のグローバル変数一覧に登録されている変数の使用範囲を新たな有効範囲（スコープ）として定めることができる（ステップＳ１０８）。
【００５６】
図１３は、本実施の形態による変数ｇｌｏｂａｌ、変数ｖａｒ４の有効範囲であり、図１２のグローバル変数一覧より有効範囲変更変数同士で有効範囲が重ならない変数を判断し、同一領域に配置できる有効範囲変更変数を決定し、図１４の有効範囲変更変数一覧表を作成し、有効範囲変更変数一覧表８７に出力する（ステップＳ１０９）。
【００５７】
コード生成部８６は、図１４の有効範囲変更変数一覧表の同一領域に定義されている変数に従い、変数ｖａｒ４のリード／ライトコードを変数ｇｌｏｂａｌが配置されたアドレスへのリード／ライトと同一領域へのアクセスとするコードを生成し、図１４の有効範囲変更変数一覧表の有効範囲変更変数領域の領域確保に従い、有効範囲変更変数領域を確保する（ステップＳ７）ことで、変数ｇｌｏｂａｌと変数ｖａｒ４が同一のアドレスに配置され、ＲＡＭの領域を共存する。
【００５８】
本発明は、半導体集積回路用コンパイラ装置において、グローバル変数の使用範囲を調査して有効範囲を変更する有効範囲変更部と有効範囲変更部によって有効範囲を変更した変数情報を保有する有効範囲変更変数一覧表を格納する格納部とを有し、有効範囲変更変数一覧表より複数のグローバル変数を同一アドレスの領域に配置することが可能な変数を抽出し、変数領域として割り当てする機能を有し、特定の修飾子を指定した変数と初期値を持つ変数をグローバル変数一覧より除外する処理を行い、グロ-バル変数のリード／ライト箇所を調査して変数の有効範囲を特定して有効範囲を特定不可能な変数および有効範囲入口でリードを行う変数をグローバル変数一覧より除外する処理を行い、変数の有効範囲を変更して有効範囲が重ならない変数を同一領域に配置することにより、グローバル変数の有効範囲を狭めてグローバル変数の有効範囲外実行時には領域を確保しないようにできるため、グローバル変数領域（ＲＡＭ使用量）の削減ができる。
【００５９】
すなわち、本実施の形態にかかる半導体集積回路用コンパイラ装置によれば、グローバル変数領域（ＲＡＭ使用量）の削減ができる。その理由としては、グローバル変数の有効範囲を狭めることによって有効範囲外実行時には領域を確保せずに、他の有効範囲が重ならないグローバル変数の領域を確保することで同一の領域にグローバル変数を重ねて配置することが可能となり、ＲＡＭのグローバル変数領域を削減できるからである。
【００６０】
なお、本発明は上述した実施の形態のみに限定されるものではなく、本発明の要旨を逸脱しない範囲において種々の変更が可能であることは勿論である。
【００６１】
例えば、上述の実施の形態では、ハードウェアの構成として説明したが、これに限定されるものではなく、任意の処理を、ＣＰＵ（Central Processing Unit）にコンピュータプログラムを実行させることにより実現することも可能である。この場合、コンピュータプログラムは、記録媒体に記録して提供することも可能であり、また、インターネットその他の伝送媒体を介して伝送することにより提供することも可能である。
【符号の説明】
【００６２】
４  コンパイラ装置
５  外部記憶装置
６  ソースプログラム
７  オブジェクトプログラム
８  コンパイラ
８１  構文解析部
８２  コールツリー作成部
８３  変数配置部
８４  有効範囲変更部
８５  最適化部
８６  コード生成部
８７  有効範囲変更変数一覧表
９  リンカ
９１  ライブラリ
１０  実行ファイル
４００  変数ｇｌｏｂａｌの有効範囲
４０１  変数ｖａｒ４の有効範囲
１０１  ＣＰＵ
１０２  ディスプレイ装置
１０３  キーボード
１０４  主記憶装置
１０５  外部記憶装置
１０６  ソースプログラム
１０７  オブジェクトプログラム
１０８  コンパイラ
１０９  中間コード
１１０  変数参照表
１１１  引数変換表
【図１】
2011180814.tif 000003
【図２】
2011180814.tif 000004
【図３】
2011180814.tif 000005
【図４】
2011180814.tif 000006
【図５】
2011180814.tif 000007
【図６】
2011180814.tif 000008
【図７】
2011180814.tif 000009
【図８】
2011180814.tif 000010
【図９】
2011180814.tif 000011
【図１０】
2011180814.tif 000012
【図１１】
2011180814.tif 000013
【図１２】
2011180814.tif 000014
【図１３】
2011180814.tif 000015
【図１４】
2011180814.tif 000016
【図１５】
2011180814.tif 000017
【図１６】
2011180814.tif 000018
【図１７】
2011180814.tif 000019