(57)【要約】【課題】ソースプログラム中のデータ領域のアドレスを配置アドレス情報を用いて確定し、アライメント例外発生個所をトレースや実行を伴うことなく判定し、アライメント例外発生の警告、回避方法の提示および自動回避を行う。【解決手段】配置アドレス情報１３を配置アドレス情報取得部３で取得し、ソースプログラム中のデータ領域のアドレスをアドレス確定部４で確定し、ソースプログラム中のアドレス利用個所をアドレス利用個所検出部５で検出し、アドレス利用個所でアライメント例外が発生するかアライメント例外判定部６で判定し、アライメント例外警告部７でアライメント例外発生の警告を行い、アライメント例外分析部８とアライメント例外回避方法提示部９でアライメント例外の回避方法の提示を行い、アライメント例外自動回避指令判定部１０とアライメント例外自動回避部１１でアライメント例外の自動回避を行う。【選択図】  図１
2006018558.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムをオブジェクトコードにコンパイルする際に生成される配置アドレス情報を取得する配置アドレス情報取得手段と、
前記配置アドレス情報と前記ソースプログラムの記述内容を用いて前記ソースプログラムに含まれるデータ領域のアドレスを確定するアドレス確定手段と、
アドレスを利用するデータ領域の定義または使用個所を検出するアドレス利用個所検出手段と、
確定したデータ領域のアドレスとそのデータ領域を定義または利用するときの型のアライメント制約を比較することで前記ソースプログラム中に含まれるアライメント例外発生個所を判定するアライメント例外判定手段と
を備えることを特徴とするアライメント整合装置。
【請求項２】
さらに、前記アライメント例外判定手段により前記アライメント例外発生個所が存在すると判定した場合に、前記ソースプログラム中の前記アライメント例外発生個所について警告を行うアライメント例外警告手段を備えている請求項１に記載のアライメント整合装置。
【請求項３】
さらに、前記ソースプログラム中に前記アライメント例外発生個所が存在すると判定した場合に、アライメント例外発生の原因となるデータ領域またはデータアクセスを分析するアライメント例外分析手段と、
アライメント例外発生の回避方法を提示するアライメント例外回避方法提示手段と
を備えている請求項１または請求項２に記載のアライメント整合装置。
【請求項４】
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを基に、アライメント例外の回避方法として、データ領域へのアクセス型を変更する方法を提示するように構成されている請求項３に記載のアライメント整合装置。
【請求項５】
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがコンパイラシステム自体の指定によるものか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かと、そのデータ領域の配置アドレスがコンパイラシステム自体の指定によるものか否かを基に、アライメント例外回避方法として、データ領域の定義型を変更する方法を提示するように構成されている請求項３に記載のアライメント整合装置。
【請求項６】
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがユーザーの指定によるものであるか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かと、そのデータ領域の配置アドレスをユーザーが指定したものであるか否かを基に、アライメント例外回避方法として、ユーザーによるデータ領域の配置アドレスの指定を変更する方法を提示するように構成されている請求項３に記載のアライメント整合装置。
【請求項７】
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを基に、アライメント例外回避方法として、ユーザーによるデータ領域の定義順序を入れ替える方法を提示するように構成されている請求項３に記載のアライメント整合装置。
【請求項８】
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがリンク時にプログラム上の定義順序に依存して自動決定されているものか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析し、ユーザーがデータ領域にアライン指定を行う手段があるか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析し、ユーザーがデータ領域にアライン指定を行う手段があるか否かを基に、アライメント例外回避方法として、ユーザーがデータ領域にアライン指定を行う方法を提示するように構成されている請求項３に記載のアライメント整合装置。
【請求項９】
さらに、
前記アライメント例外判定手段により前記アライメント例外発生個所が存在すると判定した場合に、アライメント例外発生の原因となるデータ領域またはデータアクセスを分析するアライメント例外分析手段と、
アライメント例外発生を自動回避するアライメント例外自動回避手段と
を備えている請求項１から請求項８までのいずれかに記載のアライメント整合装置。
【請求項１０】
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがリンク時にプログラム上の定義順序に依存して自動決定されているものか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析するように構成され、
前記アライメント例外自動回避手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを基に、自動的にデータ領域の定義順序の入れ替えを行うように構成されている請求項９に記載のアライメント整合装置。
【請求項１１】
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがリンク時にプログラム上の定義順序に依存して自動決定されているものか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析し、ユーザーがデータ領域にアライン指定を行う手段があるか否かを解析するように構成され、
前記アライメント例外自動回避手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析し、ユーザーがデータ領域にアライン指定を行う手段があるか否かを基に、自動的にデータ領域にアライン指定を行うように構成されている請求項９に記載のアライメント整合装置。
【請求項１２】
さらに、ユーザーが、コンパイラにアライメント例外自動回避手段の動作指定を記述したか否かを解析し、またはソースプログラム中にアライメント例外自動回避手段の動作指定を記述したか否かを解析し、前記アライメント例外自動回避手段の動作を選択することのできるアライメント例外自動回避指令判定手段を備えている請求項９から請求項１１までのいずれかに記載のアライメント整合装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースプログラムをオブジェクトコードにコンパイルする際に、ソースプログラム上に記述されたメモリアクセスに関するアライメント例外の発生を発見し、警告ならびに回避することのできるアライメント整合装置に関する。
【背景技術】
【０００２】
計算機の中には、処理の高速性を実現するため、データの型（データ長）に応じて、特定のアドレス境界にデータを配置しなければならない制約を設けているものがある。このような制約は、アライメント制約と呼ばれている。
【０００３】
例えば、３２ビット（４バイト）データは４の倍数のアドレスに、１６ビット（２バイト）データは２の倍数のアドレスに、８ビット（１バイト）データは１の倍数のアドレスにデータを配置する。データの配置は、コンパイラがソースプログラムをコンパイルする際に、ソースプログラム中で定義されるデータの型に応じてアドレス境界を判定し、アライメント制約に合ったアドレスにデータを配置する。
【０００４】
さて、例えばＣ言語のような、ポインタ型を持つプログラミング用高級言語で記述されたソースプログラムにおいては、ポインタにより参照されるデータ領域が、参照しようとするデータ（変数）の型に応じた境界上に配置されているとは限らない。例えば、１６ビットデータ用に宣言された変数が、１６ビットデータとして参照される以外に、３２ビットデータとして参照されるような場合が想定される。もし、アライメント制約に反するデータ参照を行った場合、アライメント例外が発生することになる。
【０００５】
アライメント例外となるソースプログラム上の個所を発見するためには、ソースプログラムを目視トレースする方法や、実際に実行させて異常終了する個所を検出する等の方法がとられる。しかし、トレースや実際に実行させる方法の場合、多大な時間を費やすことと、さらには発見漏れのために完全な回避が難しいといった問題がある。
【０００６】
従来のアライメント整合方法では、ソースプログラムをオブジェクトコードにコンパイルする場合に、所定のアライメント制約が設定された基本データと、別のアライメント制約が設定された変形データとの間の型変換を実施するための命令を利用している。すなわち、前記データ毎の位置を指す一対のポインタを検出し、前記基本データを指す一方のポインタによって当該基本データの前記アライメント制約を認識するとともに、前記変形データを指す他方のポインタによって当該変形データの前記アライメント制約を認識する。そして、両者のアライメント制約が相違した場合、前記型変換による前記アライメント例外が発生すると判定している。また、コンパイラがソースプログラムに含まれ、アライメント例外の発生個所を特定するためのコンパイラ指令を認識し、前記アライメント例外発生個所に例外回避コードを設定して、前記アライメント例外の発生を自動的に回避している（例えば、特許文献１参照。）。
【特許文献１】特開平５−２２４９４４号公報（第３−４頁、第１図）
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかし、上記従来の構成ではポインタが参照するときの型を変化させるような型変換の前後の型のアライメントのみを利用してアライメント例外の発生を判定している。そのため、最終的な配置アドレスが確定しない状態ではアライメント例外の発生を的確に判定することはできない。実際にはアライメント例外が発生しない個所でもアライメント例外が生じると誤判定することがある。また、ポインタが参照するときの型のアライメントが変化するような型変換に注目していることから、使用するアドレスが整数定数で表記されている場合は、アライメント例外を判定できないという課題を有していた。
【０００８】
本発明は、かかる点に鑑み、トレースや実行を伴うことなくアライメント例外発生個所を判定でき、さらにコンパイル時にデータ領域の配置アドレスを確定することで、アライメント例外の発生を警告でき、さらにアライメント例外を回避するための回避方法の提示ができ、さらにアライメント例外の自動回避が可能なアライメント整合装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明は、上記の課題を解決するために次のような手段を講じる。
【００１０】
本発明にかかわるアライメント整合装置は、
ソースプログラムをオブジェクトコードにコンパイルする際に生成される配置アドレス情報を取得する配置アドレス情報取得手段と、
前記配置アドレス情報と前記ソースプログラムの記述内容を用いて前記ソースプログラムに含まれるデータ領域のアドレスを確定するアドレス確定手段と、
アドレスを利用するデータ領域の定義または使用個所を検出するアドレス利用個所検出手段と、
確定したデータ領域のアドレスとそのデータ領域を定義または利用するときの型のアライメント制約を比較することで前記ソースプログラム中に含まれるアライメント例外発生個所を判定するアライメント例外判定手段と
を備えたものである。
【００１１】
この構成によれば、配置アドレス情報とソースプログラムの記述内容を用いてデータ領域の配置アドレスを確定し、確定したデータ領域のアドレスとアライメント制約の比較を通じてアライメント例外発生個所を判定するので、トレースや実行を伴うことなくアライメント例外発生個所を判定できる。また、アドレスを整数定数で指定された個所についても、トレースや実行を伴うことなくアライメント例外発生個所を判定できる。
【００１２】
上記の構成において、さらに、前記アライメント例外判定手段により前記アライメント例外発生個所が存在すると判定した場合に、前記ソースプログラム中の前記アライメント例外発生個所について警告を行うアライメント例外警告手段を備える構成が好ましい。アライメント例外発生個所が存在するときは、ユーザに的確にそのことを警告することができる。
【００１３】
また、上記構成において、さらに、
前記ソースプログラム中に前記アライメント例外発生個所が存在すると判定した場合に、アライメント例外発生の原因となるデータ領域またはデータアクセスを分析するアライメント例外分析手段と、
アライメント例外発生の回避方法を提示するアライメント例外回避方法提示手段と
を備える構成が好ましい。
【００１４】
この構成によれば、アライメント例外分析手段がアライメント例外の発生原因を分析し、アライメント例外回避方法提示手段が前記分析結果に基づいてアライメント例外発生の回避方法を提示する。これにより、アライメント例外の未然防止を行うことができる。
【００１５】
また、上記構成において、
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを基に、アライメント例外の回避方法として、データ領域へのアクセス型を変更するように構成されていることが好ましい。
【００１６】
また、上記構成において、
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがコンパイラシステム自体の指定によるものか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かと、そのデータ領域の配置アドレスがコンパイラシステム自体の指定によるものか否かを基に、アライメント例外回避方法として、データ領域の定義型を変更する方法を提示するように構成されていることが好ましい。
【００１７】
システム指定は、配置アドレスの決定方法の１つであり、データ領域の配置アドレスはメモリのある範囲でなければならないなどの制約がある場合、リンク時にリンカ自身が指定する配置アドレスであることを指す。
【００１８】
また、上記構成において、
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがユーザーの指定によるものであるか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かと、そのデータ領域の配置アドレスをユーザーが指定したものであるか否かを基に、アライメント例外回避方法として、ユーザーによるデータ領域の配置アドレスの指定を変更する方法を提示するように構成されていることが好ましい。
【００１９】
ユーザー指定は、配置アドレスの決定方法の１つであり、ソフトウェアのリンク時にユーザーが指定した配置アドレスであることを指す。
【００２０】
また、上記構成において、
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを基に、アライメント例外回避方法として、ユーザーによるデータ領域の定義順序を入れ替える方法を提示するように構成されていることが好ましい。
【００２１】
自動決定は、配置アドレスの決定方法の１つであり、ソフトウェアのリンク時に、リンカがプログラム上のデータ領域の定義順序に依存して自動決定した配置アドレスであることを指す。
【００２２】
また、上記構成において、
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがリンク時にプログラム上の定義順序に依存して自動決定されているものか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析し、ユーザーがデータ領域にアライン指定を行う手段があるか否かを解析するように構成され、
前記アライメント例外回避方法提示手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析し、ユーザーがデータ領域にアライン指定を行う手段があるか否かを基に、アライメント例外回避方法として、ユーザーがデータ領域にアライン指定を行う方法を提示するように構成されていることが好ましい。
【００２３】
また、上記の構成において、さらに、
前記アライメント例外判定手段により前記アライメント例外発生個所が存在すると判定した場合に、アライメント例外発生の原因となるデータ領域またはデータアクセスを分析するアライメント例外分析手段と、
アライメント例外発生を自動回避するアライメント例外自動回避手段と
を備えることが好ましい。
【００２４】
この構成によれば、ユーザーはソースプログラムに含まれるアライメント例外発生個所について、そのアライメント例外の発生を自動回避することができる。
【００２５】
また、上記構成において、
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがリンク時にプログラム上の定義順序に依存して自動決定されているものか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析するように構成され、
前記アライメント例外自動回避手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを基に、自動的にデータ領域の定義順序の入れ替えを行うように構成されていることが好ましい。
【００２６】
また、上記構成において、
前記アライメント例外分析手段は、アライメント例外発生の原因となるデータ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスがリンク時にプログラム上の定義順序に依存して自動決定されているものか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析し、ユーザーがデータ領域にアライン指定を行う手段があるか否かを解析するように構成され、
前記アライメント例外自動回避手段は、前記アライメント例外分析手段にて解析された、データ領域がソースプログラム中に領域定義されているか否かを解析し、そのデータ領域の配置アドレスが自動決定であるか否かを解析し、同一翻訳単位中のデータ領域の定義順序を入れ替えることでアライメント例外が発生しなくなるか否かを解析し、ユーザーがデータ領域にアライン指定を行う手段があるか否かを基に、自動的にデータ領域にアライン指定を行うように構成されていることが好ましい。
【００２７】
また、上記の構成において、さらに、ユーザーが、コンパイラにアライメント例外自動回避手段の動作指定を記述したか否かを解析し、またはソースプログラム中にアライメント例外自動回避手段の動作指定を記述したか否かを解析し、前記アライメント例外自動回避手段の動作を選択することのできるアライメント例外自動回避指令判定手段を備えていることが好ましい。
【発明の効果】
【００２８】
本発明によれば、第１には、ユーザーはソースプログラムをオブジェクトコードにコンパイルする際に、配置アドレス情報を利用してデータ領域の配置アドレスを確定し、トレースや実行を伴うことなくアライメント例外が発生する個所を判定でき、また、アドレスを整数定数で指定された個所についてもトレースや実行を伴うことなくアライメント例外が発生する個所を判定できる（請求項１対応）。
【００２９】
また、本発明によれば、第２には、ユーザーはソースプログラムに含まれるアライメント例外発生個所を、警告メッセージとして把握することができる（請求項２対応）。
【００３０】
また、本発明によれば、第３には、ユーザーはソースプログラムに含まれるアライメント例外発生個所について、そのアライメント例外の回避方法を知ることができる（請求項３〜８対応）。
【００３１】
また、本発明によれば、第４には、ユーザーはソースプログラムに含まれるアライメント例外発生個所について、そのアライメント例外の発生を自動回避することができる（請求項９〜１２対応）。
【発明を実施するための最良の形態】
【００３２】
以下、本発明にかかわるアライメント整合装置の実施の形態を図面に基づいて詳細に説明する。
【００３３】
図１に本発明の実施の形態におけるコンパイラの構成図を示す。コンパイラＥ２には、ソースプログラムＥ１の構文を解析する構文解析部１、構文解析結果から中間言語を生成する中間言語生成部２、配置アドレス情報１３を取得する配置アドレス情報取得部３、中間言語の配置アドレスを決定するアドレス確定部４、配置アドレスの決定した中間言語からアドレス利用個所を検出するアドレス利用個所検出部５、検出されたアドレス利用個所についてアライメント例外を判定するアライメント例外判定部６、アライメント例外の判定結果によって警告を行うアライメント例外警告部７、アライメント例外発生の原因となるデータ領域またはデータアクセスを分析するアライメント例外分析部８、アライメント例外の発生の仕方によって使用者に回避方法の提示を行うアライメント例外回避方法提示部９、アライメント例外の自動回避を行うかを判定するアライメント例外自動回避指令判定部１０、アライメント例外の自動回避を行うアライメント例外自動回避部１１、中間言語からオブジェクトコードＥ４を生成するコード生成部１２が含まれる。
【００３４】
図２は、配置アドレス情報１３について説明するためのコンパイラツールチェーンの図である。配置アドレス情報１３は、ソースプログラムＥ１をコンパイラＥ２でコンパイルし、リンカＥ３でリンクし、ソフトウェア実行形式ファイル２１を作成する段階で生成される。配置アドレス情報１３は、ソフトウェア実行形式ファイル２１に含まれる変数や関数についての配置アドレスに関する情報を含む。
【００３５】
図３は、配置アドレス情報１３の実際の例である。配置アドレス情報１３はソフトウェア実行形式ファイル２１に含まれる変数や関数のデータ領域名、配置アドレス、配置アドレス決定の方法、データ領域のアライン値、データ領域のサイズ、データ領域の結合、データ領域が定義される翻訳単位（ファイル名）についての情報を持つ。
【００３６】
この配置アドレス情報１３に含まれる「配置アドレスの決定方法」には３種類ある。１つ目は、「システム指定」である。これは、データ領域の配置アドレスはメモリのある範囲でなければならないなどの制約がある場合、リンク時にリンカ自身が指定する配置アドレスであることを指す。また、２つ目は、「ユーザー指定」である。これは、ソフトウェアのリンク時にユーザーが指定した配置アドレスであることを指す。また、３つ目は、「自動」である。これは、ソフトウェアのリンク時に、リンカがプログラム上のデータ領域の定義順序に依存して自動決定した配置アドレスであることを指す。
【００３７】
この配置アドレス情報１３はデータファイルでもよいし、メモリ上のデータ構造であってもよい。
【００３８】
図４は、本発明の実施の形態におけるアライメント制約の例である。ハードウェアによってアライメント制約に違いはあるが、本実施の形態では、ごく一般的なアライメント制約である３２ビットデータのアライメント制約が４バイトの倍数であり、１６ビットデータのアライメント制約が２バイトの倍数であり、８ビットデータのアライメント制約が１バイトの倍数であるとする。
【００３９】
なお、構文解析部１と中間言語生成部２とコード生成部１２については、既存の処理と同様の処理であり、本発明の主眼ではないため、詳細な説明は省略する。
【００４０】
以下、本発明の主眼である配置アドレス情報取得部３、アドレス確定部４、アドレス利用個所検出部５、アライメント例外判定部６、アライメント例外警告部７、アライメント例外分析部８、アライメント例外回避方法提示部９、アライメント例外自動回避指令判定部１０ならびにアライメント例外自動回避部１１について順次説明する。
【００４１】
図５は、配置アドレス情報取得部３の詳細を示すフローチャートである。配置アドレス情報取得部３は、配置アドレス情報１３を読み込む（Ｓ０１）。次に、配置アドレス情報テーブル３１を生成し、読み込んだ配置アドレス情報１３を記録する（Ｓ０２）。
【００４２】
図６は、配置アドレス情報テーブル３１の例である。配置アドレス情報テーブル３１は、データ領域が定義される翻訳単位（ファイル名）、データ領域の名前、データ領域の配置アドレス、データ領域の配置アドレスの決定方法、データ領域のアライン値、データ領域のサイズ、データ領域の結合についての情報を持つ。
【００４３】
この配置アドレス情報テーブル３１には、配置アドレス情報１３に記述されていた配置アドレス情報、すなわち外部変数（ｅｘｔｅｒｎ）と静的変数（ｓｔａｔｉｃ）と関数に関しての情報が記録される。
【００４４】
次に、アドレス確定部４の詳細について説明する。図７は、アドレス確定部４の詳細を示すフローチャートである。アドレス確定部４は、アドレス変換部４１とアドレス演算部４２から構成される。
【００４５】
アドレス変換部４１では、中間言語生成部２で生成された中間言語を走査する（Ｓ１１）。アドレス変換部４１は、中間言語の中に変数が記述されているかどうかを判定し（Ｓ１２）、変数が含まれていれば（Ｓ１２でＹｅｓ）、その変数について配置アドレス情報テーブル３１を検索する（Ｓ１３）。変数の配置アドレス情報が配置アドレス情報テーブル３１に含まれているかどうか判定する（Ｓ１４）。変数の配置アドレス情報が配置アドレス情報テーブル３１に含まれている場合（Ｓ１４でＹｅｓ）、その変数は外部変数または静的変数とみなし、その変数をアドレス参照式に書き換える（Ｓ１５）。また、変数の配置アドレス情報が配置アドレス情報テーブル３１に含まれていない場合（Ｓ１４でＮｏ）、その変数は局所変数または関数仮引数とみなす。局所変数または関数仮引数は、配置アドレスが一定ではないため、変数の型のアライメント制約のバイト数の倍数という仮のアドレスを与え、その変数をアドレス参照式に書き換える（Ｓ１６）。
【００４６】
アドレス演算部４２では、アドレス変換部４１によってアドレスの確定した中間言語を走査する（Ｓ１７）。中間言語に演算式が含まれるか判定し（Ｓ１８）、含まれていればその演算を畳み込む（Ｓ１９）。畳み込まれた式について、その式において、変数の値設定が行われるか判定する（Ｓ２０）。変数の値設定が行われるのであれば、その関数内に限り、その変数の使用先に演算結果を伝播する（Ｓ２１）。演算の畳み込み（Ｓ１９）と演算結果の伝播（Ｓ２１）は既存技術と同様の処理であり、本発明の主眼ではないため、詳細な説明は省略する。
【００４７】
図８を利用し、アドレス確定部４の動作例を説明する。図８の（ａ）はソースプログラムの例である。このソースファイルをコンパイル・リンクし、配置アドレス情報として図８の（ｂ）が得られたとする。
【００４８】
まず、アドレス確定部４によりアドレス値の確定が行われる。図８の（ｃ）は、図８の（ａ）のソースプログラムについてアドレス変換部４１の処理が終了した状態を表したものである。図８の（ｂ）の配置アドレス情報により、行０００１と行０００２と行０００３と行０００７の変数宣言部分と、行００１０と行００１１と行００１８と行００１９の変数使用部分について、アドレス参照式への書き換えが行われる（Ｓ１５）。
【００４９】
また、図８の（ｂ）の配置アドレス情報に含まれていない変数として、行０００５と行０００８の変数宣言部分と、行００１３と行００１４と行００１６と行００１８の変数使用部分について、その変数の型のアライメント制約のバイト数の倍数という仮のアドレスへのアドレス参照式への書き換えが行われる（Ｓ１６）。
【００５０】
図８の（ａ）の場合、関数仮引数である変数ｓａｒｇは１６ビット（２バイト）変数であるので、仮のアドレス値として１６ビットデータのアライメント制約である２バイトの倍数であるという意味の“２ｎ”をアドレスとして与える。同じく、局所変数である変数ｌｃｘにはアライメント制約が４バイトであるという意味の“４ｎ”をアドレスとして与える。
【００５１】
次に、アドレス演算部４２により演算が行われる。図８の（ｄ）は、図８の（ｃ）の変数がアドレス参照式に変換されたものについて、アドレス演算部４２の処理が終了した状態を表したものである。アドレス演算部４２の演算処理（Ｓ２０とＳ２１）により、行００１０に書かれていた式が畳み込まれる。また、アドレス演算部４２の値の伝播（Ｓ２０とＳ２１）により、行００１１と行００１４と行００１６で設定される値が行００１８に伝播される。行００１４と行００１６の値は同じ変数の個所に伝播される。
【００５２】
以上の処理を実施することにより、中間言語に含まれる変数は全てアドレス参照式に書き換えられる。
【００５３】
次に、アドレス利用個所検出部５の詳細について説明する。図９は、アドレス利用個所検出部５の詳細を示すフローチャートである。
【００５４】
アドレス利用個所検出部５では、アドレス変換部４で変数を全てアドレス参照式に変換した中間言語を走査する（Ｓ３１）。アドレス利用個所検出部５は、中間言語がデータ領域定義か判定する（Ｓ３２）。データ領域定義であった場合（Ｓ３２がＹｅｓ）、アドレス利用個所テーブル５１にデータ領域定義個所として、ソースプログラム上の行番号、定義するデータ型、ならびにデータ領域の名前を登録する（Ｓ３３）。また、データ領域定義でない場合（Ｓ３２でＮｏ）、中間言語がデータアクセス式か判定する（Ｓ３４）。データ領域アクセスであった場合（Ｓ３４でＹｅｓ）、データアクセス個所として、ソースプログラム上の行番号、読出か書込（初期化を含む）か、アクセス時のデータ型、ならびにアクセスするデータ領域の名前を登録する（Ｓ３５）。次に、その式がポインタ変数へのアドレス設定か判定する（Ｓ３６）。ポインタ変数へのアドレス設定であった場合（Ｓ３６でＹｅｓ）、ポインタ変数へのアドレス設定として、ソースプログラム上の行番号、設定するアドレスの値、設定するデータ領域名、ならびにデータ領域の名前を登録する（Ｓ３７）。
【００５５】
図８の（ｄ）と図１０を用いて、アドレス利用個所検出部５の動作例を説明する。図８の（ｄ）は図８の（ａ）をアドレス確定部４で処理した結果である。図１０は、図８の（ｄ）に対してアドレス利用個所検出部５が生成したアドレス利用個所テーブル５１の例である。
【００５６】
まず、アドレス利用個所検出部５は図８の（ｄ）に示される中間言語を走査する（Ｓ３１）。アドレス利用個所検出部５はデータ領域定義として、行０００１と行０００２と行０００３と行０００５と行０００７と行０００８を判定し、それぞれ図１０に示すアドレス利用個所テーブル５１に書き込む。また、アドレス利用個所検出部５はデータ領域アクセスとして、行００１０と行００１１と行００１３と行００１４と行００１６と行００１８と行００１９を判定し、それぞれ図１０に示すアドレス利用個所テーブル５１に書き込む。また、ポインタへのアドレス設定式として、行００１１を判定し、図１０に示すアドレス利用個所テーブル５１に書き込む。
【００５７】
以上により、中間言語に含まれるアドレス利用個所を全て検出できる。
【００５８】
次に、アライメント例外判定部６の詳細について説明する。図１１は、アライメント例外判定部６の詳細を示すフローチャートである。
【００５９】
アライメント例外判定部６では、アドレス利用個所検出部５で生成されたアドレス利用個所テーブル５１を走査する（Ｓ４１）。まず、アドレス利用個所がデータ領域定義かどうか判定する（Ｓ４２）。アドレス利用個所がデータ領域定義ならば（Ｓ４２がＹｅｓ）、データ領域の定義型からアライメント制約を調べる（Ｓ４３）。また、そのデータ領域の配置アドレスを、配置アドレス情報テーブル３１を参照して調べる（Ｓ４４）。アドレス利用個所がデータ領域定義でないならば（Ｓ４２がＮｏ）、アドレス利用個所がデータ領域アクセスか調べる（Ｓ４５）。アドレス利用個所がデータ領域アクセスならば（Ｓ４５でＹｅｓ）、データ領域アクセスの型からアライメント制約を調べる（Ｓ４６）。また、アクセスするデータ領域の配置アドレスを調べる（Ｓ４７）。アドレス利用個所がデータ領域アクセスでないならば（Ｓ４５がＮｏ）、アドレス利用個所はポインタ変数へのアドレス設定であるので、ポインタ変数の参照する型からアライメント制約を調べる（Ｓ４８）。また、ポインタ変数に設定されるアドレスを調べる（Ｓ４９）。
【００６０】
アライメント例外判定部６は、Ｓ４２からＳ４９によってアドレス利用個所テーブル５１から得られたアドレスがアライメント制約を満たしているか、アドレスをアライメント制約のバイト数で剰余算することで調べる（Ｓ５０）。この計算結果から、現在調べているアドレス利用個所においてアライメント例外が発生するか判定する（Ｓ５１）。このステップＳ５１の判定は、ステップＳ５０での剰余算で剰余が０以外ならばアライメント例外が発生する（Ｙｅｓ）とし、剰余が０ならばアライメント例外は発生しない（Ｎｏ）とする。アライメント例外が発生すると判定された場合（Ｓ５１でＹｅｓ）、アドレス利用個所テーブル５１にアライメント例外が発生すると書き込む（Ｓ５２）。
【００６１】
図１２と図１３を用いて、アライメント例外判定部６の動作例を説明する。図１２の（ａ）はソースプログラム例、図１２の（ｂ）は図１２の（ａ）をコンパイル・リンクして得られた配置アドレス情報の例、図１２の（ｃ）は図１２の（ａ）に対して図１２の（ｂ）の配置アドレス情報を用いてアドレス演算部４が処理したアドレスが確定した中間言語である。また、図１３の（ａ）は、図１２の（ｃ）に対してアドレス利用個所検出部５が生成したアドレス利用個所テーブル５１である。また、図１３の（ｂ）はアライメント例外判定部６が図１３の（ａ）のアドレス利用個所テーブル５１に対してアライメント例外の判定を行った結果である。
【００６２】
まず、アライメント例外判定部６は、図１３の（ａ）のアドレス利用個所テーブル５１を走査し（Ｓ４１）、データ領域ｌｘの領域定義を発見する。データ領域ｌｘはｌｏｎｇ型（３２ビットデータ）なので、アライメント制約は４バイトであると認識する（Ｓ４３）。また、対象となる配置アドレスは０ｘ０００００００３である（Ｓ４４）。この４と０ｘ０００００００３を用いて、剰余算を行う（Ｓ５０）。剰余は３であり、アライメント例外が発生すると判定する（Ｓ５１）。アライメント例外なのでアドレス利用個所テーブル５１にアライメント例外が発生すると判定結果を書き込む（Ｓ５２）。以降、他のデータも同様の手順で判定する。変数ｌｃｘのアドレス利用個所のように、アドレスが２の倍数（２ｎ）や４の倍数（４ｎ）などと表されている部分もあるが、この場合も剰余を計算して判定する。
【００６３】
以上により、アドレス利用個所全てでアライメント例外の発生の有無を判定できる。
【００６４】
次に、アライメント例外警告部７の詳細について説明する。図１４は、アライメント例外警告部７の詳細を示すフローチャートである。
【００６５】
アライメント例外警告部７は、アライメント例外判定部６でアライメント例外発生の判定が行われたアドレス利用個所テーブル５１を走査し（Ｓ６１）、アドレス利用個所においてアライメント例外が発生するとされているか判定する（Ｓ６２）。アライメント例外が発生するとされている場合（Ｓ６２がＹｅｓ）、アライメント例外警告部７はディスプレイやプリンタまたはログファイルなどにアライメント例外の発生を警告するメッセージを出力する（Ｓ６３）。
【００６６】
図１３の（ｂ）を用いて、アライメント例外警告部７の動作例を説明する。アライメント例外警告部７は、図１３の（ｂ）のアドレス利用個所テーブル５１を走査し（Ｓ６１）、行０００１と行０００２と行００１１と行００１８がアライメント例外の発生原因となると警告するメッセージを出力する（Ｓ６２とＳ６３）。
【００６７】
次に、アライメント例外分析部８およびアライメント例外回避方法提示部９の詳細について説明する。アライメント例外分析部８は、アライメント例外発生個所と発生の原因になるアドレスを認識し、その結果に基づいてアライメント例外回避方法提示部９は、状況に応じた回避方法を提示する。図１５は、アライメント例外分析部８およびアライメント例外回避方法提示部９の詳細を示すフローチャートである。
【００６８】
アライメント例外分析部８は、アライメント例外判定部６でアライメント例外発生の判定が行われたアドレス利用個所テーブル５１を走査し（Ｓ７１）、アドレス利用個所についてアライメント例外が発生するとされているか判定する（Ｓ７２）。
【００６９】
アライメント例外が発生するとされている場合（Ｓ７２がＹｅｓ）、アライメント例外が発生するとされるデータ領域がソースコード上で領域定義されているか調べる（Ｓ７３）。データ領域がソースコード上で領域定義されていない場合（Ｓ７３でＮｏ）、そのアドレスはメモリマップドレジスタなどの配置アドレスを変更できないメモリの特定領域を指すアドレスであると判断する。そのようなアドレスによるアライメント例外の原因は、アクセス時の型がアライメント制約に合っていないためと見なせる。このため、アライメント例外回避方法提示部９は、回避方法としてアクセス型の変更を設定する（Ｓ７４）。
【００７０】
データ領域がソースコード上で領域定義されている場合（Ｓ７３でＹｅｓ）、アライメント例外分析部８は、アライメント例外が発生するとされるデータ領域の配置アドレスがリンク時にプログラム上のデータ領域の定義順序に依存して自動決定されたものか調べる（Ｓ７５）。データ領域の配置アドレスが自動決定されたものでない場合（Ｓ７５でＮｏ）、その配置アドレス指定はシステムによるものかユーザーによるものか調べる（Ｓ７６）。配置アドレスがシステム指定の場合、ユーザーは配置アドレスを変更する方法が無いとみなす。また、配置アドレスがユーザー指定の場合は、配置アドレスの指定変更が可能とみなす。
【００７１】
配置アドレスがシステム指定の場合（Ｓ７６でシステム）、アライメント例外回避方法提示部９は、回避方法として、データ領域の定義型を配置したいアライメント制約のデータ型に変更する方法を設定する（Ｓ７７）。この回避方法を用いることで、直接に配置アドレスを指定するのでなく、リンクする際に、データ領域にアライメント制約に合うように配置アドレスを設定されるようにすることができる。配置アドレスが変更可能の場合（Ｓ７６でユーザー）、アライメント例外回避方法提示部９は、アライメント例外の発生原因となるアドレスをもつデータ領域について、アライメント制約に合う配置アドレスを新しく提示する（Ｓ７８）。この回避方法を用いることで、ユーザーは配置アドレス指定をアライメント制約に合ったものに変更できる。
【００７２】
データ領域の配置アドレスが自動設定されたものである場合（Ｓ７５でＮｏ）、アライメント例外分析部８は、そのデータ領域が他のデータ領域と配置アドレスを入れ替えることができるかを調べる（Ｓ７９）。図１６はステップＳ７９の詳細を表すフローチャートである。
【００７３】
アライメント例外分析部８は、ステップＳ７９において、まずアライメント例外発生の原因になるデータ領域（これを入れ替え元とする）の定義型からアライメント制約を求める（Ｓ９１）。次に、配置アドレス情報テーブル３１を参照し、データ領域の定義情報をひとつ得る（Ｓ９２）。ステップＳ９２でデータ領域定義を選べたかどうか調べ（Ｓ９３）、データ領域定義が選べた場合は（Ｓ９３でＹｅｓ）、そのデータ領域の配置アドレス（これを入れ替え先アドレスとする）が入れ替え元のデータ領域のアライメント制約に合うかを調べる（Ｓ９４）。アライメント制約に合わない場合（Ｓ９４でＮｏ）、ステップＳ９２に戻り、他のデータ領域定義情報を求める。
【００７４】
入れ替え元のアライメント制約に合う場合（Ｓ９４がＹｅｓ）、入れ替え先アドレスから入れ替え元のデータ領域のサイズの範囲に含まれるデータ領域を求める（Ｓ９５）。このステップＳ９５で求められるデータ領域を入れ替え先データ領域候補とする。入れ替え先データ領域候補は、１つまたは配置アドレスが連続する複数のデータ領域で構成される。次に、その入れ替え先データ領域候補に含まれる全てのデータ領域の定義が入れ替え元のデータ領域の定義と同じ翻訳単位で定義されているかを調べる（Ｓ９６）。データ領域定義の入れ替えによるアライメント例外の回避をソースプログラムの書き換えによって行うためには、入れ替えるデータ領域が同一翻訳単位で定義されている必要がある。入れ替えるデータ領域の定義が同一翻訳単位に無い場合（Ｓ９６でＮｏ）、入れ替え対象とはせず、ステップＳ９２に戻る。
【００７５】
入れ替えるデータ領域の定義が同一翻訳単位にあるならば（Ｓ９６でＹｅｓ）、入れ替え先データ領域候補に含まれる全てのデータ領域の配置アドレスが自動決定かどうかを調べる（Ｓ９７）。ひとつでもデータ領域の配置アドレスが自動決定でないものが含まれるならば（Ｓ９７でＮｏ）、入れ替え対象とはせず、ステップＳ９２に戻る。
【００７６】
全てのデータ領域の配置アドレスが自動設定ならば（Ｓ９７でＹｅｓ）、入れ替えを行った場合の仮の配置アドレス情報テーブル３１を作成する（Ｓ９８）。次に、仮の配置アドレス情報テーブル３１を参照し、データ領域の入れ替えに関係しないデータ領域の配置アドレスが変化しないか調べる（Ｓ９９）。入れ替えに関係しないデータ領域の配置アドレスが変化する場合（Ｓ９９でＮｏ）、入れ替え対象とはせず、ステップＳ９２に戻る。
【００７７】
入れ替えに関係しないデータ領域の配置アドレスが変わらない場合（Ｓ９９でＹｅｓ）、その入れ替えを行った場合の仮のアドレス利用個所テーブルを作成する（Ｓ１００）。次に、仮のアドレス利用個所テーブルについてアライメント例外判定を行う（Ｓ１０１）。次に、入れ替えによって新たにアライメント例外が発生するかどうか調べ（Ｓ１０２）、新たにアライメント例外が発生する場合（Ｓ１０２でＹｅｓ）、入れ替え対象とはせず、ステップＳ９２に戻る。
【００７８】
新たにアライメント例外が発生しないならば（Ｓ１０２でＮｏ）、データ領域の定義を入れ替えることでアライメント例外が可能と判断し（Ｓ１０３）、ステップＳ７９はＹｅｓとなる。アライメント制約に合うメモリアドレスが求められなくなった場合（Ｓ９３でＮｏ）、データ領域定義の入れ替えでアライメント例外が回避できないと判断し（Ｓ１０４）、ステップＳ７９はＮｏとなる。
【００７９】
図１７を用いて、ステップＳ７９の動作例を説明する。図１７の（ａ）は、ソースプログラムの例、図１７の（ｂ）は、図１７の（ａ）をコンパイル・リンクして得られた配置アドレス情報テーブル３１の例、図１７（ｃ）は、アドレス利用個所テーブル５１の例、図１７の（ｄ）は図１７の（ｂ）をメモリの図として表したものである。また、図１８の（ａ）は、ステップＳ７９で仮に定義領域を入れ替えた場合のメモリ配置の例、図１８の（ｂ）は、ステップＳ７９で仮に定義領域を入れ替えた場合のソースプログラムの例、図１８の（ｃ）は、ステップＳ７９で仮に定義領域を入れ替えた場合のアドレス利用個所テーブル５１の例である。
【００８０】
図１７の（ａ）と図１７の（ｂ）と図１７の（ｃ）から、ｃａｒｙ［０］へのアクセスでアライメント例外が発生し、その配列ｃａｒｙはソースコード上に定義されており、またその配置アドレスは自動設定であることが認識でき、ステップＳ７９が実行される。
【００８１】
まず、図１７の（ｂ）のアドレス利用個所テーブル５１から、入れ替え元の配列ｃａｒｙに必要なアライメント制約として４バイトが求められる（Ｓ９１）。次に、図１７の（ｂ）のアドレス利用個所テーブル５１から、データ領域定義として変数ｌｘの定義を得る（Ｓ９２）。変数ｌｘが求められたので（Ｓ９３でＹｅｓ）、変数ｌｘの配置アドレス０ｘ００００１０００を入れ替え先アドレスとし、配列ｃａｒｙのアライメント制約４バイトに合うか調べる（Ｓ９４）。０ｘ００００１０００番地はアライメント制約４バイトに合うので（Ｓ９４でＹｅｓ）、図１７の（ｂ）の配置アドレス情報テーブル３１を参照し、０ｘ００００１０００から配列ｃａｒｙの領域サイズ４バイトの範囲に含まれるデータ領域を求め、変数ｌｘが入れ替え先データ領域候補となる（Ｓ９５）。次に、図１７の（ｂ）の配置アドレス情報テーブル３１から、変数ｌｘと配列ｃａｒｙが同一翻訳単位で定義されているか調べる（Ｓ９６）。どちらも同じ翻訳単位に含まれることから（Ｓ９７）、仮に入れ替えを行った場合の配置アドレス情報テーブル３１（図１７の（ｄ））を作成する（Ｓ９８）。このとき、変数ｌｘが０ｘ００００１００５番地でなく、０ｘ００００１００８に配置されるが、これは変数ｌｘが３２ビットデータのため、４の倍数である０ｘ００００１００８番地に配置されるからである。次に、変数ｌｘと配列ｃａｒｙの定義順序を入れ替えたことで、入れ替えに関与しないデータ領域の配置アドレスが変わっていないか調べる（Ｓ９９）。図１７の（ｄ）の変数ｃｘ、関数ｆｕｎｃの配置アドレスは変化していない（Ｓ９９でＹｅｓ）。次に、仮に入れ替えを行った場合のアドレス利用個所テーブル５１（図１７の（ｅ））を作成し（Ｓ１００）、アライメント例外が発生しないか判定する（Ｓ１０１）。仮に入れ替えてもアライメント例外が発生しないので（Ｓ１０２）、変数ｌｘと配列ｃａｒｙの入れ替えが可能と判断する（Ｓ１０３）。
【００８２】
図１５に戻り、アライメント例外回避方法提示部９の説明を行う。データ領域定義の入れ替えができる場合（Ｓ７９でＹｅｓ）、回避方法として、データ領域の定義順序の変更を設定する（Ｓ８０）。
【００８３】
データ領域定義の入れ替えができない場合（Ｓ７９でＮｏ）、これはコンパイラの機能として、アライメント例外分析部８は、ユーザーがソースプログラム内に個別のデータ領域に対するアライン指定を記述することのできる機能があるか調べる（Ｓ８１）。アライン指定ができるならば（Ｓ８１でＹｅｓ）、アライメント例外回避方法提示部９は、回避方法として、その領域に対して必要なアライン指定を設定する（Ｓ８２）。アライン指定ができないならば（Ｓ８１でＮｏ）、アライメント例外分析部８は、アライメント例外の回避方法は明確に分からないため、アライメント例外回避方法提示部９は、回避方法として、アライメント例外の発生するデータ領域の配置アドレスをユーザーがリンク時に指定する方法を設定する（Ｓ８３）。
【００８４】
アライメント例外回避方法提示部９は、回避方法の設定（Ｓ７４，Ｓ７７，Ｓ７８，Ｓ８０，Ｓ８２，Ｓ８３）が終われば、ディスプレイやプリンタまたはログファイルなどにアライメント例外の回避方法をメッセージなどの形で提示する（Ｓ８４）。
【００８５】
図１８以降を用いて、アライメント例外回避方法提示部９の動作例を説明する。
【００８６】
図１８は、回避方法としてアクセス型の変更を提示する例である。図１８の（ａ）は、領域定義されていないメモリに対するアクセスを含むソースプログラム例であり、図１８の（ｂ）は、図１８の（ａ）をコンパイル・リンクして得られた配置アドレス情報テーブル３１の例、図１８の（ｃ）はアドレス利用個所情報の例である。このソースプログラムは０ｘ００００１００２番地の領域を３２ビットデータとしてアクセスし、アライメント例外が発生する。アライメント例外分析部８は、アライメント例外発生の原因となる０ｘ００００１００２番地がデータ領域としてソースプログラムに定義されていないことを認識し（Ｓ７３）、アライメント例外回避方法提示部９は、この０ｘ００００１００２番地へアクセスするときの型を１６ビットに変更するよう提示する（Ｓ７４，Ｓ８４）。この提示に従ってソースプログラムを変更したものが図１８の（ｄ）である。また、この変更によって書き換えたプログラムに対する配置アドレス情報の例が図１８の（ｅ）である。このソースプログラムの変更によりアライメント例外は発生しなくなる。
【００８７】
図１９は、回避方法としてデータ領域の定義型の変更を提示する例である。図１９の（ａ）は、１６ビットデータ２つ分の配列ｄａｔａに対する３２ビットデータとしてのアクセスを含むソースプログラム例であり、図１９の（ｂ）は、図１９の（ａ）をコンパイル・リンクして得られた配置アドレス情報の例、図１９の（ｃ）はアドレス利用情報の例である。配列ｄａｔａのアドレスはリンク時にシステムによって指定されたものであるとする。
【００８８】
アライメント例外分析部８は、アライメント例外発生の原因となる配列ｄａｔａ（０ｘ００００１００２番地）がデータ領域としてソースプログラムに定義されていることを認識し（Ｓ７３）、データ領域の配置アドレスがシステムによって指定されたことを認識する（Ｓ７５，Ｓ７６）。これにより、アライメント例外回避方法提示部９は、回避方法として配列ｄａｔａの定義型を３２ビットに変更するよう提示する（Ｓ７７，Ｓ８４）。この提示に従ってソースプログラムを変更したものが図１９の（ｄ）である。また、この変更によって書き換えたプログラムに対する配置アドレス情報の例が図１９の（ｅ）である。このソースプログラムの変更によりアライメント例外は発生しなくなる。
【００８９】
図２０は、回避方法としてデータ領域の配置アドレス変更を提示する例である。図２０の（ａ）は、１６ビットデータ２つ分の配列ｄａｔａに対する３２ビットデータとしてのアクセスを含むソースプログラム例であり、図２０の（ｂ）は、図２０の（ａ）をコンパイル・リンクして得られた配置アドレス情報の例、図２０の（ｃ）は、アドレス利用個所テーブル５１の例である。配列ｄａｔａのアドレスはリンク時にプログラム開発者によって指定されたものであるとする。
【００９０】
アライメント例外分析部８は、アライメント例外発生の原因となる配列ｄａｔａ（０ｘ００００１００２番地）がデータ領域としてソースプログラムに定義されていることを認識し（Ｓ７３）、データ領域の配置アドレスがユーザーによって指定されたことを認識する（Ｓ７５，Ｓ７６）。これにより、アライメント例外回避方法提示部９は、回避方法としてリンク時に配列ｄａｔａの配置アドレス指定を変更するよう提示する（Ｓ７８，Ｓ８４）。この提示に従ってリンク時の配置アドレス設定を変更したものが図２０の（ｄ）である。また、この変更によって書き換わった配置アドレス情報の例が図２０の（ｅ）である。この変更によりアライメント例外は発生しなくなる。
【００９１】
図２１は、回避方法としてデータ領域の定義順序の入れ替えを提示する例である。図２１の（ａ）は、１６ビットデータｓｘ、８ビットデータｃｘ、８ビットデータ４つ分の配列ｃａｒｙを含み、配列ｃａｒｙに対する３２ビットデータとしてのアクセスを含むソースプログラム例である。また、図２１の（ｂ）は、図２１の（ａ）をコンパイル・リンクして得られた配置アドレス情報の例、図２１の（ｃ）は、アドレス利用個所テーブル５１の例である。また、図２２の（ａ）は、図２１の（ｂ）でのｓｘ，ｃｘ，ｃａｒｙに関するメモリの概念図である。
【００９２】
アライメント例外分析部８は、アライメント例外発生の原因となる配列ｃａｒｙ（０ｘ００００１００３番地）がデータ領域としてソースプログラムに定義されていることを認識し（Ｓ７３）、データ領域の配置アドレスがリンク時にプログラム上のデータ領域の定義順序に依存して自動決定されたものであることを認識する（Ｓ７５）。次にデータ領域ｃａｒｙの定義順序が入れ替え可能かを調べ（Ｓ７９）、同一翻訳単位上のデータ領域から、ｓｘとｃｘ（計３バイト)をアライメント制約に合うデータ領域として判断する（Ｓ９１〜Ｓ１０３，Ｓ７９）。これにより、アライメント例外回避方法提示部９は、回避方法として配列ｃａｒｙとデータ領域ｓｘ，ｃｘのデータ定義順序を入れ替えるよう提示する（Ｓ８０，Ｓ８４）。この提示に従ってソースプログラムを入れ替えたものが図２１の（ｄ）である。また、この入れ替えによって書き換えたプログラムに対する配置アドレス情報の例が図２１の（ｅ）である。また、図２２の（ｂ）は、図２１の（ｅ）でのｓｘ，ｃｘ，ｃａｒｙに関するメモリの概念図である。このソースプログラムの変更によりアライメント例外は発生しなくなる。
【００９３】
図２３は、回避方法としてデータ領域へのアライン指定追加を提示する例である。図２３の（ａ）は、８ビットデータ４つ分の配列ｃａｒｙを含み、配列ｃａｒｙに対する３２ビットデータとしてのアクセスを含むソースプログラム例である。また、図２３の（ｂ）は、図２３の（ａ）をコンパイル・リンクして得られた配置アドレス情報の例、図２３の（ｃ）はアドレス利用個所テーブル５１の例である。また、図２４の（ａ）は、図２３の（ｂ）でのメモリの概念図である。
【００９４】
アライメント例外分析部８は、アライメント例外発生の原因となる配列ｃａｒｙ（０ｘ００００１００１番地）がデータ領域としてソースプログラムに定義されていることを認識し（Ｓ７３）、データ領域の配置アドレスがリンク時にプログラム上のデータ領域の定義順序に依存して自動決定されたものであることを認識する（Ｓ７５）。次に、データ領域ｃａｒｙは定義順序の変更が可能かを調べる（Ｓ７９）。図２３の（ａ）の場合、同一翻訳単位上に定義順序の変更の相手となるデータ領域が無いので、定義順序変更はできないと判断する（Ｓ９１，Ｓ９２，Ｓ９３，Ｓ１０４）。次にアライン指定の可否を調べる（Ｓ８１）。ここで、コンパイラの拡張表記で外部変数のアライン指定が可能とすると（Ｓ８１でＹｅｓ）、アライメント例外回避方法提示部９は、回避方法として配列ｃａｒｙにアライン４の指定をするよう提示する（Ｓ８２，Ｓ８４）。この提示に従ってソースプログラムを変更したものが図２３の（ｄ）である。また、この変更によって書き換えたプログラムに対する配置アドレス情報の例が図２３の（ｅ）である。図２４の（ｂ）は、図２３の（ｅ）でのメモリの概念図である。このソースプログラムの変更によりアライメント例外は発生しなくなる。
【００９５】
もし、図２３の（ａ）ならびに図２３の（ｂ）の場合に、コンパイラに特別なアライン指定の機構が無い場合は、アライメント例外分析部８は、ソースプログラム変更などによる回避方法が無いと判断し（Ｓ８１でＮｏ）、アライメント例外の回避方法は明確に分からないため、アライメント例外回避方法提示部９は、回避方法としてアライメント例外の発生するデータ領域の配置アドレスをユーザーがリンク時に指定するよう提示する（Ｓ８３，Ｓ８４）。
【００９６】
以上の機構を用いることで、ユーザーはソースプログラム中のアライメント例外発生個所について、回避方法を知り、実施することができる。
【００９７】
次に、アライメント例外自動回避指令判定部１０の詳細について説明する。アライメント例外自動回避指令判定部１０は、ユーザーによるオプション指定やプラグマ指令などのコンパイラへの指令を受け付け、アライメント例外の自動回避を行うか否かの判定を行う。
【００９８】
図２５は、アライメント例外自動回避指令判定部１０の詳細を示すフローチャートである。
【００９９】
アライメント例外自動回避指令判定部１０は、アライメント例外の自動回避のオプションがコンパイラ起動時に指定されているか調べる（Ｓ１１１）。オプションが指定されていれば（Ｓ１１１がＹｅｓ）、アライメント例外の自動回避を行うと判断する（Ｓ１１２）。また、オプションが指定されていなければ、アライメント例外の自動回避のプラグマ指令がソースプログラム中に含まれているか調べる（Ｓ１１３）。プラグマ指令が含まれている場合（Ｓ１１３でＹｅｓ）、アライメント例外の自動回避を行うと判断する（Ｓ１１２）。また、プラグマ指令が含まれない場合は（Ｓ１１３でＮｏ）、ユーザーからのアライメント例外の自動回避は行わないと判断する（Ｓ１１４）。
【０１００】
図２６の（ａ）は、アライメント例外自動回避部１１の動作を切り替えるオプション指定の例である。図２６の（ａ）では、回避方法としてデータアクセス時の型に合ったアライン指定を行う方法を指定している。また、図２６の（ｂ）は、アライメント例外自動回避部１１の動作を切り替えるプラグマ指令の例である。図２６の（ｂ)では、回避方法としてデータ領域の定義順序を入れ替える方法を指定している。
【０１０１】
次に、アライメント例外自動回避部１１の詳細について説明する。アライメント例外自動回避部１１は、アライメント例外発生個所と発生の原因になるアドレスを認識し、状況に応じた自動回避を行う。アライメント例外自動回避部１１は、前述したアライメント例外回避方法提示部９で説明した回避方法のうち、データ領域の定義順序を変更する回避方法、データ領域にデータアクセス時の型に合ったアライン指定を行う回避方法の２つについて自動実行が可能である。この２つの方法は、ソースプログラム表記またはユーザーの配置アドレス指定と矛盾が生じないため、自動実行が可能である。
【０１０２】
アライメント例外自動回避部１１は、アライメント例外自動回避指令判定部１０でアライメント例外の自動回避を実施すると判定されている場合に実行される。図２７は、アライメント例外自動回避部１１の詳細を示すフローチャートである。
【０１０３】
アライメント例外自動回避部１１は、アライメント例外自動回避指令判定部１０でアライメント例外の自動回避を実施すると判定されたかどうか確認する（Ｓ１２１）。アライメント例外の自動回避を行わない場合（Ｓ１２１でＮｏ）、アライメント例外自動回避部１１は処理を行わずに終了する。アライメント例外の自動回避を行う場合（Ｓ１２１でＹｅｓ）、アライメント例外発生の判定が行われたアドレス利用個所テーブル５１を走査し（Ｓ１２２）、アライメント例外が発生するとされているか判定する（Ｓ１２３）。アライメント例外が発生するとされている場合（Ｓ１２３がＹｅｓ）、そのアドレスにあるデータ領域が領域定義されたものか調べる（Ｓ１２４）。データ領域が領域定義されていない場合（Ｓ１２４でＮｏ）、自動回避対象でないので自動回避ができない旨を報告する（Ｓ１３１）。データ領域が領域定義されている場合（Ｓ１２４でＹｅｓ）、そのデータ領域の配置アドレスがリンク時にプログラム上のデータ領域の定義順序に依存して自動決定されたものか否かを調べる（Ｓ１２５）。配置アドレスが自動設定で無い場合（Ｓ１２５でＮｏ）、自動回避対象でないので自動回避ができない旨を報告する（Ｓ１３１）。
【０１０４】
配置アドレスが自動設定の場合（Ｓ１２５でＹｅｓ）、回避方法としてデータ領域の定義順序入れ替えが指定されているか調べ（Ｓ１２６）、データ領域の定義順序変更が指定されている場合（Ｓ１２６がＹｅｓ）、そのデータ領域が他のデータ領域と配置アドレスを入れ替えることができるかを調べる（Ｓ１２７）。このステップＳ１２７の処理詳細は、アライメント例外分析部８のステップＳ７９およびＳ９１〜Ｓ９９と同じものである。このため、ステップＳ１２７は詳細説明を省略する。データ領域定義の入れ替えができる場合（Ｓ１２７でＹｅｓ）、ステップＳ１２７の判定中に求めたデータ領域について、データ領域の領域定義を行う中間言語の順序を入れ替える（Ｓ１２８）。
【０１０５】
回避方法としてデータ領域の定義順序入れ替えが指定されていない場合（Ｓ１２６がＮｏ）、またはデータ領域定義の入れ替えができない場合（Ｓ１２７でＮｏ）、回避方法としてデータアクセス時の型に合ったアライン指定を行う方法が指定されているか調べる（Ｓ１０９）。アライン指定を行う方法が指定されている場合（Ｓ１２９でＹｅｓ）、アライメント例外自動回避部１１はそのデータ領域の領域定義を行う中間言語のアライン指定をデータアクセス時の型に合った数値に変更する（Ｓ１３０）。アライン指定を行う方法が指定されていない場合（Ｓ１２９でＹｅｓ）、自動回避ができない旨を報告する（Ｓ１３１）。このステップＳ１３１は、ディスプレイやプリンタまたはログファイルなどにアライメント例外の自動回避ができない旨をメッセージなどの形で提示する。
【０１０６】
図２１を用いて、アライメント例外自動回避部１１の動作のうち、データ領域の定義順序入れ替えによって自動回避を行う場合を説明する。図２１の（ａ）のソースプログラムに対してアライメント例外の自動回避を行うとすると（Ｓ１２１でＹｅｓ）、アライメント例外自動回避部１１は、図２１の（ｃ）のアドレス利用個所テーブル５１を参照し（Ｓ１２２）、データ領域ｃａｒｙ[０］への書込みでアライメント例外が発生するという情報を得る（Ｓ１２３）。データ領域ｃａｒｙ[０]の属する配列ｃａｒｙはソースプログラム内で領域定義されており（Ｓ１２４でＹｅｓ）、また、配列ｃａｒｙの配置アドレスはリンク時にプログラム上のデータ領域の定義順序に依存して自動決定されている（Ｓ１２５でＹｅｓ）。アライメント例外の自動回避方法としてデータ領域の定義順序入れ替えが指定されている場合（Ｓ１２６でＹｅｓ）、配列ｃａｒｙが他のデータ領域と配置アドレスを入れ替えることができるかを調べる（Ｓ１２７）。配列ｃａｒｙと変数ｓｘと変数ｃｘを入れ替えることができると判断され（Ｓ１２７）、配列ｃａｒｙと変数ｓｘと変数ｃｘのデータ領域の領域定義を行う中間言語の順序を入れ替える（Ｓ１２８）。
【０１０７】
また、図２３を用いて、アライメント例外自動回避部１１の動作のうち、データ領域へのデータアクセス時の型に合ったアライン指定を行って自動回避を行う場合を説明する。図２３の（ａ）のソースプログラムに対してアライメント例外の自動回避を行うとすると（Ｓ１２１でＹｅｓ）、アライメント例外自動回避部１１は、図２１の（ｃ）のアドレス利用個所テーブル５１を参照し（Ｓ１２２）、データ領域ｃａｒｙ[０］への書込みでアライメント例外が発生するという情報を得る（Ｓ１２３）。データ領域ｃａｒｙ[０]の属する配列ｃａｒｙはソースプログラム内で領域定義されており（Ｓ１２４でＹｅｓ）、また、配列ｃａｒｙの配置アドレスはリンク時にプログラム上のデータ領域の定義順序に依存して自動決定されている（Ｓ１２５でＹｅｓ）。アライメント例外の自動回避方法としてデータアクセス時の型に合ったアライン指定を行って自動回避を行う方法が指定されている場合（Ｓ１２６でＮｏ、Ｓ１２９でＹｅｓ）、配列ｃａｒｙの領域定義を行う中間言語のアライン指定を１から４に変更する（Ｓ１３０）。
【０１０８】
以上の機構を用いることで、ユーザーはソースプログラム中のアライメント例外発生個所の自動回避が可能となる。
【産業上の利用可能性】
【０１０９】
本発明のアライメント整合装置は、プログラム開発においてデータ領域の配置アドレスとデータの参照時の型が重要になってくる分野、特に組込み機器用ソフトウェアプログラム等を開発する上で有用である。
【図面の簡単な説明】
【０１１０】
【図１】本発明の実施の形態におけるコンパイラの構成図
【図２】本発明の実施の形態における配置アドレス情報の説明に必要なコンパイラツールチェーンの図
【図３】本発明の実施の形態における配置アドレス情報の例を示す図
【図４】本発明の実施の形態におけるアライメント制約の例を示す図
【図５】本発明の実施の形態における配置アドレス情報取得部の詳細を示すフローチャート
【図６】本発明の実施の形態における配置アドレス情報テーブルの例を示す図
【図７】本発明の実施の形態におけるアドレス確定部の詳細を示すフローチャート
【図８】本発明の実施の形態におけるアドレス確定部の動作例説明図
【図９】本発明の実施の形態におけるアドレス利用個所検出部の詳細を示すフローチャート
【図１０】本発明の実施の形態における検出終了時点でのアドレス利用個所テーブルの例を示す図
【図１１】本発明の実施の形態におけるアライメント例外判定部の詳細を示すフローチャート
【図１２】本発明の実施の形態におけるアライメント例外判定部の動作例説明図
【図１３】本発明の実施の形態におけるアライメント例外判定部の動作を説明するためのアドレス利用個所テーブルの例を示す図
【図１４】本発明の実施の形態におけるアライメント例外警告部の詳細を示すフローチャート
【図１５】本発明の実施の形態におけるアライメント例外回避方法提示部の詳細を示すフローチャート
【図１６】図１５におけるステップＳ７９の詳細を表すフローチャート
【図１７】図１５におけるステップＳ７９の動作例説明図
【図１８】本発明の実施の形態におけるアライメント例外回避方法提示部が提示する第１の回避方法の説明図
【図１９】本発明の実施の形態におけるアライメント例外回避方法提示部が提示する第２の回避方法の説明図
【図２０】本発明の実施の形態におけるアライメント例外回避方法提示部が提示する第３の回避方法の説明図
【図２１】本発明の実施の形態におけるアライメント例外回避方法提示部が提示する第４の回避方法の説明図
【図２２】本発明の実施の形態におけるアライメント例外回避方法提示部が提示する第４の回避方法の説明に使うメモリの概念図
【図２３】本発明の実施の形態におけるアライメント例外回避方法提示部が提示する第５の回避方法の説明図
【図２４】本発明の実施の形態におけるアライメント例外回避方法提示部が提示する第５の回避方法の説明に使うメモリの概念図
【図２５】本発明の実施の形態におけるアライメント例外自動回避指令判定部の詳細を示すフローチャート
【図２６】本発明の実施の形態におけるアライメント例外自動回避部の動作を切り替えるオプション指定とプラグマ指令の例を示す図
【図２７】本発明の実施の形態におけるアライメント例外自動回避部の詳細を示すフローチャート
【符号の説明】
【０１１１】
Ｅ１  ソースプログラム
Ｅ２  コンパイラ
Ｅ３  リンカ
Ｅ４  オブジェクトコード
１  構文解析部
２  中間言語生成部
３  配置アドレス情報取得部
４  アドレス確定部
５  アドレス利用個所検出部
６  アライメント例外判定部
７  アライメント例外警告部
８  アライメント例外分析部
９  アライメント例外回避方法提示部
１０  アライメント例外自動回避指令判定部
１１  アライメント例外自動回避部
１２  コード生成部
１３  配置アドレス情報
３１  配置アドレス情報テーブル
５１  アドレス利用個所テーブル
【図１】
2006018558.tif 000003
【図２】
2006018558.tif 000004
【図３】
2006018558.tif 000005
【図４】
2006018558.tif 000006
【図５】
2006018558.tif 000007
【図６】
2006018558.tif 000008
【図７】
2006018558.tif 000009
【図８】
2006018558.tif 000010
【図９】
2006018558.tif 000011
【図１０】
2006018558.tif 000012
【図１１】
2006018558.tif 000013
【図１２】
2006018558.tif 000014
【図１３】
2006018558.tif 000015
【図１４】
2006018558.tif 000016
【図１５】
2006018558.tif 000017
【図１６】
2006018558.tif 000018
【図１７】
2006018558.tif 000019
【図１８】
2006018558.tif 000020
【図１９】
2006018558.tif 000021
【図２０】
2006018558.tif 000022
【図２１】
2006018558.tif 000023
【図２２】
2006018558.tif 000024
【図２３】
2006018558.tif 000025
【図２４】
2006018558.tif 000026
【図２５】
2006018558.tif 000027
【図２６】
2006018558.tif 000028
【図２７】
2006018558.tif 000029