(57)【要約】【課題】効率的なコンパイルを行うこと。【解決手段】第１のソースコードをコンパイルして実行時にカバレッジデータを出力する第１の実行プログラムを出力する第１ステップ（ステップＳ１〜ステップＳ１０）と、前記出力された第１の実行プログラムを実行する第２ステップ（ステップＳ１１）と、前記第２ステップにより出力されたカバレッジデータに基づいて前記第１のソースコードに含まれる一度も実行されなかったコードブロックをコメントアウトまたは削除して第２のソースコードを生成する第３ステップ（ステップＳ１２〜ステップＳ２０）と、前記出力された第２のソースコードをコンパイルして第２の実行プログラムを出力する第４ステップ（ステップＳ２１〜ステップＳ２４）と、を含む。【選択図】図３
2010231478.tif 000002
【特許請求の範囲】
【請求項１】
第１のソースコードをコンパイルして実行時にカバレッジデータを出力する第１の実行プログラムを出力する第１ステップと、
前記出力された第１の実行プログラムを実行する第２ステップと、
前記第２ステップにより出力されたカバレッジデータに基づいて前記第１のソースコードに含まれる一度も実行されなかったコードブロックをコメントアウトまたは削除して第２のソースコードを生成する第３ステップと、
前記出力された第２のソースコードをコンパイルして第２の実行プログラムを出力する第４ステップと、
を含むことを特徴とするコンパイル方法。
【請求項２】
前記第３ステップは、前記第１のソースコードに含まれる一度も実行されなかったコードブロックをコメントアウト処理するか削除処理するかをユーザコマンドに含まれるオプションに基づいて判断するステップを含む、ことを特徴とする請求項１に記載のコンパイル方法。
【請求項３】
前記第１のソースコードは、一度も実行されなかったコードブロックをコメントアウトまたは削除するかコメントアウトも削除も行わないかを関数毎に指示する記述を含むことを特徴とするコンパイル方法。
【請求項４】
第１のソースコードをコンパイルして実行時にカバレッジデータを出力する第１の実行プログラムを出力する第１手順と、
前記出力された第１の実行プログラムを実行する第２手順と、
前記第２ステップにより出力されたカバレッジデータに基づいて前記第１のソースコードに含まれる一度も実行されなかったコードブロックをコメントアウトまたは削除して第２のソースコードを生成する第３手順と、
前記出力された第２のソースコードをコンパイルして第２の実行プログラムを出力する第４手順と、
をコンピュータに実行させることを特徴とするコンパイルプログラム。
【請求項５】
プログラミング言語で記述された半導体集積回路の第１の設計モデルをコンパイルして実行時にカバレッジデータを出力する第１の実行プログラムを出力する第１ステップと、
前記出力された第１の実行プログラムを実行する第２ステップと、
前記第２ステップにより出力されたカバレッジデータに基づいて前記第１の設計モデルに含まれる一度も実行されなかったコードブロックをコメントアウトまたは削除して第２の設計モデルを生成する第３ステップと、
前記出力された第２の設計モデルをコンパイルして第２の実行プログラムを出力する第４ステップと、
前記第２の実行プログラムを実行することによって前記第２の設計モデルを検証する第５ステップと、
を含み、
前記検証後の第２の設計モデルに基づいて半導体集積回路のアナログ回路設計図を作成し、前記作成したアナログ回路設計図に基づいて半導体集積回路を製造することを特徴とする半導体集積回路製造方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル方法、コンパイルプログラムおよび半導体集積回路製造方法に関する。
【背景技術】
【０００２】
一般的に、コンパイラには、ソースコードを静的解析した結果から、実行されない命令や意味がない命令を削除する「デッドコード最適化」の機能を持つものがある。たとえば、関数を終了する命令の後に記述された命令（ただし、他所からの分岐先となっていない場合）や、どこからも参照されない変数の定義などが最適化の対象となる。
【０００３】
下記は、Ｃ言語で書かれたソースコードの一例である。
行番号:  命令
1       :  int  foo()
2       :  {
3       :      int  a=1;
4       :      int  b;
5       :      int  c;
6       :      c=a*2;
7       :      return  c;
8       :      b=5;
9       :  }
この例では、８行目においてbに5を代入している命令は、return文の後に記述されているため、実行されない無効な命令であり、削除可能である。また、8行目が削除可能なので、4行目で定義している変数bはどこからも参照されなくなる。つまりこのコード行も削除可能である。この例のように、静的解析の結果からプログラムの動作に影響を与えない無効な命令（デッドコード）を削除するのが従来のコンパイラのデッドコード最適化である。以降、この技術を単に従来技術という。デッドコード最適化処理を実行すると、生成される実行プログラムのサイズのスリム化、実行速度向上、使用メモリ容量の削減など、種々の好ましい効果が得られる。
【０００４】
特許文献１には、上記従来技術を拡張した技術が開示されている。この技術によれば、命令単位で無効な命令かどうかを判定するのではなく、メソッド呼び出し時に渡す複数のパラメータのうち、無意味なパラメータがあれば削除し、また呼び出される側のメソッドにおいても、削除したパラメータに関する命令も合わせて削除可能とするものである。
【０００５】
しかしながら、ソースコードには、実行時に動的に変化するパラメータによってその後に続くプログラムの動作が変わり、結果として一度も実行されない命令が含まれていることがある。上記従来技術および特許文献１の技術では、静的解析に基づいて無効な命令か否かを判断するので、上記した結果的に一度も実行されない命令を無効な命令として特定することはできない。つまり、上記従来技術および特許文献１の技術は、このような命令を削除できないため、効率的なコンパイルができない、という問題があった。
【０００６】
その他、プログラムの実行結果情報に基づくコンパイラの最適化手法がある（例えば非特許文献１、非特許文献２参照）。しかしながら、この手法では、関数の配置位置の変更や、分岐予測に基づく分岐文に対するコード生成の変更はできても、デッドコードを削除することができない、という問題があった。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００３−１９６１０６号公報
【非特許文献】
【０００８】
【非特許文献１】”プロファイル・ベースの最適化”、［online］、日本ヒューレット・パッカード株式会社、［平成２０年３月１８日検索］、インターネット<ＵＲＬ：http://docs.hp.com/ja/B2355-90732/ch08s03.html>
【非特許文献２】”プロファイルベースの最適化オプション+Oprofile”、［online］、日本ヒューレット・パッカード株式会社、［平成２０年３月１８日検索］、インターネット<ＵＲＬ：http://docs.hp.com/ja/5185-6571/ch01s09.html>
【発明の概要】
【発明が解決しようとする課題】
【０００９】
本発明は、効率的なコンパイルを行うことができるコンパイル方法、コンパイルプログラムおよび半導体集積回路製造方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
本願発明の一態様によれば、第１のソースコードをコンパイルして実行時にカバレッジデータを出力する第１の実行プログラムを出力する第１ステップと、前記出力された第１の実行プログラムを実行する第２ステップと、前記第２ステップにより出力されたカバレッジデータに基づいて前記第１のソースコードに含まれる一度も実行されなかったコードブロックをコメントアウトまたは削除して第２のソースコードを生成する第３ステップと、前記出力された第２のソースコードをコンパイルして第２の実行プログラムを出力する第４ステップと、を含むことを特徴とするコンパイル方法が提供される。
【００１１】
また、本願発明の一態様によれば、第１のソースコードをコンパイルして実行時にカバレッジデータを出力する第１の実行プログラムを出力する第１手順と、前記出力された第１の実行プログラムを実行する第２手順と、前記第２ステップにより出力されたカバレッジデータに基づいて前記第１のソースコードに含まれる一度も実行されなかったコードブロックをコメントアウトまたは削除して第２のソースコードを生成する第３手順と、前記出力された第２のソースコードをコンパイルして第２の実行プログラムを出力する第４手順と、をコンピュータに実行させることを特徴とするコンパイルプログラムが提供される。
【００１２】
また、本願発明の一態様によれば、プログラミング言語で記述された半導体集積回路の第１の設計モデルをコンパイルして実行時にカバレッジデータを出力する第１の実行プログラムを出力する第１ステップと、前記出力された第１の実行プログラムを実行する第２ステップと、前記第２ステップにより出力されたカバレッジデータに基づいて前記第１の設計モデルに含まれる一度も実行されなかったコードブロックをコメントアウトまたは削除して第２の設計モデルを生成する第３ステップと、前記出力された第２の設計モデルをコンパイルして第２の実行プログラムを出力する第４ステップと、前記第２の実行プログラムを実行することによって前記第２の設計モデルを検証する第５ステップと、を含み、前記検証後の第２の設計モデルに基づいて半導体集積回路のアナログ回路設計図を作成し、前記作成したアナログ回路設計図に基づいて半導体集積回路を製造することを特徴とする半導体集積回路製造方法が提供される。
【発明の効果】
【００１３】
本発明によれば、効率的なコンパイルを行うことができるコンパイル方法を提供することができる。
【００１４】
また、本発明によれば、効率的なコンパイルを行うことができるコンパイルプログラムを提供することができる。
【００１５】
また、本発明によれば、効率的なコンパイルを行うことができる半導体集積回路製造方法を提供することができる。
【図面の簡単な説明】
【００１６】
【図１】図１は、第１の実施の形態のコンパイル装置の機能構成を説明する図である。
【図２】図２は、第１の実施の形態のコンパイル装置のハードウェア構成を説明する図である。
【図３】図３は、第１の実施の形態のコンパイル方法を説明するフローチャートである。
【図４】図４は、カバレッジデータの一例を説明する図である。
【図５】図５は、デッドコード情報を生成する処理を説明するフローチャートである。
【図６】図６は、デッドコード情報の一例を説明する図である。
【図７】図７は、無効なコードブロックを機能させないようにする処理を説明するフローチャートである。
【図８】図８は、#pragmaの記述例を説明する図である。
【図９】図９は、デッドコード最適化済みソースコードの一例を示す図である。
【図１０】図１０は、デッドコード最適化済みソースコードの一例を示す図である。
【図１１】図１１は、ＳｙｓｔｅｍＣを用いて半導体集積回路を設計・製造する手順の一例を説明するフローチャートである。
【発明を実施するための形態】
【００１７】
以下に添付図面を参照して、本発明の実施の形態にかかるコンパイル方法、コンパイルプログラムおよび半導体集積回路製造方法を詳細に説明する。なお、これらの実施の形態により本発明が限定されるものではない。
【００１８】
（第１の実施の形態）
本第１の実施の形態にかかるコンパイル方法は、大きく、ソースコード（第１のソースコード）に対して１回目のコンパイルを行って実行時にカバレッジデータを出力する実行プログラム（第１の実行プログラム）を出力する第１ステージと、前記出力された実行プログラムを実行してカバレッジデータを取得する第２ステージと、前記取得したカバレッジデータに基づいてソースコードから一度も実行されなかった無効なコードブロックをコメントアウトまたは削除するデッドコード最適化処理を行ってデッドコード最適化処理済みのソースコード（第２のソースコード）を生成する第３ステージと、デッドコード最適化処理済みのソースコードをコンパイル（２回目のコンパイル）してデッドコード最適化済み実行プログラム（第２の実行プログラム）を出力する第４ステージとから構成される。
【００１９】
図１は、上記概略的に説明したコンパイル方法を実現するためのコンパイル装置の機能構成を説明する図である。なお、本第１の実施の形態において扱うプログラミング言語の例としてＣ言語を取り上げて説明するが、本第１の実施の形態はＣ言語以外のプログラミング言語であっても適用可能である。図１に示すように、コンパイル装置１０は、入力情報受け付け部１と、カバレッジデータ取得指示部２と、デッドコード最適化部３と、コンパイラ部４と、実行環境部５と、デッドコード情報生成部６と、を備えている。
【００２０】
入力情報受け付け部１は、ソースコードおよびユーザコマンドを含む入力情報Ｄ１を外部記憶装置などから受け付ける。入力されるユーザコマンドには、カバレッジデータの取得を指示するオプションコマンド（カバレッジデータ取得指示）と、デッドコード最適化を行うことを指示するオプションコマンドとが含まれている。また、デッドコード最適化を指示するオプションでは、ソースコードが含む無効な命令（コードブロック）をコメントアウトするかソースコードから削除するかを指定することが可能となっている。ここでは、ユーザコマンドに”DEADCODE_OPT_MODE=1”が含まれている場合、無効なコードブロックをコメントアウトし、”DEADCODE_OPT_MODE=2”が含まれている場合、無効なコードブロックを削除する。
【００２１】
カバレッジデータ取得指示部２は、ユーザコマンドに基づいてコンパイルのための条件設定ファイルであるＭａｋｅｆｉｌｅを設定する。具体的には、カバレッジデータ取得指示部２は、１回目のコンパイルのためのＭａｋｅｆｉｌｅには、カバレッジデータを出力する実行ファイルを生成する設定を行う。また、カバレッジデータ取得指示部２は、２回目のコンパイルのためのＭａｋｅｆｉｌｅには、カバレッジデータを出力しない実行ファイルを生成する設定を行う。カバレッジデータ取得指示部２は、設定後のＭａｋｅｆｉｌｅをコンパイラ部４に渡す。
【００２２】
デッドコード最適化部３は、デッドコード情報生成部６により生成される無効なコードブロックを示す情報であるデッドコード情報Ｄ４に基づいて、ソースコードから無効なコードブロックをコメントアウトまたは削除するデッドコード最適化処理を行って、最適化処理後のソースコードをコンパイラ部４に渡す。
【００２３】
コンパイラ部４は、１回目および２回目のコンパイルを実行する。すなわち、コンパイラ部４は、カバレッジデータを出力する実行ファイルを生成する設定がなされたＭａｋｅｆｉｌｅに基づいて、入力情報受け付け部１が受け付けたソースコードをコンパイル（１回目のコンパイル）し、デッドコード最適化前実行プログラムＤ２を出力する。また、コンパイラ部４は、デッドコード最適化部３から渡されたデッドコード最適化処理後のソースコードを、カバレッジデータを出力しない実行ファイルを生成する設定がなされたＭａｋｅｆｉｌｅに基づいてコンパイル（２回目のコンパイル）し、デッドコード最適化済み実行プログラムＤ５を出力する。
【００２４】
実行環境部５は、デッドコード最適化前実行プログラムＤ２を実行することによってカバレッジデータＤ３を出力する。
【００２５】
デッドコード情報生成部６は、実行環境部５が出力したカバレッジデータＤ３に基づいて、ソースコードにおける無効なコードブロックを抽出し、該抽出した無効なコードブロックをデッドコード情報Ｄ４として出力する。
【００２６】
図２は、コンパイル装置１０のハードウェア構成を説明する図である。図示するように、コンパイル装置１０は、ＣＰＵ（Central  Processing  Unit）１１、ＲＯＭ（Read  Only  Memory）１２、ＲＡＭ（Random  Access  Memory）１３、表示部１４、入力部１５を備えるコンピュータ構成となっている。ＣＰＵ１１、ＲＯＭ１２、ＲＡＭ１３、表示部１４、入力部１５は、バスラインを介して夫々接続されている。
【００２７】
ＣＰＵ１１は、本第１の実施の形態のコンパイル方法を実行するコンピュータプログラムであるコンパイルプログラム１６を実行する。表示部１４は、液晶モニタなどの表示装置であり、ＣＰＵ１１からの指示に基づいて、操作画面などのユーザに対する出力情報を表示する。入力部１５は、マウスやキーボードを備えて構成され、ユーザからのコンパイル装置１０の操作が入力される。入力部１５へ入力された操作情報は、ＣＰＵ１１へ送られる。
【００２８】
コンパイルプログラム１６は、ＲＯＭ１２内に格納されており、バスラインを介してＲＡＭ１３へロードされる。ＣＰＵ１１はＲＡＭ１３内にロードされたコンパイルプログラム１６を実行する。具体的には、コンパイル装置１０では、ユーザによる入力部１５からの指示入力に従って、ＣＰＵ１１がＲＯＭ１２内からコンパイルプログラム１６を読み出してＲＡＭ１３内のプログラム格納領域に展開して各種処理を実行する。入力情報Ｄ１は、外部記憶装置などから入力される。ＣＰＵ１１は、外部記憶装置などから入力された入力情報Ｄ１に基づいて各種処理を実行し、この各種処理に際して生じるデータ、すなわち１回目および２回目のコンパイルのためのＭａｋｅｆｉｌｅ、デッドコード最適化前実行プログラムＤ２、カバレッジデータＤ３、デッドコード情報Ｄ４ならびにその他のワークデータを、ＲＡＭ１３内に形成されるデータ格納領域に一時的に記憶させておく。ＣＰＵ１１は、データ格納領域に一時的に記憶させた前述のデータを使用して作成したデッドコード最適化済み実行プログラムＤ５をＲＡＭ１３内のプログラム格納領域あるいは外部記憶装置などに出力する。なお、コンパイルプログラム１６は、ＤＩＳＫなどの記憶装置に格納しておいてもよい。また、コンパイルプログラム１６は、ＤＩＳＫなどの記憶装置にロードしてもよい。
【００２９】
本第１の実施の形態のコンパイル装置１０で実行されるコンパイルプログラム１６は、前述の各部（入力情報受け付け部１、カバレッジデータ取得指示部２、デッドコード最適化部３、コンパイラ部４、実行環境部５、およびデッドコード情報生成部６）を含む構成となっており、上記各部が主記憶装置上にロードされ、入力情報受け付け部１、カバレッジデータ取得指示部２、デッドコード最適化部３、コンパイラ部４、実行環境部５、およびデッドコード情報生成部６が主記憶装置上に生成される。
【００３０】
なお、本第１の実施の形態のコンパイル装置１０で実行されるコンパイルプログラム１６を、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成しても良い。また、本第１の実施の形態のコンパイル装置１０で実行されるコンパイルプログラム１６をインターネット等のネットワーク経由で提供または配布するように構成してもよい。また、本第１の実施の形態のコンパイルプログラム１６を、ＲＯＭ等に予め組み込んで本第１の実施の形態のコンパイル装置１０に提供するように構成してもよい。
【００３１】
次に、コンパイル装置１０にて実現される本発明の第１の実施の形態のコンパイル方法について、具体例を用いて詳細に説明する。図３は、本発明の第１の実施の形態のコンパイル方法を説明するフローチャートである。
【００３２】
ステップＳ１〜ステップＳ１０において、前記した第１ステージ、すなわちカバレッジデータを出力する実行プログラム（デッドコード最適化前実行プログラムＤ２）を出力するまでの処理が実行される。具体的には、まず、入力情報受け付け部１が、ユーザコマンドおよびソースコードを含む入力情報Ｄ１の入力を受け付ける（ステップＳ１）。ここで、ユーザは、カバレッジデータ取得指示およびデッドコード最適化を行うことを指示するオプションコマンドを含めたユーザコマンドを入力するようにする。カバレッジデータ取得指示部２は、入力されたユーザコマンドを解析し（ステップＳ２）、該ユーザコマンドにカバレッジデータ取得指示が含まれているか否かを判定する（ステップＳ３）。
【００３３】
入力されたユーザコマンドにはカバレッジデータ取得指示が含まれているので、ステップＳ３、Ｙｅｓに移行し、カバレッジデータ取得指示部２は、カバレッジデータを取得するオプション（カバレッジ取得オプション）を追加したＭａｋｅｆｉｌｅを作成し（ステップＳ４）、入力されたユーザコマンドからカバレッジデータ取得指示を削除する（ステップＳ５）。
【００３４】
続いて、コンパイラ部４は、入力されたソースコードをＲＡＭ１３上に展開して、展開したソースコードの分析を行い（ステップＳ６）、分析結果とカバレッジ取得オプションが追加されたＭａｋｅｆｉｒｅに基づいてステップＳ７〜ステップＳ１０により１回目のコンパイルを実行する。すなわち、コンパイラ部４は、ＲＡＭ１３上に展開されたソースコードからコード（オブジェクトコード）生成を行い（ステップＳ７）、生成されたコードの最適化を行い（ステップＳ８）、最適化されたコードに対して実行に必要となるファイルをリンクさせ（ステップＳ９）、リンク処理後のコードをデッドコード最適化前実行プログラムＤ２として出力する（ステップＳ１０）。なお、ステップＳ８における最適化は、本発明の第１の実施の形態のデッドコード最適化とは異なり、生成後のコードに対して行われる一般的に知られている最適化である。コンパイラ部４の一連のコンパイル動作は、一般的に入手可能なコンパイラと同様であるので、これ以上の詳細な説明を行わない。
【００３５】
続いて、ステップＳ１１にてカバレッジデータを取得する第２ステージが実行される。すなわち、実行環境部５は、デッドコード最適化前実行プログラムＤ２を実行してカバレッジデータＤ３を取得する（ステップＳ１１）。図４は、カバレッジデータＤ３の一例を説明する図である。図４に示すように、カバレッジデータＤ３は、ソースコードの行（コード行）毎に、実行環境部５において実行された回数を付記した形式となっている。実行回数が０回であるコード行（図４にて♯でマークされている行（符号４００））が実行されない無効なコードブロックとなる。
【００３６】
続いて、図３に戻り、ステップＳ１２〜ステップＳ２０にて、ソースコードから一度も実行されなかった無効な命令（コードブロック）をコメントアウトまたは削除する第３ステージが実行される。すなわち、ステップＳ１１の後、デッドコード情報生成部６は、デッドコード情報Ｄ４を生成する処理を実行する（ステップＳ１２）。図５は、ステップＳ１２の処理をさらに詳しく説明するフローチャートである。
【００３７】
図５において、まず、デッドコード情報生成部６は、カバレッジデータＤ３を読み込む（ステップＳ３１）。そして、デッドコード情報生成部６は、ステップＳ３３〜ステップＳ３７の繰り返し処理に使用するパラメータＮを１とし（ステップＳ３２）、Ｎ行目のコード行が未実行であるか否かを判定する（ステップＳ３４）。未実行である場合（ステップＳ３４、Ｙｅｓ）、デッドコード情報生成部６は、このコード行の行番号Ｎをデッドコード情報Ｄ４に追加する（ステップＳ３５）。そして、デッドコード情報生成部６は、Ｎを１インクリメントし（ステップＳ３６）、ステップＳ３３に移行して、Ｎ行目がカバレッジデータＤ３のファイル終端に達するまでステップＳ３４〜ステップＳ３６の動作を繰り返す。ステップＳ３４において、Ｎ行目のコードが未実行ではなかった場合（ステップＳ３４、Ｎｏ）、ステップＳ３６に移行する。
【００３８】
ステップＳ３３〜ステップＳ３７の繰り返し処理を抜けた後、デッドコード情報生成部６は、デッドコード情報Ｄ４をＲＡＭ１３に出力し（ステップＳ３７）、動作がリターンされる。ステップＳ３１〜ステップＳ３７の動作により図４に示したカバレッジデータＤ３から１０行目、１４行目、および１５行目のコード行を示す番号である１０、１４、１５が含まれたデッドコード情報Ｄ４が作成される。図６は、作成されるデッドコード情報の一例を説明する図である。図６では、デッドコード情報は、ソースコードを構成するファイル毎に未実行の行番号がリスト表示されている。
【００３９】
ステップＳ１２の後、カバレッジデータ取得指示部２に制御が移行し、カバレッジデータ取得指示部２は、ユーザコマンドにカバレッジデータ取得指示が含まれているか否かを再度判定する（ステップＳ３）。２回目の判定の時点においては、ステップＳ５にてユーザコマンドからカバレッジデータ取得指示が削除されているので、ステップＳ３、Ｎｏに移行し、カバレッジデータ取得指示部２は、カバレッジ取得オプションを追加していないＭａｋｅｆｉｌｅを設定する（ステップＳ１３）。
【００４０】
続いて、デッドコード最適化部３は、入力情報Ｄ１に含まれるソースコードをＲＡＭ１３上に展開し、展開したソースコードを分析する（ステップＳ１４）。そして、デッドコード最適化部３は、デッドコード情報Ｄ４を読み込み（ステップＳ１５）、ステップＳ１７〜ステップＳ２０の繰り返し処理に使用するパラメータＮを１とする（ステップＳ１６）。そして、デッドコード最適化部３は、デッドコード情報Ｄ４のＮ番目の項目を読み込み（ステップＳ１８）、コンパイラ部４が前記読み込んだ項目に対応するソースコードにおけるコードブロックを機能させないようにする処理（コメントアウトまたは削除）を実行する（ステップＳ１９）。
【００４１】
図７は、ステップＳ１９における処理をさらに詳しく説明するフローチャートである。図示するように、まず、デッドコード最適化部３は、ソースコードにおけるステップＳ１８にて読み込んだ項目に該当する箇所がデッドコード最適化対象であるか否かを判定する（ステップＳ４１）。Ｃ言語では、#pragmaという、特殊な命令をコンパイラに指示するための記述が用意されている。本第１の実施の形態では、この#pragmaをソースコードに記述することによりデッドコード最適化を行うか否かを関数毎に指定できるようにすることによって、ユーザに柔軟なプログラム環境を提供する。このステップでは、該当する箇所が含まれている関数の直前に、#pragmaによりこの関数がデッドコード最適化対象に指定されているかデッドコード最適化非対象に指定されているかを判定する。なにも指定されていない場合は、デッドコード最適化対象に指定されていることとする。例えば、図８に示すように、#pragma  deadcode_opt  offという指示があった場合、その直後の関数「test」に含まれるコードブロックはデッドコード最適化非対象であると判定する。また、#pragma文による指示が無い場合や、#pragma  deadcode_opt  onという指示があった場合、その直後の関数「test2」に含まれるコードブロックはデッドコード最適化対象であると判定する。
【００４２】
ステップＳ４１において、該当箇所がデッドコード最適化対象ではなかった場合（ステップＳ４１、Ｎｏ）、リターンとなり、該当箇所がデッドコード最適化対象であった場合（ステップＳ４１、Ｙｅｓ）、デッドコード最適化部３は、ユーザコマンドにおいて無効なコードブロックをコメントアウトすることを指示するオプションであるDEADCODE_OPT_MODE=1が指定されているか否かをさらに判定する（ステップＳ４２）。DEADCODE_OPT_MODE=1が指定されていた場合（ステップＳ４２、Ｙｅｓ）、デッドコード最適化部３は、該当箇所をコメントアウトし（ステップＳ４３）、リターンとなる。DEADCODE_OPT_MODE=1が指定されていない場合（ステップＳ４２、Ｎｏ）、すなわちDEADCODE_OPT_MODE=2が指定されている場合、デッドコード最適化部３は、該当箇所を削除し（ステップＳ４４）、リターンとなる。
【００４３】
図３に戻り、ステップＳ１９の後、デッドコード最適化部３は、Ｎを１インクリメントし（ステップＳ２０）、Ｎの値がデッドコード情報Ｄ４のファイル終端に達するまでステップＳ１８〜ステップＳ２０の動作を繰り返す（ステップＳ１７）。ステップＳ１７〜ステップＳ２０の繰り返し処理を抜けると、ＲＡＭ１３上に、デッドコード最適化済みソースコードが完成する。
【００４４】
図９は、DEADCODE_OPT_MODE=1が指定されている場合におけるデッドコード最適化済みソースコードの一例である。図示するように、このソースコード９００は、図４のデッドコード情報Ｄ４に指定されている無効なコードブロックがコメントアウトされ（図中符号９０１が示す箇所）、以降のステップにおいて２回目のコンパイルがなされたとき、該コメントアウトされた箇所からオブジェクトコードが生成されないようになっている。
【００４５】
図１０は、DEADCODE_OPT_MODE=2が指定されている場合におけるデッドコード最適化済みソースコードの一例である。図示するように、このソースコード１０００は、無効なコードブロックが削除され（図中符号１００１が示す箇所）、２回目のコンパイル時には実行されないオブジェクトコードを含まない実行プログラムが生成されるようになっている。なお、ソースコード１０００の例においては、１０行目のコード行を完全に削除するのではなく、９行目のコード行に記載される分岐先であるcase  2から抜けるために、break命令を残すようにしている。
【００４６】
図３に戻り、ステップＳ２１〜ステップＳ２４において、２回目のコンパイルを行ってデッドコード最適化済み実行プログラムＤ５を生成する第４ステップが実行される。２回目のコンパイルは、ステップＳ７〜ステップＳ９と同様の手順によりなされる。すなわち、コンパイラ部４は、ＲＡＭ１３上に記憶されているデッドコード最適化処理がなされたソースコードからオブジェクトコードを生成し（ステップＳ２１）、生成したコードを最適化し（ステップＳ２２）、リンクを行う（ステップＳ２３）。そして、コンパイラ部４は、リンク済みのコードをデッドコード最適化済み実行プログラムＤ５として出力し（ステップＳ２４）、動作を終了する。
【００４７】
このように、本第１の実施の形態によれば、ソースコードのコンパイルを行って実行時にカバレッジデータを出力する実行プログラムを出力し、出力された実行プログラムを実行して得たカバレッジデータに基づいて前記ソースコードに含まれる一度も実行されなかったコードブロックをコメントアウト処理または削除処理してデッドコード最適化済みソースコードを生成し、生成したデッドコード最適化済みソースコードをコンパイルすることによってデッドコード最適化済みの実行プログラムを出力するようにしたので、動的解析に基づいたデッドコード最適化を実行することができるので、効率的なコンパイルを行うことができるようになる。また、ユーザコマンド中のオプションにより無効な命令をコメントアウトするか削除するかを選択できるようにしたので、ユーザは、デバッグ時の利便性を考えてコメントアウトを選択したり削除を選択したりでき、柔軟なプログラミングを行うことができるようになる。
【００４８】
ところで、以上の説明においては、入力されたソースコードをＲＡＭ１３に展開し、ＲＡＭ１３上でコードブロック不機能化処理を実行し、ＲＡＭ１３に記憶されているコードブロック不機能化処理済みのソースコードをコンパイルしてデッドコード最適化済み実行プログラムＤ５を出力するとして説明したが、コードブロック不機能化処理されたソースコードを一旦外部記憶装置などに出力し、外部記憶装置に出力されたソースコードを再度読み込んで２回目のコンパイルを実行するようにしてもよい。
【００４９】
また、コードブロック不機能化処理に進む前にデッドコード情報を一旦外部記憶装置や表示部１４などに出力し、ユーザに無効なコードブロックの存在や位置を知らせるようにしてもよい。さらに、ユーザに出力したデッドコード情報に対する編集を促し、編集されたデッドコード情報に基づいてコードブロックを不機能化する処理に進むようにしてもよい。
【００５０】
（第２の実施の形態）
近年、半導体集積回路の設計現場においては、例えばＳｙｓｔｅｍＣなどのプログラミング言語に基づいてハードウェアのモデリングが行われる。図１１は、ＳｙｓｔｅｍＣを用いて半導体集積回路を設計・製造する手順の一例を説明するフローチャートである。
【００５１】
図示するようにまず、最初に、実現するアルゴリズムをＣ言語を用いて検討・検証する（ステップＳ５１）。アルゴリズムには、フィルタやデータ圧縮／伸張などの画像処理、暗号化／復号化、通信などが考えられる。そして、検証したアルゴリズムをどのようなシステム構成、すなわちアーキテクチャで実現するかを検討する（ステップＳ５２）。
【００５２】
アーキテクチャ検討の結果、どの機能をハードウェア化するかが決まったら、ハードウェア化するアルゴリズムに対してＳｙｓｔｅｍＣを用いてハードウェア階層とインターフェースを定義する。ハードウェアのモデルとしては、例えば詳細なインターフェースを定義しなくてもシステムを高速に検証できるＴＬＭ（Tranzaction  Level  Modeling）モデルが使用される。ＳｙｓｔｅｍＣで記述されたＴＬＭモデルをコンパイルし、得られた実行プログラムを実行することによってＴＬＭモデルの検証を行う（ステップＳ５３）。
【００５３】
ＴＬＭモデルの検証の後、詳細なインターフェースを定義するＢＣＡ（Bus  Cycle  Accurate）モデルを作成し、検証を行う（ステップＳ５４）。ＢＣＡモデルは、入出力のインターフェースをピン精度で定義するモデルである。ＳｙｓｔｅｍＣで記述されたＢＣＡモデルをコンパイルし、得られる実行プログラムを実行することによって、ＢＣＡモデルの検証を行う。
【００５４】
そして、ＢＣＡモデルの検証が終わったら、ビヘイビア合成ツールなどに設計制約条件やスケジューリングのオプションを設定し、ビヘイビア合成を実行し、ビヘイビア合成により得られたＲＴＬ（Register  Transfer  Level）モデルを検証する（ステップＳ５５）。ＲＴＬモデルが設計目標を満足していれば、そのまま論理合成に進み、ゲート回路などのデジタル素子を用いた回路図である論理設計図を作成し、作成した論理設計図を検証する（ステップＳ５６）。そして、検証した論理設計図に基づいてトランジスタなどのアナログ素子を用いた回路図であるアナログ回路設計を作成し、作成したアナログ回路設計を検証する（ステップＳ５７）。そして、検証したアナログ回路図に基づいてＬＳＩプロセスにおけるフォトマスク原画となるマスクパターンのレイアウト図を作成し、作成したレイアウト図を検証し（ステップＳ５８）、該検証したレイアウト図に基づいてリソグラフィプロセスを実行して半導体集積回路を得る（ステップＳ５９）。
【００５５】
このように、半導体設計回路の設計現場においては、ステップＳ５１、Ｓ５３、Ｓ５４などのように、プログラミング言語で記述された設計モデルをコンパイルし、出力された実行プログラムを実行することによって設計モデルの検証を行う工程が含まれる。このような工程のうちの少なくとも一つの工程を、コンパイル装置１０を用いて実現するようにするとよい。具体的には、上記の例においては、Ｃ言語で記述されたアルゴリズム、ＳｙｓｔｅｍＣで記述されたＴＬＭモデル、ＢＣＡモデルを含む設計モデルからカバレッジデータを出力する実行プログラムを作成し、前記作成した実行プログラムを実行してカバレッジデータを取得し、取得したカバレッジデータに基づいて設計モデルに対してデッドコード最適化処理を施す。これにより、不要な設計部分を設計モデルから除去でき、設計モデルの使用面積の減少や動作の高速化などの効果を得ることができる。また、デッドコード最適化済みの設計モデルを再度コンパイルし、得た実行ファイルを実行することにより、デッドコード最適化済みの設計モデルの検証を実行することができる。
【００５６】
なお、以上においてはフォトリソグラフィにより半導体集積回路を製造する場合について述べたが、ナノインプリンティングなど、フォトリソグラフィ以外のプロセスを利用して製造する場合であってもコンパイル装置１０を用いて検証した設計モデルを用いることが可能である。
【符号の説明】
【００５７】
１  入力情報受け付け部、２  カバレッジデータ取得指示部、３  デッドコード最適化部、４  コンパイラ部、５  実行環境部、６  デッドコード情報生成部、１０  コンパイル装置、１１  ＣＰＵ、１２  ＲＯＭ、１３  ＲＡＭ、１４  表示部、１５  入力部、１６  コンパイルプログラム。
【図１】
2010231478.tif 000003
【図２】
2010231478.tif 000004
【図３】
2010231478.tif 000005
【図４】
2010231478.tif 000006
【図５】
2010231478.tif 000007
【図６】
2010231478.tif 000008
【図７】
2010231478.tif 000009
【図８】
2010231478.tif 000010
【図９】
2010231478.tif 000011
【図１０】
2010231478.tif 000012
【図１１】
2010231478.tif 000013