(57)【要約】      （修正有）【課題】リンクされないオブジェクトファイルを特定する。【解決手段】本プログラム生成方法は、実行可能プログラムを生成するための複数のコマンドを含むコマンドデータから、リンク時最適化を実行するための第１のオプションが付加されたリンクコマンド内のオブジェクトファイルである第１のオブジェクトファイルを特定し、入力ファイルが第１のオブジェクトファイルであり且つコマンドデータに含まれる１又は複数のリンクコマンドの各々に対して、第１のオプションが付加されている場合、第１のオブジェクトファイルの識別情報をデータ格納部１３に格納する処理を含む。【選択図】図１
2018032082.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
実行可能プログラムを生成するための複数のコマンドを含むコマンドデータから、リンク時最適化を実行するための第１のオプションが付加されたリンクコマンド内のオブジェクトファイルである第１のオブジェクトファイルを特定し、
入力ファイルが前記第１のオブジェクトファイルであり且つ前記コマンドデータに含まれる１又は複数のリンクコマンドの各々に対して、前記第１のオプションが付加されている場合、前記第１のオブジェクトファイルの識別情報をデータ格納部に格納する、
処理を実行させるプログラム生成プログラム。
【請求項２】
前記コンピュータに、
前記データ格納部に格納された前記第１のオブジェクトファイルに対応する第１のソースファイル以外のソースファイルから第２のオブジェクトファイルを生成する処理を、コンパイラに実行させる、
処理をさらに実行させる請求項１記載のプログラム生成プログラム。
【請求項３】
前記コンピュータに、
前記第１のソースファイル及び前記第１のソースファイル以外のソースファイルに対するファイル間最適化により生成された中間ファイルから前記第１のオブジェクトファイル及び第３のオブジェクトファイルを生成する処理を前記コンパイラに実行させ、
前記第１のオブジェクトファイルと前記第３のオブジェクトファイルとをリンクする処理をリンカに実行させる、
処理をさらに実行させる請求項２記載のプログラム生成プログラム。
【請求項４】
前記第１のオブジェクトファイルを特定する処理において、
コマンド名が所定のコマンド名であり、コンパイルコマンドであることを表す第２のオプションが付加されておらず、且つ、コマンドの入力ファイルの拡張子が所定の拡張子であるという条件を満たすリンクコマンドを特定し、
前記第１のオブジェクトファイルを、特定された前記リンクコマンドから特定する、
請求項１乃至３のいずれか１つ記載のプログラム生成プログラム。
【請求項５】
前記第１のオブジェクトファイルの識別情報を前記データ格納部に格納する処理において、
コマンド名が所定のコマンド名であり、入力ファイルが前記第１のオブジェクトファイルであり、且つ、前記第１のオプション及び前記第２のオプションが付加されていないコマンドが前記コマンドデータに含まれるか判定する、
請求項１乃至４のいずれか１つ記載のプログラム生成プログラム。
【請求項６】
前記第１のオブジェクトファイルの識別情報を前記データ格納部に格納する処理において、
コマンド名が前記所定のコマンド名であり、コンパイルコマンドであることを表す第２のオプションが付加されており、入力ファイルの拡張子が所定の拡張子であり、且つ、出力ファイルが前記第１のオブジェクトファイルであるか又は前記第１のオブジェクトファイルの拡張子以外の部分と入力ファイルの拡張子以外の部分とが一致するという条件を満たすコンパイルコマンドを前記コマンドデータから特定し、
特定された前記コンパイルコマンドに前記第１のオプションが付加されている場合に、入力ファイルが前記第１のオブジェクトファイルであり、且つ、前記第１のオプション及び前記第２のオプションが付加されていないコマンドが前記コマンドデータに含まれるか判定する、
請求項５記載のプログラム生成プログラム。
【請求項７】
前記コンピュータに、
前記第１のオブジェクトファイルに対応する第１のソースファイルに対して行われるファイル間最適化の回数が所定数であり、且つ、前記第１のソースファイルに対するファイル間最適化が行われていない場合、前記第１のソースファイルに対してファイル間最適化を実行して第１の中間ファイルを生成し且つ生成した当該第１の中間ファイルから前記第１のオブジェクトファイルを１回目のコンパイル時に生成する処理をコンパイラに実行させ、
前記第１のソースファイルと共にファイル間最適化が行われる第２のソースファイルに対してファイル間最適化を実行して第２の中間ファイルを生成し且つ生成した当該第２の中間ファイルに含まれる中間プログラムを前記第１のオブジェクトファイルに埋め込み、
前記第１のオブジェクトファイルに含まれる中間プログラムを取り出して第３のオブジェクトファイルを生成する処理を前記コンパイラに実行させ、前記第１のオブジェクトファイルと前記第３のオブジェクトファイルとをリンクする処理をリンカに実行させる、
処理をさらに実行させる請求項１記載のプログラム生成プログラム。
【請求項８】
前記コンピュータに、
前記コマンドデータを、所定のコマンドのドライランにより生成する、
処理をさらに実行させる請求項１乃至７のいずれか１つ記載のプログラム生成プログラム。
【請求項９】
コンピュータに、
コンパイルの対象として指定された第１のソースファイルの識別情報が、リンクされないオブジェクトファイルに対応するソースファイルの識別情報を格納するデータ格納部に格納されているか判定し、
前記第１のソースファイルの識別情報が前記データ格納部に格納されている場合、前記第１のソースファイル以外のソースファイルに対するコンパイルによりオブジェクトファイルを生成し、
前記第１のソースファイルと前記第１のソースファイル以外のソースファイルとに対してファイル間最適化を実行して複数の中間ファイルを生成し、
生成した前記複数の中間ファイルに対するコンパイルにより複数のオブジェクトファイルを生成する、
処理を実行させるコンパイルプログラム。
【請求項１０】
コンピュータが、
実行可能プログラムを生成するための複数のコマンドを含むコマンドデータから、リンク時最適化を実行するための第１のオプションが付加されたリンクコマンド内のオブジェクトファイルである第１のオブジェクトファイルを特定し、
入力ファイルが前記第１のオブジェクトファイルであり且つ前記コマンドデータに含まれる１又は複数のリンクコマンドの各々に対して、前記第１のオプションが付加されている場合、前記第１のオブジェクトファイルの識別情報をデータ格納部に格納する、
処理を実行するプログラム生成方法。
【請求項１１】
データ格納部と、
実行可能プログラムを生成するための複数のコマンドを含むコマンドデータから、リンク時最適化を実行するための第１のオプションが付加されたリンクコマンド内のオブジェクトファイルである第１のオブジェクトファイルを特定し、入力ファイルが前記第１のオブジェクトファイルであり且つ前記コマンドデータに含まれる１又は複数のリンクコマンドの各々に対して、前記第１のオプションが付加されている場合、前記第１のオブジェクトファイルの識別情報を前記データ格納部に格納する処理部と、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル技術に関する。
【背景技術】
【０００２】
Ｃ、Ｃ＋＋及びＦｏｒｔｒａｎなどのプログラミング言語で記述されたソースプログラムを含むソースファイルに対しては、ソースファイル間の最適化（例えば、インライン展開や定数伝播など）が有効である場合がある。ソースファイル間の最適化は、リンク時に揃うオブジェクトファイルを基にしてソースファイル全体を確認したうえで行われる。リンク時に実行されるソースファイル間の最適化は、リンク時最適化（ＬＴＯ：Link  Time  Optimization）と呼ばれる。
【０００３】
リンク時最適化を実行する場合、コンパイル（以下、１パス目のコンパイルと呼ぶ）により生成されたオブジェクトコードとソースプログラム情報とを含むオブジェクトファイルが生成され、リンク時にオブジェクトファイル内のソースプログラム情報を利用して最適化が行われる。そして、最適化の結果に対して再度コンパイル（以下、２パス目のコンパイルと呼ぶ）が実行され、その結果であるオブジェクトコードがリンクされることでビルドが完了する。
【０００４】
リンク時最適化を実行しない場合、１パス目のコンパイルの結果を含むオブジェクトファイルはリンクされる。しかし、リンク時最適化を実行する場合、２パス目のコンパイルの結果を含むオブジェクトファイルがリンクされるので、１パス目のコンパイルの結果を含むオブジェクトファイルはリンクされることが無い。
【０００５】
従って、リンク時最適化を実行する場合には１パス目のコンパイルは無駄な処理であるが、リンク時最適化を実行する場合およびリンク時最適化を実行しない場合の両方に対応できるようにするためこのような方法が採用されている。しかし、これが実行可能ファイルを生成するまでの時間を長くする一因となっている。従来技術においては、リンク時最適化のこのような問題に対する検討は行われていない。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００３−２０８３１７
【特許文献２】特開平９−２７４５７０
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明の目的は、１つの側面では、リンクされないオブジェクトファイルを特定するための技術を提供することである。
【課題を解決するための手段】
【０００８】
本発明に係るプログラム生成方法は、実行可能プログラムを生成するための複数のコマンドを含むコマンドデータから、リンク時最適化を実行するための第１のオプションが付加されたリンクコマンド内のオブジェクトファイルである第１のオブジェクトファイルを特定し、入力ファイルが第１のオブジェクトファイルであり且つコマンドデータに含まれる１又は複数のリンクコマンドの各々に対して、第１のオプションが付加されている場合、第１のオブジェクトファイルの識別情報をデータ格納部に格納する処理を含む。
【発明の効果】
【０００９】
１つの側面では、リンクされないオブジェクトファイルを特定できるようになる。
【図面の簡単な説明】
【００１０】
【図１】図１は、第１の実施の形態における情報処理装置の機能ブロック図である。
【図２】図２は、第１の実施の形態における情報処理装置の動作の概要を説明するための図である。
【図３】図３は、第１の実施の形態における情報処理装置の動作の概要を説明するための図である。
【図４】図４は、第１の実施の形態における情報処理装置の動作の概要を説明するための図である。
【図５】図５は、第１の実施の形態における前処理の処理フローを示す図である。
【図６】図６は、実行ルール格納部に格納されるデータの一例を示す図である。
【図７】図７は、生成されるｍａｋｅｆｉｌｅコマンド列の一例を示す図である。
【図８】図８は、リンクコマンドについての判定処理の処理フローを示す図である。
【図９】図９は、第１の実施の形態における前処理の処理フローを示す図である。
【図１０】図１０は、コンパイルコマンドの特定処理の処理フローを示す図である。
【図１１】図１１は、リンク時最適化についての判定処理の処理フローを示す図である。
【図１２】図１２は、第１の実施の形態のデータ格納部に格納されるデータの一例を示す図である。
【図１３】図１３は、コンパイル判定部が実行する処理の処理フローを示す図である。
【図１４】図１４は、省略フラグの一例を示す図である。
【図１５】図１５は、コンパイル制御部が実行する処理の処理フローを示す図である。
【図１６】図１６は、コンパイル省略部が実行する処理の処理フローを示す図である。
【図１７】図１７は、第１の実施の形態におけるリンク時の処理の処理フローを示す図である。
【図１８】図１８は、第１の実施の形態におけるコンパイル省略について説明するための図である。
【図１９】図１９は、第１の実施の形態におけるコンパイル省略について説明するための図である。
【図２０】図２０は、第２の実施の形態における情報処理装置の機能ブロック図である。
【図２１】図２１は、第２の実施の形態における情報処理装置の動作の概要を説明するための図である。
【図２２】図２２は、第２の実施の形態における情報処理装置の動作の概要を説明するための図である。
【図２３】図２３は、第２の実施の形態における前処理の処理フローを示す図である。
【図２４】図２４は、第２の実施の形態における前処理の処理フローを示す図である。
【図２５】図２５は、リストに登録されるデータの一例を示す図である。
【図２６】図２６は、第２の実施の形態におけるデータ格納部に格納されるデータの一例を示す図である。
【図２７】図２７は、第２の実施の形態におけるコンパイル判定部が実行する処理の処理フローを示す図である。
【図２８】図２８は、レコード数についての判定処理の処理フローを示す図である。
【図２９】図２９は、ファイル間最適化についての判定処理の処理フローを示す図である。
【図３０】図３０は、第２の実施の形態におけるデータ格納部に格納されるデータの一例を示す図である。
【図３１】図３１は、第２の実施の形態におけるコンパイル制御部が実行する処理の処理フローを示す図である。
【図３２】図３２は、ＣＦＯ判定部が実行する処理の処理フローを示す図である。
【図３３】図３３は、メモリに格納されるデータの一例を示す図である。
【図３４】図３４は、ＣＦＯ制御部が実行する処理の処理フローを示す図である。
【図３５】図３５は、第２の実施の形態によるコンパイル省略について説明するための図である。
【図３６】図３６は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１１】
［実施の形態１］
図１に、第１の実施の形態における情報処理装置１の機能ブロック図を示す。情報処理装置１は、ＬＴＯ（Link  Time  Optimization）オブジェクト抽出部１０と、コンパイラドライバ１１と、実行ルール格納部１２と、データ格納部１３と、コンパイラ１４と、ＣＦＯ（Cross-File  Optimization）実行部１５と、リンカ１６と、入力ツール１７とを含む。コンパイラドライバ１１は、コンパイル判定部１１０と、コンパイル制御部１１１とを含む。コンパイラ１４は、コンパイル省略部１４１を含む。
【００１２】
ＬＴＯオブジェクト抽出部１０は、リンクされないオブジェクトコードを含むオブジェクトファイルを抽出する。オブジェクトファイルとは、オブジェクトコード及びソースプログラム情報ファイルを含むファイルである。オブジェクトコードは、ソースファイルに対するコンパイル（ここでは、狭義コンパイルのこと。以下、特に指定した場合以外は同様とする。）により生成される命令列を含むプログラムである。ソースプログラム情報ファイルは、ソースプログラム情報（例えば、ソースプログラムそのもの）を含む。
【００１３】
コンパイラドライバ１１は、コマンドラインから呼び出され、コンパイラ１４、ＣＦＯ実行部１５及びリンカ１６を制御する。コンパイル判定部１１０は、リンクされないオブジェクトコードを含むオブジェクトファイルの一覧に基づき、コンパイルを実行するか否かを判定する。コンパイル制御部１１１は、リンクされないオブジェクトファイルに対応するソースファイルに対するコンパイルの実行を制御する。ソースファイルとは、ソースプログラムを含むファイルである。
【００１４】
コンパイラ１４はコンパイルを実行し、コンパイル省略部１４１は、コンパイルの実行を省略するための処理を実行する。コンパイルは、オブジェクトコードの生成処理とオブジェクトファイルの生成処理とを含む。なお、広義コンパイルとは、ソースファイルからオブジェクトファイルを生成するまでの一連の処理のことであり、広義コンパイルは狭義コンパイルを含む。
【００１５】
ＣＦＯ実行部１５は、ファイル間最適化を実行してファイル間最適化中間ファイルを生成する。ファイル間最適化とは、複数のソースプログラムにまたがる最適化である。ファイル間最適化中間ファイルは、ファイル間最適化中間プログラムを含む。ファイル間最適化中間プログラムは、コンパイラ１４が読み取ることができる形式のプログラムであり、ソースプログラム又は中間情報を含む。
【００１６】
リンカ１６は、リンク処理を実行し実行可能ファイルを生成する。実行可能ファイルは、プロセッサ（例えばＣＰＵ（Central  Processing  Unit）或いはＭＰＵ（Micro-Processing  Unit））が解釈する機械語の命令及びその他のデータ等を含む。
【００１７】
入力ツール１７は、実行ルール格納部１２に格納されたｍａｋｅｆｉｌｅのデータに従ってｍａｋｅコマンドを実行するためのツールである。
【００１８】
図２乃至図４を用いて、第１の実施の形態における情報処理装置１の動作の概要を説明する。
【００１９】
図２を用いて、コンパイルの前に行われる前処理について説明する。本実施の形態においては、ｍａｋｅコマンド（例えば「ｍａｋｅ  −ｎ」）の実行結果を含むｍａｋｅｆｉｌｅコマンド列をＬＴＯオブジェクト抽出部１０が解析し、リンクされないオブジェクトコードを含むオブジェクトファイルを抽出する。そのオブジェクトファイルに対応するソースファイル名はデータ格納部１３に格納される。
【００２０】
図３を用いて、コンパイルについて説明する。第１の実施の形態においては、全ソースファイルについてオブジェクトコードの生成が行われるわけではなく、リンクされないオブジェクトコードを含むオブジェクトファイルに対応するソースファイルについては、ファイル間最適化が実行される前におけるコンパイル（すなわち、１パス目のコンパイル）が省略される。従って、コンパイラ１４による処理の結果として、オブジェクトコードを含むファイル内最適化オブジェクトファイルと、オブジェクトコードを含まないファイル内最適化オブジェクトファイルとが生成される。なお、ファイル内最適化オブジェクトファイルとは、単一のファイルについての最適化のみを行って生成されるオブジェクトファイルである。
【００２１】
図４を用いて、リンクについて説明する。第１の実施の形態のリンクは、一般的なリンクと同じである。すなわち、ファイル内最適化オブジェクトファイルに対してファイル間最適化が実行されてファイル間最適化中間ファイルが生成され、ファイル間最適化中間ファイルから、オブジェクトコードを含むファイル間最適化オブジェクトファイルが生成される。そして、リンカ１６は、ファイル間最適化オブジェクトファイルをリンクすることで実行可能ファイルを生成する。
【００２２】
図５乃至図１９を用いて、第１の実施の形態における情報処理装置１の動作をより詳細に説明する。
【００２３】
まず、図５乃至図１２を用いて、前処理について説明する。情報処理装置１の入力ツール１７は、実行ルール格納部１２に格納されているｍａｋｅｆｉｌｅのデータに基づき、コマンドラインにおいて指定されたｍａｋｅコマンドのドライランを実行し、ｍａｋｅｆｉｌｅコマンド列を生成する（図５：ステップＳ１）。
【００２４】
図６に、実行ルール格納部１２に格納されるデータの一例を示す。図６の例では、「ｘ．ｅｘｅ」を「ａ．ｏ」及び「ｂ．ｏ」から生成し、「ｙ．ｅｘｅ」を「ａ．ｏ」及び「ｃ．ｏ」から生成し、「ｚ．ｅｘｅ」を「ａ．ｏ」及び「ｄ．ｏ」から生成し、「ｗ．ｅｘｅ」を「ｄ．ｏ」及び「ｅ．ｏ」から生成することが記述されている。また、「ａ．ｏ」を「ａ．ｃ」から生成し、「ｂ．ｏ」を「ｂ．ｃ」から生成し、「ｃ．ｏ」を「ｃ．ｃ」から生成し、「ｄ．ｏ」を「ｄ．ｃ」から生成し、「ｅ．ｏ」を「ｅ．ｃ」から生成することが記述されている。なお、ｍａｋｅｆｉｌｅはｍａｋｅコマンドの実行ルールが記述されたファイルである。
【００２５】
通常はコンパイルコマンド及びリンクコマンドは共にコンパイラドライバ１１として実装されるので同じ名称が用いられる。図６の例では、コンパイル又はリンクのためのコマンドとして「ｆｃｃ」が使用されている。コマンド「ｆｃｃ」において入力ファイルの拡張子が所定の拡張子（すなわち、言語仕様で予め規定された拡張子）であり且つオプション「−ｃ」が付加されている場合、コマンド「ｆｃｃ」はコンパイルコマンドである。「ｆｃｃ」において入力ファイルの拡張子が「．ｏ」であり且つオプション「−ｃ」が付加されていない場合、コマンド「ｆｃｃ」はリンクコマンドである。また、オプション「−ｏ」の後には出力ファイル名が指定される。
【００２６】
リンク時最適化を指示するオプションは「−Ｋｌｔｏ」である。コンパイルコマンド及びリンクコマンドの両方でオプション「−Ｋｌｔｏ」が付加されるとリンク時最適化が行われる。図６の例においては、「ａ．ｃ」から「ａ．ｏ」を生成するコマンドと、「ｂ．ｃ」から「ｂ．ｏ」を生成するコマンドと、「ａ．ｏ」及び「ｂ．ｏ」から「ｘ．ｅｘｅ」を生成するコマンドとにリンク時最適化オプションが付加されているので、リンク時最適化が行われる。そして、リンク時最適化の結果であるファイル間最適化中間ファイルに対してコンパイル及びリンクを実行することで実行可能ファイルが生成される。
【００２７】
なお、リンク時最適化が行われるのか否かは、ｍａｋｅｆｉｌｅ内のコンパイルコマンド及びリンクコマンドにおけるオプションの付加により決定されるが、コンパイラ１４にはリンク時のコマンドが指定されるまで不明である。
【００２８】
図６の例では、「ｆｃｃ  ａ．ｃ  −ｏ  ａ．ｏ  −ｃ  −Ｋｌｔｏ」において「ａ．ｏ」が生成され、「ｆｃｃ  ｂ．ｃ  −ｏ  ｂ．ｏ  −ｃ  −Ｋｌｔｏ」において「ｂ．ｏ」が生成され、「ｆｃｃ  ｃ．ｃ  −ｏ  ｃ．ｏ  −ｃ  −Ｋｌｔｏ」において「ｃ．ｏ」が生成されるが、これらはリンクコマンドにおいてリンクされることはない。なぜならば、「ｆｃｃ  ａ．ｏ  ｂ．ｏ  −ｏ  ｘ．ｅｘｅ  −Ｋｌｔｏ」においてはオプション「−Ｋｌｔｏ」が付加されているので「ａ．ｃ」及び「ｂ．ｃ」についてリンク時最適化が実行され、リンク時最適化によって生成されたファイル間最適化中間ファイルに対してコンパイル及びリンクが行われるからである。同様に、「ｆｃｃ  ａ．ｏ  ｃ．ｏ  −ｏ  ｙ．ｅｘｅ  −Ｋｌｔｏ」においてはオプション「−Ｋｌｔｏ」が付加されているので「ａ．ｃ」及び「ｃ．ｃ」についてリンク時最適化が実行され、リンク時最適化によって生成されたファイル間最適化中間ファイルに対してコンパイル及びリンクが行われるからである。同様に、「ｆｃｃ  ａ．ｏ  ｄ．ｏ  −ｏ  ｚ．ｅｘｅ  −Ｋｌｔｏ」においてはオプション「−Ｋｌｔｏ」が付加されているので「ａ．ｃ」についてリンク時最適化が実行され、リンク時最適化によって生成されたファイル間最適化中間ファイルに対してコンパイル及びリンクが行われるからである。なお、コンパイルコマンドにオプション「−Ｋｌｔｏ」が付加されることなく生成された「ｄ．ｏ」はリンクされる。
【００２９】
図７に、生成されるｍａｋｅｆｉｌｅコマンド列の一例を示す。図７の例では、図６に示したｍａｋｅｆｉｌｅに基づきコマンド「ｍａｋｅ  −ｎ」を実行した結果が示されている。
【００３０】
図５の説明に戻り、ＬＴＯオブジェクト抽出部１０は、ステップＳ１において生成したｍａｋｅｆｉｌｅコマンド列に未処理のコマンドが有るか判定する（ステップＳ３）。
【００３１】
未処理のコマンドが無い場合（ステップＳ３：Ｎｏルート）、処理は終了する。一方、未処理のコマンドが有る場合（ステップＳ３：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、ｍａｋｅｆｉｌｅコマンド列から未処理のコマンド（以下、処理対象のコマンドと呼ぶ）を１つ特定する（ステップＳ５）。
【００３２】
ＬＴＯオブジェクト抽出部１０は、リンクコマンドについての判定処理を実行する（ステップＳ７）。リンクコマンドについての判定処理については、図８を用いて説明する。
【００３３】
まず、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドがコンパイル又はリンクのためのコマンド（すなわち「ｆｃｃ」）であるか判定する（図８：ステップＳ３１）。
【００３４】
処理対象のコマンドがコンパイル又はリンクのためのコマンドではない場合（ステップＳ３１：Ｎｏルート）、ＬＴＯオブジェクト抽出部１０は、リンクコマンドではないことを表す値を返り値として返す（ステップＳ３３）。そして処理は呼び出し元に戻る。
【００３５】
一方、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドがコンパイル又はリンクのためのコマンドである場合（ステップＳ３１：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドにオプション「−ｃ」が付加されているか判定する（ステップＳ３５）。
【００３６】
処理対象のコマンドにオプション「−ｃ」が付加されている場合（ステップＳ３５：Ｙｅｓルート）、処理対象のコマンドはコンパイルコマンドであるので、処理はステップＳ３３に移行する。
【００３７】
一方、処理対象のコマンドにオプション「−ｃ」が付加されていない場合（ステップＳ３５：Ｎｏルート）、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドの入力ファイルの拡張子が「．ｏ」であるか判定する（ステップＳ３７）。
【００３８】
処理対象のコマンドの入力ファイルの拡張子が「．ｏ」ではない場合（ステップＳ３７：Ｎｏルート）、処理はステップＳ３３に移行する。
【００３９】
一方、処理対象のコマンドの入力ファイルの拡張子が「．ｏ」である場合（ステップＳ３７：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドがリンクコマンドであることを表す値を返り値として返す（ステップＳ３９）。そして処理は呼び出し元に戻る。
【００４０】
以上のような処理を実行すれば、処理対象のコマンドがリンクコマンドであるか否かを適切に判定できるようになる。
【００４１】
図５の説明に戻り、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドがリンクコマンドであると判定されたか判定する（ステップＳ９）。リンクコマンドではないと判定された場合（ステップＳ９：Ｎｏルート）、ステップＳ３の処理に戻る。
【００４２】
一方、リンクコマンドであると判定された場合（ステップＳ９：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドにリンク時最適化オプションが付加されているか判定する（ステップＳ１１）。
【００４３】
処理対象のコマンドにリンク時最適化オプションが付加されていない場合（ステップＳ１１：Ｎｏルート）、ステップＳ３の処理に戻る。一方、処理対象のコマンドにリンク時最適化オプションが付加されている場合（ステップＳ１１：Ｙｅｓルート）、処理は端子Ａを介して図９のステップＳ１３に移行する。
【００４４】
図９の説明に移行し、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドの入力引数のオブジェクトファイル名のうち未処理のオブジェクトファイル名を１つ特定する（図９：ステップＳ１３）。以下では、ステップＳ１３において特定されたオブジェクトファイル名を有するオブジェクトファイルを処理対象のオブジェクトファイルと呼ぶ。
【００４５】
ＬＴＯオブジェクト抽出部１０は、処理対象のオブジェクトファイルが、常にリンク時最適化が行われるオブジェクトファイルとしてデータ格納部１３に登録済みであるか判定する（ステップＳ１５）。
【００４６】
処理対象のオブジェクトファイルが、常にリンク時最適化が行われるオブジェクトファイルとしてデータ格納部１３に登録済みである場合（ステップＳ１５：Ｙｅｓルート）、新たに登録をしなくてもよいので、処理はステップＳ２７に移行する。
【００４７】
一方、処理対象のオブジェクトファイルが、常にリンク時最適化が行われるオブジェクトファイルとしてデータ格納部１３に登録済みではない場合（ステップＳ１５：Ｎｏルート）、ＬＴＯオブジェクト抽出部１０は、コンパイルコマンドの特定処理を実行する（ステップＳ１７）。コンパイルコマンドの特定処理については、図１０を用いて説明する。
【００４８】
まず、ＬＴＯオブジェクト抽出部１０は、ｍａｋｅｆｉｌｅコマンド列に未処理のコマンド列が有るか判定する（図１０：ステップＳ４１）。未処理のコマンド列が無い場合（ステップＳ４１：Ｎｏルート）、処理は呼び出し元に戻る。
【００４９】
一方、ｍａｋｅｆｉｌｅコマンド列に未処理のコマンド列が有る場合（ステップＳ４１：Ｙｅｓルート）ＬＴＯオブジェクト抽出部１０は、ｍａｋｅｆｉｌｅコマンド列から未処理のコマンド（以下、コンパイルコマンドの特定処理において「処理対象のコマンド」と呼ぶ）を１つ特定する（ステップＳ４３）。
【００５０】
ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドがコンパイル又はリンクのためのコマンド（すなわち、「ｆｃｃ」）であるか判定する（ステップＳ４５）。
【００５１】
処理対象のコマンドがコンパイル又はリンクのためのコマンドではない場合（ステップＳ４５：Ｎｏルート）、処理はステップＳ４１に戻る。
【００５２】
一方、処理対象のコマンドがコンパイル又はリンクのためのコマンドである場合（ステップＳ４５：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドにオプション「−ｃ」が付加されているか判定する（ステップＳ４７）。
【００５３】
処理対象のコマンドにオプション「−ｃ」が付加されていない場合（ステップＳ４７：Ｎｏルート）、処理対象のコマンドはコンパイルコマンドではないので、処理はステップＳ４１に戻る。
【００５４】
処理対象のコマンドにオプション「−ｃ」が付加されている場合（ステップＳ４７：Ｙｅｓルート）、以下の処理が実行される。具体的には、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドの入力ファイル名の拡張子が所定の拡張子（例えば「．ｃ」）であるか判定する（ステップＳ４９）。
【００５５】
処理対象のコマンドの入力ファイル名の拡張子が所定の拡張子ではない（ステップＳ４９：Ｎｏルート）、処理はステップＳ４１に戻る。
【００５６】
一方、処理対象のコマンドの入力ファイル名の拡張子が所定の拡張子である（ステップＳ４９：Ｙｅｓルート）、以下の処理が実行される。具体的には、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドにおいてオプション「−ｏ」に続けて処理対象のオブジェクトファイル名が指定されているか判定する（ステップＳ５１）。
【００５７】
処理対象のコマンドにおいてオプション「−ｏ」に続けて処理対象のオブジェクトファイル名が指定されている場合（ステップＳ５１：Ｙｅｓルート）、処理対象のコマンドはコンパイルコマンドであるので、処理はステップＳ５５に移行する。
【００５８】
一方、処理対象のコマンドにおいてオプション「−ｏ」に続けて処理対象のオブジェクトファイル名が指定されていない場合（ステップＳ５１：Ｎｏルート）、以下の処理が実行される。具体的には、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドの入力ファイル名の拡張子以外の部分と、処理対象のオブジェクトファイル名の拡張子以外の部分とが一致するか判定する（ステップＳ５３）。
【００５９】
処理対象のコマンドの入力ファイル名の拡張子以外の部分と、処理対象のオブジェクトファイル名の拡張子以外の部分とが一致しない場合（ステップＳ５３：Ｎｏルート）、処理はステップＳ４１に戻る。
【００６０】
一方、処理対象のコマンドの入力ファイル名の拡張子以外の部分と、処理対象のオブジェクトファイル名の拡張子以外の部分とが一致する場合（ステップＳ５３：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドを返り値として返す（ステップＳ５５）。そして処理は呼び出し元に戻る。
【００６１】
以上のような処理を実行すれば、処理対象のオブジェクトファイル名を有するオブジェクトファイルを出力するためのコンパイルコマンドを特定できるようになる。
【００６２】
図９の説明に戻り、ＬＴＯオブジェクト抽出部１０は、ステップＳ１７において特定されたコンパイルコマンドにリンク時最適化オプションが付加されているか判定する（ステップＳ１９）。
【００６３】
ステップＳ１７において特定されたコンパイルコマンドにリンク時最適化オプションが付加されていない場合（ステップＳ１９：Ｎｏルート）、リンク時最適化が行われないので、処理はステップＳ２７に移行する。
【００６４】
一方、ステップＳ１７において特定されたコンパイルコマンドにリンク時最適化オプションが付加されている場合（ステップＳ１９：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、リンク時最適化についての判定処理を実行する（ステップＳ２１）。リンク時最適化についての判定処理については、図１１を用いて説明する。
【００６５】
まず、ＬＴＯオブジェクト抽出部１０は、ｍａｋｅｆｉｌｅコマンド列に未処理のコマンドが有るか判定する（図１１：ステップＳ６１）。
【００６６】
ｍａｋｅｆｉｌｅコマンド列に未処理のコマンドが無い場合（ステップＳ６１：Ｎｏルート）、ＬＴＯオブジェクト抽出部１０は、「Ｙｅｓ」（すなわち、常にリンク時最適化が行われる）を返り値として返す（ステップＳ６３）。そして処理は呼び出し元に戻る。
【００６７】
一方、ｍａｋｅｆｉｌｅコマンド列に未処理のコマンドが有る場合（ステップＳ６１：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、ｍａｋｅｆｉｌｅコマンド列から未処理のコマンド（以下、リンク時最適化についての判定処理において「処理対象のコマンド」と呼ぶ）を１つ特定する（ステップＳ６５）。
【００６８】
ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドがコンパイル又はリンクのためのコマンドであるか判定する（ステップＳ６７）。
【００６９】
処理対象のコマンドがコンパイル又はリンクのためのコマンドではない場合（ステップＳ６７：Ｎｏルート）、処理はステップＳ６１に戻る。
【００７０】
一方、処理対象のコマンドがコンパイル又はリンクのためのコマンドである場合（ステップＳ６７：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドにオプション「−ｃ」が付加されているか判定する（ステップＳ６９）。
【００７１】
処理対象のコマンドにオプション「−ｃ」が付加されている場合（ステップＳ６９：Ｙｅｓルート）、処理対象のコマンドはコンパイルコマンドであるので、処理はステップＳ６１に戻る。
【００７２】
一方、処理対象のコマンドにオプション「−ｃ」が付加されていない場合（ステップＳ６９：Ｎｏルート）、以下の処理が実行される。具体的には、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンド（すなわち、リンクコマンド）の入力引数に処理対象のオブジェクトファイル名が含まれるか判定する（ステップＳ７１）。
【００７３】
処理対象のコマンドの入力引数に処理対象のオブジェクトファイル名が含まれない場合（ステップＳ７１：Ｎｏルート）、処理はステップＳ６１に戻る。
【００７４】
一方、処理対象のコマンドの入力引数に処理対象のオブジェクトファイル名が含まれる場合（ステップＳ７１：Ｙｅｓルート）、以下の処理が実行される。具体的には、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドにリンク時最適化オプションが付加されているか判定する（ステップＳ７３）。
【００７５】
処理対象のコマンドにリンク時最適化オプションが付加されている場合（ステップＳ７３：Ｙｅｓルート）、処理はステップＳ６１に戻る。
【００７６】
一方、処理対象のコマンドにリンク時最適化オプションが付加されていない場合（ステップＳ７３：Ｎｏルート）、ＬＴＯオブジェクト抽出部１０は、「Ｎｏ」（すなわち、常にリンク時最適化が行われるわけではない）を返り値として返す（ステップＳ７５）。そして処理は呼び出し元に戻る。
【００７７】
以上のような処理を実行すれば、処理対象のオブジェクトファイルは常にリンク時最適化されるか否かを判定することができるようになる。
【００７８】
図９の説明に戻り、ＬＴＯオブジェクト抽出部１０は、ステップＳ２１の処理結果に基づき、処理対象のオブジェクトファイルは常にリンク時最適化されるか判定する（ステップＳ２３）。
【００７９】
処理対象のオブジェクトファイルが常に最適化されるわけではない場合（ステップＳ２３：Ｎｏルート）、処理はステップＳ２７に移行する。
【００８０】
一方、処理対象のオブジェクトファイルは常に最適化される場合（ステップＳ２３：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、以下の処理を実行する。具体的には、ＬＴＯオブジェクト抽出部１０は、ステップＳ１３において特定されたオブジェクトファイル名を常にリンク時最適化が行われるオブジェクトファイルとしてデータ格納部１３に登録する。また、ＬＴＯオブジェクト抽出部１０は、ステップＳ１７において特定されたコンパイルコマンドの入力引数のソースファイル名を、コンパイル（すなわち１パス目のコンパイル）が不要であるソースファイルとしてデータ格納部１３に登録する（ステップＳ２５）。
【００８１】
図１２に、データ格納部１３に格納されるデータの一例を示す。図１２の例では、リンク時最適化が行われるオブジェクトファイル名と、コンパイルが不要であるソースファイル名とが格納される。
【００８２】
ＬＴＯオブジェクト抽出部１０は、未処理のオブジェクトファイル名が有るか判定する（ステップＳ２７）。未処理のオブジェクトファイル名が有る場合（ステップＳ２７：Ｙｅｓルート）、次のオブジェクトファイル名について処理するため、処理はステップＳ１３に戻る。一方、未処理のオブジェクトファイル名が無い場合（ステップＳ２７：Ｎｏルート）、処理は端子Ｂを介して図５のステップＳ３に戻る。
【００８３】
以上のような処理を実行すれば、コンパイルが不要であるソースファイルを特定することができるようになる。
【００８４】
次に、図１３乃至図１６を用いて、コンパイル時の処理について説明する。
【００８５】
まず、図１３及び図１４を用いて、コンパイル判定部１１０が実行する処理について説明する。コンパイル判定部１１０は、データ格納部１３にデータが格納されているか判定する（図１３：ステップＳ８１）。
【００８６】
データ格納部１３にデータが格納されていない場合（ステップＳ８１：Ｎｏルート）、処理は終了する。
【００８７】
データ格納部１３にデータが格納されている場合（ステップＳ８１：Ｙｅｓルート）、コンパイル判定部１１０は、データ格納部１３から未処理のレコードを１つ読み込む。そして、コンパイル判定部１１０は、読み込まれたレコードに含まれる、コンパイルが不要であるソースファイルを特定する（ステップＳ８３）。
【００８８】
コンパイル判定部１１０は、ステップＳ８３において特定されたソースファイルと、コマンドラインにおいて指定された（例えば、操作者から入力を受け付けた）ソースファイルとが一致するか判定する（ステップＳ８５）。
【００８９】
ステップＳ８３において特定されたソースファイルと、コマンドラインにおいて指定されたソースファイルとが一致しない場合（ステップＳ８５：Ｎｏルート）、処理はステップＳ８９に移行する。
【００９０】
一方、ステップＳ８３において特定されたソースファイルと、コマンドラインにおいて指定されたソースファイルとが一致する場合（ステップＳ８５：Ｙｅｓルート）、以下の処理が実行される。具体的には、コンパイル判定部１１０は、１パス目のコンパイルを省略することを表す省略フラグ（ここでは「１」）をメモリにセットする（ステップＳ８７）。
【００９１】
図１４に、メモリにセットされる省略フラグの一例を示す。図１４の例では、ソースファイル名と、１パス目のコンパイルを省略することを表す省略フラグとが格納される。
【００９２】
コンパイル判定部１１０は、データ格納部１３に未処理のレコードが有るか判定する（ステップＳ８９）。未処理のレコードが有る場合（ステップＳ８９：Ｙｅｓルート）、処理はステップＳ８３に戻る。
【００９３】
一方、未処理のレコードが無い場合（ステップＳ８９：Ｎｏルート）、処理は終了する。
【００９４】
図１５を用いて、コンパイル制御部１１１が実行する処理について説明する。コンパイル制御部１１１は、コマンドラインにおいて指定されたソースファイルの各々について、メモリ上に省略フラグがセットされているか判定する（図１５：ステップＳ９１）。
【００９５】
コンパイル制御部１１１は、コマンドラインにおいて指定されたソースファイルのうちメモリ上に省略フラグがセットされているソースファイルについて、以下の処理を実行する。具体的には、コンパイル制御部１１１は、１パス目のコンパイルを省略することを指示するオプションを付加してコンパイラ１４を呼び出す（ステップＳ９３）。そして処理は終了する。
【００９６】
コンパイル制御部１１１は、コマンドラインにおいて指定されたソースファイルのうちメモリ上に省略フラグがセットされていないソースファイルについて、以下の処理を実行する。具体的には、コンパイル制御部１１１は、通常のコンパイルのためにコンパイラ１４を呼び出す（ステップＳ９５）。そして処理は終了する。
【００９７】
図１６を用いて、コンパイラ１４のコンパイル省略部１４１が実行する処理について説明する。コンパイル省略部１４１は、コンパイル制御部１１１から呼び出しされた場合に、呼び出しのコマンドにオブジェクトコードを生成しないことを指示するオプションが付加されているか判定する（図１６：ステップＳ１０１）。
【００９８】
オブジェクトコードを生成しないことを指示するオプションが付加されていない場合（ステップＳ１０１：Ｎｏルート）、コンパイラ１４は、呼び出し時にコンパイル制御部１１１から指定されたソースファイルに対して通常のコンパイルを実行する（ステップＳ１０７）。そして処理は終了する。
【００９９】
一方、オブジェクトコードを生成しないことを指示するオプションが付加されている場合（ステップＳ１０１：Ｙｅｓルート）、以下の処理が実行される。具体的には、コンパイル省略部１４１は、呼び出し時にコンパイル制御部１１１から指定されたソースファイルについてオブジェクトコードの生成を行わずにオブジェクトファイルを生成する（ステップＳ１０３）。
【０１００】
コンパイル省略部１４１は、ステップＳ１０３において生成されたオブジェクトファイルにソースプログラム情報を埋め込む（ステップＳ１０５）。そして処理は終了する。
【０１０１】
以上のような処理を実行すれば、オブジェクトコードの生成を省略することができるので、コンパイラ１４の処理時間を短縮し、ひいては実行可能ファイルを生成するまでに要する時間を短縮することができるようになる。
【０１０２】
次に、図１７を用いて、リンク時の処理について説明する。まず、ＣＦＯ実行部１５は、コマンドラインにおいて指定された各オブジェクトファイルのソースプログラム情報から、ファイル間最適化中間ファイルを生成する（図１７：ステップＳ１１１）。
【０１０３】
コンパイラ１４は、ステップＳ１１１において生成された各ファイル間最適化中間ファイルから、ファイル間最適化オブジェクトファイルを生成する（ステップＳ１１３）。ステップＳ１１３の処理は通常のコンパイルである。
【０１０４】
リンカ１６は、ステップＳ１１３において生成されたファイル間最適化オブジェクトファイルをリンクすることで実行可能ファイルを生成する（ステップＳ１１５）。そして処理は終了する。
【０１０５】
以上のような処理を実行すれば、少なくとも一部のソースファイルについてコンパイル時におけるオブジェクトコードの生成（すなわち、１パス目のコンパイル）を省略した場合であっても、実行可能ファイルを生成することができるようになる。
【０１０６】
図１８及び図１９を用いて、第１の実施の形態によるコンパイル省略について具体的に説明する。
【０１０７】
ここでは、図１８の（１）乃至（９）に示すコマンドを含むコマンド列を例とする。そして、図１９に、図１８に示した各コマンドの実行時においてオブジェクトコードが生成されるソースファイルの比較を示す。
【０１０８】
「ｘ．ｅｘｅ」については、通常のコンパイル及びリンクの場合、「ａ．ｃ」、「ｂ．ｃ」、「ａ．ｃ」に対応するファイル間最適化中間プログラム及び「ｂ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。一方、第１の実施の形態によれば、「ａ．ｃ」に対応するファイル間最適化中間プログラム及び「ｂ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。よって、数が４から２に減少した。
【０１０９】
「ｙ．ｅｘｅ」については、通常のコンパイル及びリンクの場合、「ａ．ｃ」、「ｃ．ｃ」、「ａ．ｃ」に対応するファイル間最適化中間プログラム及び「ｃ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。一方、第１の実施の形態によれば、「ａ．ｃ」に対応するファイル間最適化中間プログラム及び「ｃ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。よって、数が４から２に減少した。
【０１１０】
「ｚ．ｅｘｅ」については、通常のコンパイル及びリンクの場合、「ａ．ｃ」、「ｄ．ｃ」及び「ａ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。一方、第１の実施の形態によれば、「ｄ．ｃ」及び「ａ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。よって、数が３から２に減少した。
【０１１１】
「ｗ．ｅｘｅ」については、通常のコンパイル及びリンクの場合、「ｄ．ｃ」及び「ｅ．ｃ」についてオブジェクトコードが生成される。一方、第１の実施の形態によれば、「ｄ．ｃ」及び「ｅ．ｃ」についてオブジェクトコードが生成される。よって、両者の数は変わらない。
【０１１２】
ここで、図６に示したデータがデータ格納部１３に格納されているケースについて、第１の実施の形態の動作をより具体的に説明する。
【０１１３】
まず、ドライランによりｍａｋｅｆｉｌｅコマンド列が生成される。コンパイル又はリンクコマンド「ｆｃｃ」が検出され、オプション「−ｃ」が付加されておらず且つ入力ファイルの拡張子が「．ｏ」であれば、そのコマンドはリンクコマンドである。そのリンクコマンドに対しては、以下のような処理が実行される。
【０１１４】
まず、リンクコマンド「ｆｃｃ  ａ．ｏ  ｂ．ｏ  −ｏ  ｘ．ｅｘｅ  −Ｋｌｔｏ」について、オプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。
【０１１５】
リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」及び「ｂ．ｏ」のうち「ａ．ｏ」は、常にリンク時最適化が行われるオブジェクトファイルとしてデータ格納部１３に登録されていない。オプション「−ｃ」が付加されており、入力ファイルの拡張子が言語仕様で定められており、且つ「ａ．ｏ」がオプション「−ｏ」に続けて出力ファイルとして指定されているかまたは入力ファイルの拡張子と出力ファイルの拡張子とだけが異なるコンパイルコマンドとして、「ｆｃｃ  ａ．ｃ  −ｏ  ａ．ｏ  −ｃ  −Ｋｌｔｏ」が検出される。ここで、コンパイルコマンドにオプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。続いて、「ａ．ｏ」は常にリンク時最適化が行われてリンクされていることが以下のように判定される。具体的には、ｍａｋｅｆｉｌｅコマンド列には「ｆｃｃ  ａ．ｏ  ｂ．ｏ  −ｏ  ｘ．ｅｘｅ  −Ｋｌｔｏ」と「ｆｃｃ  ａ．ｏ  ｃ．ｏ  −ｏ  ｙ．ｅｘｅ  −Ｋｌｔｏ」と「ｆｃｃ  ａ．ｏ  ｄ．ｏ  −ｏ  ｚ．ｅｘｅ  −Ｋｌｔｏ」とが「ａ．ｏ」を入力に含むコマンドとして存在する。そして、「ａ．ｏ」が入力であるコマンド「ｆｃｃ」に対してはオプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」の文字列比較により確認される。それを以って、「ａ．ｏ」が常にリンク時に最適化されていると判定される。そのため、データ格納部１３に新規レコードが作成されて「ａ．ｏ」が常にリンク時に最適化されるオブジェクトファイルとして登録される。また、「ａ．ｏ」が出力ファイルとして指定されているコンパイルコマンドの入力引数「ａ．ｃ」が、コンパイルが不要であるソースファイルとして登録される。
【０１１６】
また、リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」及び「ｂ．ｏ」のうち「ｂ．ｏ」も、常にリンク時最適化が行われるオブジェクトファイルとしてデータ格納部１３に登録されていない。オプション「−ｃ」が付加されており、入力ファイルの拡張子が言語仕様で定められており、且つ「ｂ．ｏ」がオプション「−ｏ」に続けて出力ファイルとして指定されているか又は入力ファイルの拡張子と出力ファイルの拡張子とだけが異なるコンパイルコマンドとして、「ｆｃｃ  ｂ．ｃ  −ｏ  ｂ．ｏ  −ｃ  −Ｋｌｔｏ」が検出される。ここで、コンパイルコマンドにオプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。また、入力ファイルが「ｂ．ｏ」であるリンクコマンドとして、「ｆｃｃ  ａ．ｏ  ｂ．ｏ  −ｏ  ｘ．ｅｘｅ  −Ｋｌｔｏ」が検出される。オプション「−Ｋｌｔｏ」が付加されてリンク時最適化されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。そのため、データ格納部１３に新規レコードが生成されて「ｂ．ｏ」が常にリンク時に最適化されるオブジェクトファイルとして登録される。また、「ｂ．ｏ」が出力ファイルとして指定されているコンパイルコマンドの入力引数の「ｂ．ｃ」が、コンパイルが不要であるソースファイルとして登録される。
【０１１７】
次にリンクコマンド「ｆｃｃ  ａ．ｏ  ｃ．ｏ  −ｏ  ｙ．ｅｘｅ  −Ｋｌｔｏ」について、オプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。
【０１１８】
リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」と「ｃ．ｏ」のうち「ａ．ｏ」は、常にリンク時最適化が行われるオブジェクトファイルとしてとしてデータ格納部１３に登録済みである。一方、「ｃ．ｏ」は常にリンク時最適化が行われるオブジェクトファイルとしてデータ格納部１３に登録されていない。「ｃ．ｏ」について、オプション「−ｃ」が付加されており、入力ファイルの拡張子が言語仕様で定められており、且つ「ｃ．ｏ」がオプション「−ｏ」に続けて出力ファイルとして指定されているか又は入力ファイルの拡張子と出力ファイルの拡張子とだけが異なるコンパイルコマンドとして、「ｆｃｃ  ｃ．ｃ  −ｏ  ｃ．ｏ  −ｃ  −Ｋｌｔｏ」が検出される。コンパイルコマンドにオプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。「ｃ．ｏ」が入力ファイルであるリンクコマンドとして、「ｆｃｃ  ａ．ｏ  ｃ．ｏ  −ｏ  ｙ．ｅｘｅ  −Ｋｌｔｏ」が検出され、オプション「−Ｋｌｔｏ」が付加されておりリンク時に最適化が実行されることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。そのため、データ格納部１３に新規レコードが作成され、「ｃ．ｏ」が常にリンク時に最適化が実行されるオブジェクトファイルとして登録される。また、「ｃ．ｏ」がオプション「−ｏ」に続けて出力ファイルとして指定されているコンパイルコマンドの入力引数の「ｃ．ｃ」が、コンパイルが不要であるソースファイルとして登録される。
【０１１９】
次にリンクコマンド「ｆｃｃ  ａ．ｏ  ｄ．ｏ  −ｏ  ｚ．ｅｘｅ  −Ｋｌｔｏ」について、オプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」と「ｄ．ｏ」のうち、「ａ．ｏ」はデータ格納部１３に常にリンク時に最適化が実行されるオブジェクトファイルとして登録済みである。一方、「ｄ．ｏ」は常にリンク時に最適化が実行されるオブジェクトファイルとしてデータ格納部１３に登録されていない。「ｄ．ｏ」について、オプション「−ｃ」が付加されており、入力ファイルの拡張子が言語仕様で定められており、且つ「ｄ．ｏ」がオプション「−ｏ」に続けて出力ファイルとして指定されているか又は入力ファイルの拡張子と出力ファイルの拡張子とだけが異なるコンパイルコマンドとして、「ｆｃｃ  ｄ．ｃ  −ｏ  ｄ．ｏ  −ｃ」が検出される。しかし、コンパイルコマンドにオプション「−Ｋｌｔｏ」が付加されていない。そのため、このリンクコマンドの入力引数のオブジェクトファイルについては、データ格納部１３にレコードは生成されない。
【０１２０】
最後に、リンクコマンド「ｆｃｃ  ｄ．ｏ  ｅ．ｏ  −ｏ  ｗ．ｅｘｅ」について、オプション「−Ｋｌｔｏ」が付加されていないことがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。そのため、このリンクコマンドに対しては処理が行われない。
【０１２１】
以上のようにして、データ格納部１３にレコードが蓄積される。
【０１２２】
続いて、コンパイル時の処理及びリンク時の処理を説明する。
【０１２３】
コンパイル時、コマンドラインで指定されたソースファイル名がコンパイルが不要であるソースファイルとしてデータ格納部１３に登録されている場合、メモリ上に省略フラグがセットされる。例えば、「ａ．ｃ」のコンパイル時には「ａ．ｃ」はコンパイルが不要であるソースファイルとして省略フラグがセットされる。「ｄ．ｃ」のコンパイル時には省略フラグはセットされない。コンパイル時、メモリ上に省略フラグがセットされたソースファイルのコンパイルは省略される。例えば、コンパイルが不要であるソースファイルが「ａ．ｃ」である場合、「ａ．ｃ」に対するオブジェクトコードの生成は行われず、「ａ．ｃ」に対応するソースプログラム情報がオブジェクトファイル「ａ．ｏ」に埋め込まれる。
【０１２４】
リンク時、オブジェクトファイルからソースプログラム情報が取り出され、ファイル間最適化が行われた後、コンパイル及びリンクが実行されて実行可能ファイルが生成される。
【０１２５】
［実施の形態２］
第１の実施の形態においては、ファイル間最適化がリンク時に実行されることを前提としてオブジェクトコードの生成が省略される。以下で説明する第２の実施の形態においては、ファイル間最適化をコンパイル時に実行しつつオブジェクトコードの生成が省略される。
【０１２６】
図２０に、第２の実施の形態における情報処理装置１の機能ブロック図を示す。情報処理装置１は、ＬＴＯオブジェクト抽出部１０と、コンパイラドライバ１１と、実行ルール格納部１２と、データ格納部１３と、コンパイラ１４と、ＣＦＯ実行部１５と、リンカ１６と、入力ツール１７とを含む。コンパイラドライバ１１は、コンパイル判定部１１０と、コンパイル制御部１１１と、ＣＦＯ判定部１１２と、ＣＦＯ制御部１１３とを含む。コンパイラ１４は、コンパイル省略部１４１を含む。
【０１２７】
ＣＦＯ判定部１１２及びＣＦＯ制御部１１３以外の要素については第１の実施の形態の説明のとおりである。ＣＦＯ判定部１１２は、オブジェクトファイルのリンク時にファイル間最適化を実行するか判定する処理を実行する。ＣＦＯ制御部１１３は、ＣＦＯ判定部１１２の判定結果に従いファイル間最適化の実行を制御する。
【０１２８】
図２１及び図２２を用いて、第２の実施の形態の情報処理装置１の動作の概要を説明する。
【０１２９】
図２１を用いて、コンパイルについて説明する。第２の実施の形態においては、コンパイル時に一部のソースファイルについてファイル間最適化中間ファイルが生成され、さらに、ファイル間最適化中間ファイルのコンパイルによってファイル間最適化オブジェクトファイルが生成される。コンパイル時にファイル間最適化オブジェクトファイルが生成されたソースファイルについては、リンク時にコンパイルは実行されない。これに対し、コンパイル時にファイル間最適化オブジェクトファイルが生成されなかったソースファイルについては、ファイル間最適化によってファイル間最適化中間プログラムが生成され、また、コンパイルによりオブジェクトコードが生成される。
【０１３０】
図２２を用いて、リンクについて説明する。第２の実施の形態においては、コンパイル時にファイル間最適化オブジェクトファイルが生成されなかったソースファイルのファイル間最適化中間ファイルに対してコンパイルが実行される。そして、コンパイルの実行結果であるファイル間最適化オブジェクトファイルと、コンパイル時に生成されたファイル間最適化オブジェクトファイルとをリンカ１６がリンクすることで実行可能ファイルが生成される。
【０１３１】
図２３乃至図３４を用いて、第２の実施の形態における情報処理装置１の動作をより詳細に説明する。
【０１３２】
まず、図２３乃至図２６を用いて、前処理について説明する。情報処理装置１の入力ツール１７は、実行ルール格納部１２に格納されているｍａｋｅｆｉｌｅのデータに基づき、コマンドラインにおいて指定されたｍａｋｅコマンドのドライランを実行し、ｍａｋｅｆｉｌｅコマンド列を生成する（図２３：ステップＳ１２１）。
【０１３３】
ＬＴＯオブジェクト抽出部１０は、ステップＳ１２１において生成したｍａｋｅｆｉｌｅコマンド列に未処理のコマンドが有るか判定する（ステップＳ１２３）。
【０１３４】
未処理のコマンドが無い場合（ステップＳ１２３：Ｎｏルート）、処理は終了する。一方、未処理のコマンドが有る場合（ステップＳ１２３：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、ｍａｋｅｆｉｌｅコマンド列から未処理のコマンド（以下、処理対象のコマンドと呼ぶ）を１つ特定する（ステップＳ１２５）。
【０１３５】
ＬＴＯオブジェクト抽出部１０は、リンクコマンドについての判定処理を実行する（ステップＳ１２７）。リンクコマンドについての判定処理は図８を用いて説明したとおりであるので、ここでは説明を省略する。
【０１３６】
ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドがリンクコマンドであると判定されたか判定する（ステップＳ１２９）。リンクコマンドではないと判定された場合（ステップＳ１２９：Ｎｏルート）、ステップＳ１２３の処理に戻る。
【０１３７】
一方、リンクコマンドであると判定された場合（ステップＳ１２９：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドにリンク時最適化オプションが付加されているか判定する（ステップＳ１３１）。
【０１３８】
処理対象のコマンドにリンク時最適化オプションが付加されていない場合（ステップＳ１３１：Ｎｏルート）、ステップＳ１２３の処理に戻る。一方、処理対象のコマンドにリンク時最適化オプションが付加されている場合（ステップＳ１３１：Ｙｅｓルート）、処理は端子Ｃを介して図２４のステップＳ１３３に移行する。
【０１３９】
図２４の説明に移行し、ＬＴＯオブジェクト抽出部１０は、処理対象のコマンドの入力引数のオブジェクトファイル名のうち未処理のオブジェクトファイル名を１つ特定する（図２４：ステップＳ１３３）。以下では、ステップＳ１３３において特定されたオブジェクトファイル名を有するオブジェクトファイルを処理対象のオブジェクトファイルと呼ぶ。
【０１４０】
ＬＴＯオブジェクト抽出部１０は、コンパイルコマンドの特定処理を実行する（ステップＳ１３５）。コンパイルコマンドの特定処理は図１０を用いて説明したとおりであるので、ここでは説明を省略する。
【０１４１】
ＬＴＯオブジェクト抽出部１０は、ステップＳ１３５において特定されたコンパイルコマンドにリンク時最適化オプションが付加されているか判定する（ステップＳ１３７）。
【０１４２】
ステップＳ１３５において特定されたコンパイルコマンドにリンク時最適化オプションが付加されていない場合（ステップＳ１３７：Ｎｏルート）、リンク時最適化が行われないので、処理はステップＳ１４９に移行する。
【０１４３】
一方、ステップＳ１３５において特定されたコンパイルコマンドにリンク時最適化オプションが付加されている場合（ステップＳ１３７：Ｙｅｓルート）、以下の処理が実行される。具体的には、ＬＴＯオブジェクト抽出部１０は、ステップＳ１３５において特定されたコンパイルコマンドの入力ファイルとして指定されているソースファイル名をリストに登録する（ステップＳ１３９）。
【０１４４】
図２５に、リストに登録されるデータの一例を示す。図２５の例では、ソースファイル名が登録される。
【０１４５】
ＬＴＯオブジェクト抽出部１０は、リンク時最適化についての判定処理を実行する（ステップＳ１４１）。リンク時最適化についての判定処理については、図１１を用いて説明したとおりであるので、ここでは説明を省略する。
【０１４６】
ＬＴＯオブジェクト抽出部１０は、処理対象のオブジェクトファイルは常にリンク時最適化されるか判定する（ステップＳ１４３）。
【０１４７】
処理対象のオブジェクトファイルが常に最適化されるわけではない場合（ステップＳ１４３：Ｎｏルート）、処理はステップＳ１４９に移行する。
【０１４８】
一方、処理対象のオブジェクトファイルは常に最適化される場合（ステップＳ１４３：Ｙｅｓルート）、ＬＴＯオブジェクト抽出部１０は、以下の処理を実行する。具体的には、ＬＴＯオブジェクト抽出部１０は、ステップＳ１３３において特定されたオブジェクトファイル名を有するオブジェクトファイルを常にリンク時最適化が行われるオブジェクトファイルとしてデータ格納部１３に登録する。また、ＬＴＯオブジェクト抽出部１０は、ステップＳ１３５において特定されたコンパイルコマンドの入力引数のソースファイル名を、コンパイル（すなわち１パス目のコンパイル）が不要であるソースファイルとしてデータ格納部１３に登録する（ステップＳ１４５）。
【０１４９】
ＬＴＯオブジェクト抽出部１０は、ステップＳ１４５においてデータが登録されたレコードの位置を記憶し（ステップＳ１４７）、未処理のオブジェクトファイル名が有るか判定する（ステップＳ１４９）。
【０１５０】
未処理のオブジェクトファイル名が有る場合（ステップＳ１４９：Ｙｅｓルート）、次のオブジェクトファイル名について処理するため、処理はステップＳ１３３に戻る。
【０１５１】
一方、未処理のオブジェクトファイル名が無い場合（ステップＳ１４９：Ｎｏルート）、以下の処理が実行される。具体的には、ＬＴＯオブジェクト抽出部１０は、リストに登録されたソースファイル名を、ステップＳ１４７において位置が記憶された各レコードに、ファイル間最適化の対象であるソースファイルとして登録する（ステップＳ１５１）。処理は端子Ｄを介して図２３のステップＳ１２３に戻る。
【０１５２】
図２６に、データ格納部１３に格納されるデータの一例を示す。図２６の例では、リンク時最適化が行われるオブジェクトファイル名と、コンパイルが不要であるソースファイル名と、ファイル間最適化の対象であるソースファイル名と、リンク時にファイル間最適化を実行するか否かを表す実行フラグとが格納される。ステップＳ１５１の時点においては、実行フラグの値は「０」に設定される。
【０１５３】
以上のような処理を実行すれば、コンパイルが不要であるソースファイルを特定することができるようになる。また、ファイル間最適化が行われるソースファイルであるか否かを後の処理で確認できるようになる。
【０１５４】
次に、図２７乃至図３１を用いて、コンパイル時の処理について説明する。
【０１５５】
まず、図２７乃至図３０を用いて、コンパイル判定部１１０が実行する処理について説明する。コンパイル判定部１１０は、データ格納部１３にデータが格納されているか判定する（図２７：ステップＳ１６１）。
【０１５６】
データ格納部１３にデータが格納されていない場合（ステップＳ１６１：Ｎｏルート）、処理は終了する。
【０１５７】
データ格納部１３にデータが格納されている場合（ステップＳ１６１：Ｙｅｓルート）、コンパイル判定部１１０は、データ格納部１３から未処理のレコードを１つ読み込む。そして、コンパイル判定部１１０は、読み込まれたレコードに含まれる、コンパイルが不要であるソースファイル（以下、処理対象のソースファイルと呼ぶ）を特定する（ステップＳ１６３）。
【０１５８】
コンパイル判定部１１０は、処理対象のソースファイルと、コマンドラインにおいて指定された（例えば、操作者から入力を受け付けた）ソースファイルとが一致するか判定する（ステップＳ１６５）。
【０１５９】
処理対象のソースファイルと、コマンドラインにおいて指定されたソースファイルとが一致しない場合（ステップＳ１６５：Ｎｏルート）、以下の処理が実行される。具体的には、コンパイル判定部１１０は、未処理のレコードが有るか判定する（ステップＳ１６７）。
【０１６０】
未処理のレコードが有る場合（ステップＳ１６７：Ｙｅｓルート）、処理はステップＳ１６３に戻る。一方、未処理のレコードが無い場合（ステップＳ１６７：Ｎｏルート）、処理は終了する。
【０１６１】
一方、処理対象のソースファイルと、コマンドラインにおいて指定されたソースファイルとが一致する場合（ステップＳ１６５：Ｙｅｓルート）、以下の処理が実行される。具体的には、コンパイル判定部１１０は、レコード数についての判定処理を実行する（ステップＳ１６９）。レコード数についての判定処理については、図２８を用いて説明する。
【０１６２】
まず、コンパイル判定部１１０は、レコード数を計数するためのカウンタの値を０に設定する（図２８：ステップＳ１８３）。
【０１６３】
コンパイル判定部１１０は、データ格納部１３から未処理のレコードを１つ特定する（ステップＳ１８５）。
【０１６４】
コンパイル判定部１１０は、処理対象のソースファイルは、ステップＳ１８５において特定されたレコードに含まれる、コンパイルが不要であるソースファイルと一致するか判定する（ステップＳ１８７）。
【０１６５】
処理対象のソースファイルはコンパイルが不要であるソースファイルと一致しない場合（ステップＳ１８７：Ｎｏルート）、処理はステップＳ１８５に戻る。
【０１６６】
一方、処理対象のソースファイルはコンパイルが不要であるソースファイルと一致する場合（ステップＳ１８７：Ｙｅｓルート）、コンパイル判定部１１０は、カウンタの値を１インクリメントする（ステップＳ１８９）。
【０１６７】
コンパイル判定部１１０は、データ格納部１３に未処理のレコードが有るか判定する（ステップＳ１９１）。未処理のレコードが有る場合（ステップＳ１９１：Ｙｅｓルート）、処理はステップＳ１８５に戻る。
【０１６８】
一方、未処理のレコードが無い場合（ステップＳ１９１：Ｎｏルート）、コンパイル判定部１１０は、カウンタの値が１であるか判定する（ステップＳ１９３）。
【０１６９】
カウンタの値が１である場合（ステップＳ１９３：Ｙｅｓルート）、コンパイル判定部１１０は、処理対象のソースファイルがコンパイルが不要であるソースファイルとして登録されているレコードから、ファイル間最適化の対象であるソースファイル名をデータ格納部１３から読み出す。そして、コンパイル判定部１１０は、読み出されたソースファイル名を返り値として返す（ステップＳ１９５）。そして処理は呼び出し元に戻る。
【０１７０】
一方、カウンタの値が１ではない場合（ステップＳ１９３：Ｎｏルート）、コンパイル判定部１１０は、処理対象のソースファイルに対しては複数ケースにおいてファイル間最適化が実行されることを表す値を返り値として返す（ステップＳ１９７）。そして処理は呼び出し元に戻る。
【０１７１】
以上のような処理を実行すれば、処理対象のソースファイルがコンパイルが不要であるソースファイルとして登録されているレコードの数が１であるか否かを判定できるようになる。
【０１７２】
図２７の説明に戻り、コンパイル判定部１１０は、ファイル間最適化が行われるレコードの数は１であるか判定する（ステップＳ１７１）。
【０１７３】
ファイル間最適化が行われるレコードの数は１ではない場合（ステップＳ１７１：Ｎｏルート）、処理は終了する。
【０１７４】
一方、ファイル間最適化が行われるレコードの数は１である場合（ステップＳ１７１：Ｙｅｓルート）、コンパイル判定部１１０は、ファイル間最適化についての判定処理を実行する（ステップＳ１７３）。ファイル間最適化についての判定処理については、図２９を用いて説明する。
【０１７５】
まず、コンパイル判定部１１０は、データ格納部１３から未処理のレコードを１つ特定する（図２９：ステップＳ２０３）。
【０１７６】
コンパイル判定部１１０は、ステップＳ１９５において読み出されたソースファイル名と、ステップＳ２０３において特定されたレコードにおいてファイル間最適化の対象として登録されているソースファイル名とが一致するか判定する（ステップＳ２０５）。
【０１７７】
ステップＳ１９５において読み出されたソースファイル名と、ステップＳ２０３において特定されたレコードにおいてファイル間最適化の対象として登録されているソースファイル名とが一致しない場合（ステップＳ２０５：Ｎｏルート）、処理はステップＳ２０３に戻る。
【０１７８】
一方、ステップＳ１９５において読み出されたソースファイル名と、ステップＳ２０３において特定されたレコードにおいてファイル間最適化の対象として登録されているソースファイル名とが一致する場合（ステップＳ２０５：Ｙｅｓルート）、以下の処理が実行される。具体的には、コンパイル判定部１１０は、ステップＳ２０３において特定されたレコードの実行フラグは「１」であるか判定する（ステップＳ２０７）。
【０１７９】
ステップＳ２０３において特定されたレコードの実行フラグは「１」ではない（すなわち「０」である）場合（ステップＳ２０７：Ｎｏルート）、コンパイル判定部１１０は、ファイル間最適化を未実行であることを表す値を返り値として返す（ステップＳ２０９）。そして処理は呼び出し元に戻る。
【０１８０】
一方、ステップＳ２０３において特定されたレコードの実行フラグは「１」である場合（ステップＳ２０７：Ｙｅｓルート）、コンパイル判定部１１０は、未処理のレコードが有るか判定する（ステップＳ２１１）。
【０１８１】
未処理のレコードが有る場合（ステップＳ２１１：Ｙｅｓルート）、処理はステップＳ２０３に戻る。一方、未処理のレコードが無い場合（ステップＳ２１１：Ｎｏルート）、以下の処理を実行される。具体的には、コンパイル判定部１１０は、ファイル間最適化を実行済みであることを表す値を返り値として返す（ステップＳ２１３）。そして処理は呼び出し元に戻る。
【０１８２】
以上のような処理を実行すれば、ファイル間最適化を実行済みであるか否かを判定できるようになる。
【０１８３】
図２７の説明に戻り、コンパイル判定部１１０は、ステップＳ１７３の処理結果に基づき、処理対象のソースファイルに対してファイル間最適化を実行済みであるか判定する（ステップＳ１７５）。
【０１８４】
処理対象のソースファイルに対してファイル間最適化を実行済みである場合（ステップＳ１７５：Ｙｅｓルート）、処理は終了する。
【０１８５】
一方、処理対象のソースファイルに対してファイル間最適化を実行済みではない場合（ステップＳ１７５：Ｎｏルート）、以下の処理が実行される。具体的には、コンパイル判定部１１０は、処理対象のソースファイルのソースファイル名をメモリに格納する。また、コンパイル判定部１１０は、処理対象のソースファイルについて、データ格納部１３に格納されている実行フラグを「１」に設定する（ステップＳ１７７）。そして処理は終了する。
【０１８６】
図３０に、ステップＳ１７７の処理が終了した時点においてデータ格納部１３に格納されているデータの一例を示す。図３０の例では、リンク時最適化が行われるオブジェクトファイル名と、コンパイルが不要であるソースファイル名と、ファイル間最適化の対象であるソースファイル名と、リンク時にファイル間最適化を実行するか否かを表す実行フラグとが格納される。図３０の例では、実行フラグ「１」が設定された、コンパイルが不要なソースファイル「ｂ．ｃ」及び「ｃ．ｃ」については、後の処理においてファイル間最適化が実行される。
【０１８７】
図３１を用いて、コンパイル制御部１１１が実行する処理について説明する。コンパイル制御部１１１は、ステップＳ１７７の処理によってソースファイル名がメモリに格納されているか判定する（図３１：ステップＳ２２１）。
【０１８８】
ソースファイル名がメモリに格納されていない場合（ステップＳ２２１：Ｎｏルート）、以下の処理を実行する。具体的には、コンパイル制御部１１１は、ソースファイルに対するコンパイルを実行することをコンパイラ１４に指示する。これに応じ、コンパイラ１４は、ソースファイルに対するコンパイルを実行してオブジェクトコードを生成する（ステップＳ２２３）。そして処理は終了する。
【０１８９】
一方、ソースファイル名がメモリに格納されている場合（ステップＳ２２１：Ｙｅｓルート）、コンパイル制御部１１１は、各ソースファイルをコンパイラ１４に渡し、各ソースファイルについてソースプログラム情報ファイルを取得する（ステップＳ２２５）。
【０１９０】
コンパイル制御部１１１は、各ソースファイルについて、ソースプログラム情報ファイルをＣＦＯ実行部１５に渡し、ファイル間最適化中間ファイルを取得する（ステップＳ２２７）。
【０１９１】
コンパイル制御部１１１は、ステップＳ２２７において取得されたファイル間最適化中間ファイルのうち、コマンドラインで指定されたソースファイル名に対応するファイル間最適化中間ファイルをコンパイラ１４に渡し、ファイル間最適化オブジェクトファイルを取得する（ステップＳ２２９）。
【０１９２】
コンパイル制御部１１１は、ステップＳ２２９において取得されたファイル間最適化オブジェクトファイルに、ステップＳ２２７において取得され且つ他のソースファイルに対応するファイル間最適化中間プログラムを埋め込む（ステップＳ２３１）。そして処理は終了する。
【０１９３】
例えば、ファイル間最適化の対象であるソースファイルが「ａ．ｃ」及び「ｂ．ｃ」であり、コマンドラインで指定されたソースファイル名が「ａ．ｃ」である場合、「ａ．ｃ」についてファイル間最適化オブジェクトファイルが生成される。そして、そのファイル間最適化オブジェクトファイルに、「ｂ．ｃ」についてのファイル間最適化中間プログラムが埋め込まれる。
【０１９４】
以上のような処理を実行すれば、コンパイル時にファイル間最適化が実行され、また、一部のソースファイルについてはオブジェクトコードの生成が省略されるようになる。
【０１９５】
次に、図３２乃至図３４を用いて、リンク時の処理について説明する。
【０１９６】
まず、ＣＦＯ判定部１１２が実行する処理について説明する。ＣＦＯ判定部１１２は、データ格納部１３にデータが格納されているか判定する（図３２：ステップＳ２４１）。
【０１９７】
データ格納部１３にデータが格納されていない場合（ステップＳ２４１：Ｎｏルート）、処理は終了する。
【０１９８】
一方、データ格納部１３にデータが格納されている場合（ステップＳ２４１：Ｙｅｓルート）、ＣＦＯ判定部１１２は、データ格納部１３から、リンク時に最適化が行われるオブジェクトファイルのうち未処理のオブジェクトファイルを１つ特定する（ステップＳ２４３）。
【０１９９】
ＣＦＯ判定部１１２は、コマンドラインで指定されたオブジェクトファイルが、ステップＳ２４３において特定されたオブジェクトファイルと一致するか判定する（ステップＳ２４５）。
【０２００】
コマンドラインで指定されたオブジェクトファイルが、ステップＳ２４３において特定されたオブジェクトファイルと一致しない場合（ステップＳ２４５：Ｎｏルート）、以下の処理が実行される。具体的には、ＣＦＯ判定部１１２は、データ格納部１３に格納されている、リンク時最適化が行われるオブジェクトファイルのうち、未処理のオブジェクトファイルが有るか判定する（ステップＳ２４７）。
【０２０１】
未処理のオブジェクトファイルが有る場合（ステップＳ２４７：Ｙｅｓルート）、処理はステップＳ２４３に戻る。未処理のオブジェクトファイルが無い場合（ステップＳ２４７：Ｎｏルート）、処理は終了する。
【０２０２】
一方、コマンドラインで指定されたオブジェクトファイルが、ステップＳ２４３において特定されたオブジェクトファイルと一致する場合（ステップＳ２４５：Ｎｏルート）、以下の処理が実行される。具体的には、ＣＦＯ判定部１１２は、ステップＳ２４３において特定されたレコードに対応する実行フラグが「１」であるか判定する（ステップＳ２４９）。
【０２０３】
ステップＳ２４３において特定されたレコードに対応する実行フラグが「１」ではない場合（ステップＳ２４９：Ｎｏルート）、処理はステップＳ２４３に戻る。
【０２０４】
一方、ステップＳ２４３において特定されたレコードに対応する実行フラグが「１」である場合（ステップＳ２４９：Ｙｅｓルート）、ＣＦＯ判定部１１２は、ステップＳ２４３において特定されたオブジェクトファイルのオブジェクトファイル名をメモリに格納する（ステップＳ２５１）。そして処理は終了する。
【０２０５】
図３３に、ステップＳ２５１の処理によってメモリに格納されるデータの一例を示す。図３３の例では、コマンドラインにおいて指定されたオブジェクトファイルであって且つリンク時に最適化されるオブジェクトファイルのうちステップＳ２３１においてファイル間最適化中間プログラムが埋め込まれたファイル間最適化オブジェクトファイルのオブジェクトファイル名が格納される。
【０２０６】
図３４を用いて、ＣＦＯ制御部１１３が実行する処理について説明する。まず、ＣＦＯ制御部１１３は、リンク時に最適化が行われるオブジェクトファイルのうちステップＳ２３１においてファイル間最適化中間プログラムが埋め込まれたファイル間最適化オブジェクトファイルのオブジェクトファイル名がメモリに格納されているか判定する（ステップＳ２６１）。
【０２０７】
リンク時に最適化が行われるオブジェクトファイルのうちステップＳ２３１においてファイル間最適化中間プログラムが埋め込まれたファイル間最適化オブジェクトファイルのオブジェクトファイル名がメモリに格納されている場合（ステップＳ２６１：Ｙｅｓルート）、以下の処理が実行される。具体的には、ＣＦＯ制御部１１３は、リンク時に最適化が実行されるオブジェクトファイルのうちステップＳ２３１においてファイル間最適化中間プログラムが埋め込まれたファイル間最適化オブジェクトファイルから、ファイル間最適化中間プログラムを取り出す。そして、ＣＦＯ制御部１１３は、取り出したファイル間最適化中間プログラムをファイル間最適化中間ファイルに出力する（ステップＳ２６３）。
【０２０８】
ＣＦＯ制御部１１３は、コンパイラ１４に以下の処理を実行させる。具体的には、コンパイラ１４は、ステップＳ２６３の処理によって生成されたファイル間最適化中間ファイルを入力として、ファイル間最適化オブジェクトファイルを生成する（ステップＳ２６５）。
【０２０９】
ＣＦＯ制御部１１３は、リンカ１６に以下の処理を実行させる。具体的には、リンカ１６は、ステップＳ２６３においてファイル間最適化中間プログラムが取り出されたファイル間最適化オブジェクトファイルと、ステップＳ２６５において生成されたファイル間最適化オブジェクトファイルとを入力として、実行可能ファイルを生成する（ステップＳ２６７）。そして処理は終了する。
【０２１０】
一方、リンク時に最適化が行われるオブジェクトファイルのオブジェクトファイル名がメモリに格納されていない場合（ステップＳ２６１：Ｎｏルート）、ＣＦＯ制御部１１３は、ＣＦＯ実行部１５に以下の処理を実行させる。具体的には、ＣＦＯ実行部１５は、コマンドラインにおいて指定されたオブジェクトファイルに埋め込まれたソースプログラム情報についてファイル間最適化中間ファイルを生成する（ステップＳ２６９）。
【０２１１】
ＣＦＯ制御部１１３は、コンパイラ１４に以下の処理を実行させる。具体的には、コンパイラ１４は、ステップＳ２６９において生成されたファイル間最適化中間ファイルから、ファイル間最適化オブジェクトファイルを生成する（ステップＳ２７１）。
【０２１２】
ＣＦＯ制御部１１３は、リンカ１６に以下の処理を実行させる。具体的には、リンカ１６は、ステップＳ２７１において生成されたファイル間最適化オブジェクトファイルをリンクして実行可能ファイルを生成する（ステップＳ２７３）。そして処理は終了する。
【０２１３】
以上のような処理を実行すれば、コンパイル時にソースファイルからオブジェクトコードを生成する処理（すなわち、１パス目のコンパイル）が省略されるので、広義のコンパイルを完了するまでに要する時間を短縮することができるようになる。
【０２１４】
図３５を用いて、第２の実施の形態によるコンパイル省略について具体的に説明する。ここでは、図１８の（１）乃至（９）に示すコマンドを含むコマンド列を例とする。そして、図３５に、図１８に示した各コマンドの実行時においてオブジェクトコードが生成されるソースファイルの比較を示す。
【０２１５】
「ｘ．ｅｘｅ」については、通常のコンパイル及びリンクの場合、「ａ．ｃ」、「ｂ．ｃ」、「ａ．ｃ」に対応するファイル間最適化中間プログラム及び「ｂ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。一方、第２の実施の形態によれば、「ａ．ｃ」、「ａ．ｃ」に対応するファイル間最適化中間プログラム及び「ｂ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。よって、数が４から３に減少した。
【０２１６】
「ｙ．ｅｘｅ」については、通常のコンパイル及びリンクの場合、「ａ．ｃ」、「ｃ．ｃ」、「ａ．ｃ」に対応するファイル間最適化中間プログラム及び「ｃ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。一方、第２の実施の形態によれば、「ａ．ｃ」、「ａ．ｃ」に対応するファイル間最適化中間プログラム及び「ｃ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。よって、数が４から３に減少した。
【０２１７】
「ｚ．ｅｘｅ」については、通常のコンパイル及びリンクの場合、「ａ．ｃ」、「ｄ．ｃ」及び「ａ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。一方、第２の実施の形態によれば、「ａ．ｃ」、「ｄ．ｃ」及び「ａ．ｃ」に対応するファイル間最適化中間プログラムについてオブジェクトコードが生成される。よって、両者の数は同じである。
【０２１８】
「ｗ．ｅｘｅ」については、通常のコンパイル及びリンクの場合、「ｄ．ｃ」及び「ｅ．ｃ」についてオブジェクトコードが生成される。一方、第２の実施の形態によれば、「ｄ．ｃ」及び「ｅ．ｃ」についてオブジェクトコードが生成される。よって、両者の数は同じである。
【０２１９】
ここで、図６に示したデータがデータ格納部１３に格納されているケースについて、第２の実施の形態の動作をより具体的に説明する。
【０２２０】
まず、ドライランによりｍａｋｅｆｉｌｅコマンド列が生成される。コンパイル又はリンクコマンド「ｆｃｃ」が検出され、オプション「−ｃ」が付加されておらず且つ入力ファイルの拡張子が「．ｏ」であれば、そのコマンドはリンクコマンドである。そのリンクコマンドに対しては、以下のような処理が実行される。
【０２２１】
まず、リンクコマンド「ｆｃｃ  ａ．ｏ  ｂ．ｏ  −ｏ  ｘ．ｅｘｅ  −Ｋｌｔｏ」について、オプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。
【０２２２】
リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」及び「ｂ．ｏ」のうち「ａ．ｏ」について、オプション「−ｃ」が付加されており、入力ファイルの拡張子が言語仕様で定められており、且つ「ａ．ｏ」がオプション「−ｏ」に続けて出力ファイルとして付加されているか又は入力ファイルの拡張子と出力ファイルの拡張子とだけが異なるコンパイルコマンドとして、「ｆｃｃ  ａ．ｃ  −ｏ  ａ．ｏ  −ｃ  −Ｋｌｔｏ」が検出される。ここで、コンパイルコマンドにオプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。続いて、「ａ．ｏ」に対して常にリンク時最適化が行われてからリンクされているかが以下のように判定される。具体的には、ｍａｋｅｆｉｌｅコマンド列に「ｆｃｃ  ａ．ｏ  ｂ．ｏ  −ｏ  ｘ．ｅｘｅ  −Ｋｌｔｏ」と「ｆｃｃ  ａ．ｏ  ｃ．ｏ  −ｏ  ｙ．ｅｘｅ  −Ｋｌｔｏ」と「ｆｃｃ  ａ．ｏ  ｄ．ｏ  −ｏ  ｚ．ｅｘｅ  −Ｋｌｔｏ」とが入力ファイルが「ａ．ｏ」であるリンクコマンドとして存在する。入力ファイルが「ａ．ｏ」であるコマンド「ｆｃｃ」については、オプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。それを以って、「ａ．ｏ」が常にリンク時に最適化されていると判定される。そのため、「ａ．ｏ」は常にリンク時に最適化されるオブジェクトファイルとしてデータ格納部１３に登録される。また、「ａ．ｏ」が出力ファイルとして指定されているコンパイルコマンドの入力引数の「ａ．ｃ」が、コンパイルが不要であるソースファイルとして登録される。
【０２２３】
一方、リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」及び「ｂ．ｏ」のうち「ｂ．ｏ」については、オプション「−ｃ」が付加されており、入力ファイルの拡張子が言語仕様で定められたものであり、且つ「ｂ．ｏ」がオプション「−ｏ」に続けて出力ファイルとして指定されているか又は入力ファイルの拡張子と出力ファイルの拡張子とだけが異なるコンパイルコマンドとして、「ｆｃｃ  ｂ．ｃ  −ｏ  ｂ．ｏ  −ｃ  −Ｋｌｔｏ」が検出される。ここで、コンパイルコマンドにオプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。また、入力ファイルが「ｂ．ｏ」であるリンクコマンドとして「ｆｃｃ  ａ．ｏ  ｂ．ｏ  −ｏ  ｘ．ｅｘｅ  −Ｋｌｔｏ」が検出され、オプション「−Ｋｌｔｏ」が付加されておりリンク時に最適化されることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。そのため、「ｂ．ｏ」は常にリンク時に最適化されるオブジェクトファイルとしてデータ格納部１３に登録される。また、「ｂ．ｏ」が出力ファイルとして指定されているコンパイルコマンドの入力引数の「ｂ．ｃ」が、コンパイルが不要であるソースファイルとして登録される。
【０２２４】
そして、「ａ．ｏ」についてのレコードと「ｂ．ｏ」についてのレコードとの両方に対して、コンパイルコマンドにリンク時最適化オプションが付加されている「ｘ．ｅｘｅ」に対応するソースファイルである「ａ．ｃ  ｂ．ｃ」が、ファイル間最適化の対象であるソースファイルとして登録される。
【０２２５】
次にリンクコマンド「ｆｃｃ  ａ．ｏ  ｃ．ｏ  −ｏ  ｙ．ｅｘｅ  −Ｋｌｔｏ」について、オプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。
【０２２６】
リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」と「ｃ．ｏ」のうち「ａ．ｏ」に対しては、上記と同様の手順によって常にリンク時最適化が実行されることが確認される。そのため、「ａ．ｏ」についての新規レコードがデータ格納部１３に登録される。また、「ａ．ｏ」が出力ファイルとして指定されているコンパイルコマンドの入力引数である「ａ．ｃ」が、コンパイルが不要であるソースファイルとして登録される。
【０２２７】
一方、リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」と「ｃ．ｏ」のうち「ｃ．ｏ」について、オプション「−ｃ」が付加されており、且つ入力ファイルの拡張子が言語仕様で定められており、「ｃ．ｏ」がオプション「−ｏ」に続けて出力ファイルとして指定されているか又は入力ファイルの拡張子と出力ファイルの拡張子とだけが異なるコンパイルコマンドとして、「ｆｃｃ  ｃ．ｃ  −ｏ  ｃ．ｏ  −ｃ  −Ｋｌｔｏ」が検出される。コンパイルコマンドにオプション「−Ｋｌｔｏ」が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。また、入力ファイルが「ｃ．ｏ」であるコマンドとして「ｆｃｃ  ａ．ｏ  ｃ．ｏ  −ｏ  ｙ．ｅｘｅ  −Ｋｌｔｏ」が検出され、オプション「−Ｋｌｔｏ」が付加されてリンク時に最適化されることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。そのため、「ｃ．ｏ」についての新規レコードがデータ格納部１３に登録される。また、「ｃ．ｏ」が出力ファイルとして指定されているコンパイルコマンドの入力引数である「ｃ．ｃ」が、コンパイルが不要であるソースファイルとして登録される。そして、追加された「ａ．ｏ」についてのレコードと「ｃ．ｏ」についてのレコードとの両方に対して、コンパイルコマンドにリンク時最適化オプションが付加されている「ｙ．ｅｘｅ」に対応するソースファイルである「ａ．ｃ  ｃ．ｃ」が、ファイル間最適化の対象であるソースファイルとして登録される。
【０２２８】
次に、リンクコマンド「ｆｃｃ  ａ．ｏ  ｄ．ｏ  −ｏ  ｚ．ｅｘｅ  −Ｋｌｔｏ」について、オプション”−Ｋｌｔｏ”が付加されていることがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。
【０２２９】
リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」及び「ｄ．ｏ」のうち「ａ．ｏ」に対しては、上記と同様の手順によって常にリンク時最適化が実行されることが確認される。そのため、「ａ．ｏ」についての新規レコードがデータ格納部１３に登録される。また、「ａ．ｏ」が出力ファイルとして指定されているコンパイルコマンドの入力引数である「ａ．ｃ」が、コンパイルが不要であるソースファイルとして登録される。
【０２３０】
一方、リンクコマンドの入力引数のオブジェクトファイル「ａ．ｏ」及び「ｄ．ｏ」のうち「ｄ．ｏ」については、オプション「−ｃ」が付加されており、入力ファイルの拡張子が言語仕様で定められており、且つ「ｄ．ｏ」がオプション「−ｏ」に続けて出力ファイルとして指定されているか又は入力ファイルの拡張子と出力ファイルの拡張子とだけが異なるコンパイルコマンドとして、「ｆｃｃ  ｄ．ｃ  −ｏ  ｄ．ｏ  −ｃ」が検出される。しかし、コンパイルコマンドにオプション「−Ｋｌｔｏ」が付加されていない。そのため、データ格納部１３にレコードは追加されない。そして、追加された「ａ．ｏ」についてのレコードに対して、コンパイルコマンドにリンク時最適化オプションが付加されている「ｚ．ｅｘｅ」に対応するソースファイルである「ａ．ｃ」が、ファイル間最適化の対象であるソースファイルとして登録される。
【０２３１】
最後に、リンクコマンド「ｆｃｃ  ｄ．ｏ  ｅ．ｏ  −ｏ  ｗ．ｅｘｅ」について、オプション「−Ｋｌｔｏ」が付加されていないことがコマンドと「−Ｋｌｔｏ」との文字列比較により確認される。そのため、このリンクコマンドに対しては処理が行われない。
【０２３２】
以上のような処理を実行すれば、データ格納部１３は図２６に示した状態になる。
【０２３３】
続いて、コンパイル時の処理及びリンク時の処理を説明する。
【０２３４】
コンパイル時、ソースファイルのコンパイルが不要であり、そのソースファイルについてのレコードの数が１つであり、且つファイル間最適化が未だ実行されていなければ、そのソースファイルに対応するファイル間最適化の対象であるソースファイル（ここでは、ファイル間最適化が行われるソースファイルのこと）が記憶される。例えば、コンパイルが不要であるソースファイルとして「ａ．ｃ」を含むレコードの数は３であるが、コンパイルが不要であるソースファイルとして「ｂ．ｃ」を含むレコードの数は１である。従って、「ｂ．ｃ」のコンパイル時にファイル間最適化の対象であるソースファイル名として「ａ．ｃ  ｂ．ｃ」が記憶される。記憶されたファイル間最適化の対象であるソースファイルに対してはファイル間最適化が実行され、ファイル間最適化中間プログラムが生成される。ファイル間最適化中間プログラムに対してはコンパイルが実行され、ファイル間最適化オブジェクトファイルが生成される。例えば、ファイル間最適化の対象であるソースファイルが「ａ．ｃ  ｂ．ｃ」である場合、「ｂ．ｃ」自体のコンパイルは行われず、「ｂ．ｃ」に対応するファイル間最適化中間プログラムのコンパイルによりオブジェクトファイル「ｂ．ｏ」が生成される。また、「ａ．ｃ」に対応するファイル間最適化中間プログラムがオブジェクトファイル「ｂ．ｏ」に埋め込まれる。
【０２３５】
リンク時、引数で指定されたオブジェクトファイルがリンク時に最適化されるオブジェクトファイルであり且つリンク時最適化を未だ実行していない場合、そのオブジェクトファイル名がメモリに記憶される。例えば、引数で指定された「ｂ．ｏ」がリンク時に最適化されるオブジェクトファイルであり且つリンク時最適化を未だ実行していない場合、「ｂ．ｏ」がメモリに記憶される。そして、ファイル間最適化オブジェクトファイル「ｂ．ｏ」に埋め込まれた、ファイル間最適化の対象である他のソースファイルに対応するファイル間最適化中間プログラムがコンパイルされ、ファイル間最適化オブジェクトファイルが生成される。そして、「ｂ．ｏ」についてのファイル間最適化オブジェクトファイルと、他のファイル間最適化オブジェクトファイルとをリンクすることで実行可能ファイルが生成される。
【０２３６】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置１の機能ブロック構成は実際のプログラムモジュール構成に一致しない場合もある。
【０２３７】
また、上で説明したデータ構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【０２３８】
なお、上で述べた情報処理装置１は、コンピュータ装置であって、図３６に示すように、メモリ２５０１とＣＰＵ（Central  Processing  Unit）２５０３とハードディスク・ドライブ（ＨＤＤ：Hard  Disk  Drive）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating  System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーション・プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本発明の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【０２３９】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【０２４０】
本実施の形態の第１の態様に係るプログラム生成方法は、（Ａ）実行可能プログラムを生成するための複数のコマンドを含むコマンドデータから、リンク時最適化を実行するための第１のオプションが付加されたリンクコマンド内のオブジェクトファイルである第１のオブジェクトファイルを特定し、（Ｂ）入力ファイルが第１のオブジェクトファイルであり且つコマンドデータに含まれる１又は複数のリンクコマンドの各々に対して、第１のオプションが付加されている場合、第１のオブジェクトファイルの識別情報をデータ格納部に格納する処理を含む。
【０２４１】
このようにすれば、リンク時最適化の前に行われるコンパイルで生成されるオブジェクトファイルであってリンクされないファイルを特定することができるようになる。
【０２４２】
また、上記プログラム生成方法は、（Ｃ）データ格納部に格納された第１のオブジェクトファイルに対応する第１のソースファイル以外のソースファイルから第２のオブジェクトファイルを生成する処理を、コンパイラに実行させる処理をさらに含んでもよい。リンクされるオブジェクトファイルについては、オブジェクトファイルを通常どおり生成できるようになる。
【０２４３】
また、上記プログラム生成方法は、（Ｄ）第１のソースファイル及び第１のソースファイル以外のソースファイルに対するファイル間最適化により生成された中間ファイルから第１のオブジェクトファイル及び第３のオブジェクトファイルを生成する処理をコンパイラに実行させ、（Ｅ）第１のオブジェクトファイルと第３のオブジェクトファイルとをリンクする処理をリンカに実行させる処理をさらに含んでもよい。一部のソースファイルについてリンク時最適化が実行される前のコンパイルを省略しつつ、ビルドを完了できるようになる。これにより、ビルドが完了するまでの時間を短縮できるようになる。
【０２４４】
また、第１のオブジェクトファイルを特定する処理において、（ａ１）コマンド名が所定のコマンド名であり、コンパイルコマンドであることを表す第２のオプションが付加されておらず、且つ、コマンドの入力ファイルの拡張子が所定の拡張子であるという条件を満たすリンクコマンドを特定し、（ａ２）第１のオブジェクトファイルを、特定されたリンクコマンドから特定してもよい。リンクコマンド以外のコマンドから第１のオブジェクトファイルを特定することを防げるようになる。
【０２４５】
また、第１のオブジェクトファイルの識別情報をデータ格納部に格納する処理において、（ｂ１）コマンド名が所定のコマンド名であり、入力ファイルが第１のオブジェクトファイルであり、且つ、第１のオプション及び第２のオプションが付加されていないコマンドがコマンドデータに含まれるか判定してもよい。１又は複数のリンクコマンドの各々に対して第１のオプションが付加されているか否かを効率的に判定できるようになる。
【０２４６】
また、第１のオブジェクトファイルの識別情報をデータ格納部に格納する処理において、（ｂ２）コマンド名が所定のコマンド名であり、コンパイルコマンドであることを表す第２のオプションが付加されており、入力ファイルの拡張子が所定の拡張子であり、且つ、出力ファイルが第１のオブジェクトファイルであるか又は第１のオブジェクトファイルの拡張子以外の部分と入力ファイルの拡張子以外の部分とが一致するという条件を満たすコンパイルコマンドをコマンドデータから特定し、（ｂ３）特定されたコンパイルコマンドに第１のオプションが付加されている場合に、入力ファイルが第１のオブジェクトファイルであり、且つ、第１のオプション及び第２のオプションが付加されていないコマンドがコマンドデータに含まれるか判定してもよい。コンパイルコマンド及びリンクコマンドの両方に第１のオプションが付されている場合にリンク時最適化が行われる場合がある。上で述べたようにすれば、第１のコマンドを出力するためのコンパイルコマンドに第１のオプションが付加されていることを確認できるようになる。
【０２４７】
また、上記プログラム生成方法は、（Ｆ）第１のオブジェクトファイルに対応する第１のソースファイルに対して行われるファイル間最適化の回数が所定数であり、且つ、第１のソースファイルに対するファイル間最適化が行われていない場合、第１のソースファイルに対してファイル間最適化を実行して第１の中間ファイルを生成し且つ生成した当該第１の中間ファイルから第１のオブジェクトファイルを１回目のコンパイル時に生成する処理をコンパイラに実行させ、（Ｇ）第１のソースファイルと共にファイル間最適化が行われる第２のソースファイルに対してファイル間最適化を実行して第２の中間ファイルを生成し且つ生成した当該第２の中間ファイルに含まれる中間プログラムを第１のオブジェクトファイルに埋め込み、（Ｈ）第１のオブジェクトファイルに含まれる中間プログラムを取り出して第３のオブジェクトファイルを生成する処理をコンパイラに実行させ、第１のオブジェクトファイルと第３のオブジェクトファイルとをリンクする処理をリンカに実行させる処理をさらに含んでもよい。第１のソースファイルから第１のオブジェクトを生成する処理が省略されるので、リンクが完了するまでの時間を短縮できるようになる。
【０２４８】
また、上記プログラム生成方法は、（Ｉ）コマンドデータを、所定のコマンドのドライランにより生成する処理をさらに含んでもよい。実際にコンパイル等を実行することなくコマンドデータを生成できるようになる。
【０２４９】
また、所定数は１であってもよい。
【０２５０】
本実施の形態の第２の態様に係るコンパイル方法は、（Ｊ）コンパイルの対象として指定された第１のソースファイルの識別情報が、リンクされないオブジェクトファイルに対応するソースファイルの識別情報を格納するデータ格納部に格納されているか判定し、（Ｋ）第１のソースファイルの識別情報がデータ格納部に格納されている場合、第１のソースファイル以外のソースファイルに対するコンパイルによりオブジェクトファイルを生成し、（Ｌ）第１のソースファイルと第１のソースファイル以外のソースファイルとに対してファイル間最適化を実行して複数の中間ファイルを生成し、（Ｍ）生成した複数の中間ファイルに対するコンパイルにより複数のオブジェクトファイルを生成する処理を含む。
【０２５１】
第１のソースファイルに対するコンパイルを省略できるので、ビルドに要する時間を短縮できるようになる。
【０２５２】
本実施の形態によれば、或るオブジェクトファイルを入力とする全リンクコマンドに対して、リンク時最適化を実行するためのオプションが付加されているかを判定することによって、そのオブジェクトファイル自体がリンクされるか否かを特定できる。
【０２５３】
なお、上記方法による処理をコンピュータに実行させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【０２５４】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０２５５】
（付記１）
コンピュータに、
実行可能プログラムを生成するための複数のコマンドを含むコマンドデータから、リンク時最適化を実行するための第１のオプションが付加されたリンクコマンド内のオブジェクトファイルである第１のオブジェクトファイルを特定し、
入力ファイルが前記第１のオブジェクトファイルであり且つ前記コマンドデータに含まれる１又は複数のリンクコマンドの各々に対して、前記第１のオプションが付加されている場合、前記第１のオブジェクトファイルの識別情報をデータ格納部に格納する、
処理を実行させるプログラム生成プログラム。
【０２５６】
（付記２）
前記コンピュータに、
前記データ格納部に格納された前記第１のオブジェクトファイルに対応する第１のソースファイル以外のソースファイルから第２のオブジェクトファイルを生成する処理を、コンパイラに実行させる、
処理をさらに実行させる付記１記載のプログラム生成プログラム。
【０２５７】
（付記３）
前記コンピュータに、
前記第１のソースファイル及び前記第１のソースファイル以外のソースファイルに対するファイル間最適化により生成された中間ファイルから前記第１のオブジェクトファイル及び第３のオブジェクトファイルを生成する処理を前記コンパイラに実行させ、
前記第１のオブジェクトファイルと前記第３のオブジェクトファイルとをリンクする処理をリンカに実行させる、
処理をさらに実行させる付記２記載のプログラム生成プログラム。
【０２５８】
（付記４）
前記第１のオブジェクトファイルを特定する処理において、
コマンド名が所定のコマンド名であり、コンパイルコマンドであることを表す第２のオプションが付加されておらず、且つ、コマンドの入力ファイルの拡張子が所定の拡張子であるという条件を満たすリンクコマンドを特定し、
前記第１のオブジェクトファイルを、特定された前記リンクコマンドから特定する、
付記１乃至３のいずれか１つ記載のプログラム生成プログラム。
【０２５９】
（付記５）
前記第１のオブジェクトファイルの識別情報を前記データ格納部に格納する処理において、
コマンド名が所定のコマンド名であり、入力ファイルが前記第１のオブジェクトファイルであり、且つ、前記第１のオプション及び前記第２のオプションが付加されていないコマンドが前記コマンドデータに含まれるか判定する、
付記１乃至４のいずれか１つ記載のプログラム生成プログラム。
【０２６０】
（付記６）
前記第１のオブジェクトファイルの識別情報を前記データ格納部に格納する処理において、
コマンド名が前記所定のコマンド名であり、コンパイルコマンドであることを表す第２のオプションが付加されており、入力ファイルの拡張子が所定の拡張子であり、且つ、出力ファイルが前記第１のオブジェクトファイルであるか又は前記第１のオブジェクトファイルの拡張子以外の部分と入力ファイルの拡張子以外の部分とが一致するという条件を満たすコンパイルコマンドを前記コマンドデータから特定し、
特定された前記コンパイルコマンドに前記第１のオプションが付加されている場合に、入力ファイルが前記第１のオブジェクトファイルであり、且つ、前記第１のオプション及び前記第２のオプションが付加されていないコマンドが前記コマンドデータに含まれるか判定する、
付記５記載のプログラム生成プログラム。
【０２６１】
（付記７）
前記コンピュータに、
前記第１のオブジェクトファイルに対応する第１のソースファイルに対して行われるファイル間最適化の回数が所定数であり、且つ、前記第１のソースファイルに対するファイル間最適化が行われていない場合、前記第１のソースファイルに対してファイル間最適化を実行して第１の中間ファイルを生成し且つ生成した当該第１の中間ファイルから前記第１のオブジェクトファイルを１回目のコンパイル時に生成する処理をコンパイラに実行させ、
前記第１のソースファイルと共にファイル間最適化が行われる第２のソースファイルに対してファイル間最適化を実行して第２の中間ファイルを生成し且つ生成した当該第２の中間ファイルに含まれる中間プログラムを前記第１のオブジェクトファイルに埋め込み、
前記第１のオブジェクトファイルに含まれる中間プログラムを取り出して第３のオブジェクトファイルを生成する処理を前記コンパイラに実行させ、前記第１のオブジェクトファイルと前記第３のオブジェクトファイルとをリンクする処理をリンカに実行させる、
処理をさらに実行させる付記１記載のプログラム生成プログラム。
【０２６２】
（付記８）
前記コンピュータに、
前記コマンドデータを、所定のコマンドのドライランにより生成する、
処理をさらに実行させる付記１乃至７のいずれか１つ記載のプログラム生成プログラム。
【０２６３】
（付記９）
前記所定数は１である、
付記７記載のプログラム生成プログラム。
【０２６４】
（付記１０）
コンピュータに、
コンパイルの対象として指定された第１のソースファイルの識別情報が、リンクされないオブジェクトファイルに対応するソースファイルの識別情報を格納するデータ格納部に格納されているか判定し、
前記第１のソースファイルの識別情報が前記データ格納部に格納されている場合、前記第１のソースファイル以外のソースファイルに対するコンパイルによりオブジェクトファイルを生成し、
前記第１のソースファイルと前記第１のソースファイル以外のソースファイルとに対してファイル間最適化を実行して複数の中間ファイルを生成し、
生成した前記複数の中間ファイルに対するコンパイルにより複数のオブジェクトファイルを生成する、
処理を実行させるコンパイルプログラム。
【０２６５】
（付記１１）
コンピュータが、
実行可能プログラムを生成するための複数のコマンドを含むコマンドデータから、リンク時最適化を実行するための第１のオプションが付加されたリンクコマンド内のオブジェクトファイルである第１のオブジェクトファイルを特定し、
入力ファイルが前記第１のオブジェクトファイルであり且つ前記コマンドデータに含まれる１又は複数のリンクコマンドの各々に対して、前記第１のオプションが付加されている場合、前記第１のオブジェクトファイルの識別情報をデータ格納部に格納する、
処理を実行するプログラム生成方法。
【０２６６】
（付記１２）
データ格納部と、
実行可能プログラムを生成するための複数のコマンドを含むコマンドデータから、リンク時最適化を実行するための第１のオプションが付加されたリンクコマンド内のオブジェクトファイルである第１のオブジェクトファイルを特定し、入力ファイルが前記第１のオブジェクトファイルであり且つ前記コマンドデータに含まれる１又は複数のリンクコマンドの各々に対して、前記第１のオプションが付加されている場合、前記第１のオブジェクトファイルの識別情報を前記データ格納部に格納する処理部と、
を有する情報処理装置。
【０２６７】
（付記１３）
コンピュータが、
コンパイルの対象として指定された第１のソースファイルの識別情報が、リンクされないオブジェクトファイルに対応するソースファイルの識別情報を格納するデータ格納部に格納されているか判定し、
前記第１のソースファイルの識別情報が前記データ格納部に格納されている場合、前記第１のソースファイル以外のソースファイルに対するコンパイルによりオブジェクトファイルを生成し、
前記第１のソースファイルと前記第１のソースファイル以外のソースファイルとに対してファイル間最適化を実行して複数の中間ファイルを生成し、
生成した前記複数の中間ファイルに対するコンパイルにより複数のオブジェクトファイルを生成する、
処理を実行するコンパイルプログラム。
【０２６８】
（付記１４）
リンクされないオブジェクトファイルに対応するソースファイルの識別情報を格納するデータ格納部と、
コンパイルの対象として指定された第１のソースファイルの識別情報が、前記データ格納部に格納されているか判定し、前記第１のソースファイルの識別情報が前記データ格納部に格納されている場合、前記第１のソースファイル以外のソースファイルに対するコンパイルによりオブジェクトファイルを生成する第１生成部と、
前記第１のソースファイルと前記第１のソースファイル以外のソースファイルとに対してファイル間最適化を実行して複数の中間ファイルを生成する第２生成部と、
を有し、
前記第１生成部が、
前記第２生成部により生成された前記複数の中間ファイルに対するコンパイルにより複数のオブジェクトファイルを生成する、
情報処理装置。
【符号の説明】
【０２６９】
１  情報処理装置    １０  ＬＴＯオブジェクト抽出部
１１  コンパイラドライバ    １１０  コンパイル判定部
１１１  コンパイル制御部    １１２  ＣＦＯ判定部
１１３  ＣＦＯ制御部    １２  実行ルール格納部
１３  データ格納部    １４  コンパイラ
１４１  コンパイル省略部    １５  ＣＦＯ実行部
１６  リンカ    １７  入力ツール
【図１】
2018032082.tif 000003
【図２】
2018032082.tif 000004
【図３】
2018032082.tif 000005
【図４】
2018032082.tif 000006
【図５】
2018032082.tif 000007
【図６】
2018032082.tif 000008
【図７】
2018032082.tif 000009
【図８】
2018032082.tif 000010
【図９】
2018032082.tif 000011
【図１０】
2018032082.tif 000012
【図１１】
2018032082.tif 000013
【図１２】
2018032082.tif 000014
【図１３】
2018032082.tif 000015
【図１４】
2018032082.tif 000016
【図１５】
2018032082.tif 000017
【図１６】
2018032082.tif 000018
【図１７】
2018032082.tif 000019
【図１８】
2018032082.tif 000020
【図１９】
2018032082.tif 000021
【図２０】
2018032082.tif 000022
【図２１】
2018032082.tif 000023
【図２２】
2018032082.tif 000024
【図２３】
2018032082.tif 000025
【図２４】
2018032082.tif 000026
【図２５】
2018032082.tif 000027
【図２６】
2018032082.tif 000028
【図２７】
2018032082.tif 000029
【図２８】
2018032082.tif 000030
【図２９】
2018032082.tif 000031
【図３０】
2018032082.tif 000032
【図３１】
2018032082.tif 000033
【図３２】
2018032082.tif 000034
【図３３】
2018032082.tif 000035
【図３４】
2018032082.tif 000036
【図３５】
2018032082.tif 000037
【図３６】
2018032082.tif 000038