JP2004246776A - 自動変数共有化コンパイラ、自動変数共有化リンカ及びプログラム開発支援システム - Google Patents
自動変数共有化コンパイラ、自動変数共有化リンカ及びプログラム開発支援システム Download PDFInfo
- Publication number
- JP2004246776A JP2004246776A JP2003038190A JP2003038190A JP2004246776A JP 2004246776 A JP2004246776 A JP 2004246776A JP 2003038190 A JP2003038190 A JP 2003038190A JP 2003038190 A JP2003038190 A JP 2003038190A JP 2004246776 A JP2004246776 A JP 2004246776A
- Authority
- JP
- Japan
- Prior art keywords
- function
- file
- automatic variable
- linker
- compiler
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Abstract
【課題】プログラム開発支援システムにおいてソースファイル内関数が他ファイル内関数を呼び出す静的関係の情報から、若しくはプログラム実行時の全体の関数依存関係情報から、自動変数領域を低減化する。
【解決手段】一つのオブジェクトファイル内に存在する関数群と別のオブジェクトファイル内に存在する関数群とが、更に別のオブジェクトファイル内に存在する関数を介することを含めても、呼出し関係に無い場合、両者内の自動変数領域の配置アドレスを同一化することを特徴とするリンカを提供する。
【選択図】 図1
【解決手段】一つのオブジェクトファイル内に存在する関数群と別のオブジェクトファイル内に存在する関数群とが、更に別のオブジェクトファイル内に存在する関数を介することを含めても、呼出し関係に無い場合、両者内の自動変数領域の配置アドレスを同一化することを特徴とするリンカを提供する。
【選択図】 図1
Description
【0001】
【発明の属する技術分野】
本発明は、自動変数領域をスタティック領域に確保するコンパイラ、リンカ、及びシミュレータに関する。
【0002】
【従来の技術】
図11に示すように、プログラム開発では、ホストコンピュータ2上でソース(プログラム)ファイル4をコンパイラ6によりコンパイルしてオブジェクトファイル8を生成し、そのオブジェクトファイル8からリンカ10により実行形式プログラム12を生成する。
【0003】
C言語等の高級プログラミング言語で記述されたプログラムをコンパイルすると、自動変数と呼ばれる、関数使用時のみ生成され関数の終了と共に消滅する変数は、スタック領域に生成されることが一般的である。しかし、スタック操作命令のないCPU用のコンパイラでは、自動変数は関数が終了しても消滅しない静的な領域に生成される。関数の数が多い、あるいは自動変数の数が多い場合は、この領域が多く必要になり、特にメモリ容量に制限のある組み込みシステムでは問題になることがある。
【0004】
そこで、異なる関数内の自動変数が同時に存在する必要がないならば、同じ領域に確保されることによりメモリ容量を減らす技術が、例えば特許文献1にて公開されている。あるいは、特許文献2では、一つの関数内の自動変数の使われ方を調べ、排他的に使用される変数を同じ領域に配置する技術が公開されている。
【0005】
しかし、これらの技術はコンパイル単位のメモリ容量削減であり、複数ファイルで構成されるプログラム全体からメモリ削減を行うものではない。
【0006】
【特許文献1】
特開2000−112767
【特許文献2】
特開2000−250761
【0007】
【発明が解決しようとする課題】
本発明は、プログラム開発支援システムにおいて、ソースファイル内関数が他ファイル内関数を呼び出す静的関係の情報から、若しくはプログラム実行時の全体の関数依存関係情報から、自動変数領域を低減化することを目的とする。
【0008】
【課題を解決するための手段】
本発明は、上記の目的を達成するために為されたものである。本発明に係る請求項1に記載のリンカは、
ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置するコンパイラにより、生成されたオブジェクトファイルの結合処理を行うリンカである。そのリンカにおいて、
各オブジェクトファイル内に生成されている関数の依存関係情報を基に、ファイル単位にファイル内関数が他ファイル内関数を呼び出す関係の情報を、生成することを特徴とする。
【0009】
本発明に係る請求項2に記載のリンカは、
請求項1に記載のリンカにおいて、
ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置し、かつ同時使用されない自動変数領域を共有化してメモリ使用量を低減化するコンパイラにより生成されたオブジェクトファイルをも結合処理の対象とし、
各オブジェクトファイル内に生成されている関数の依存関係情報を基に、ファイル単位にファイル内関数が他ファイル内関数の呼出し関係情報を、生成することを特徴とするリンカである。
【0010】
本発明に係る請求項3に記載のリンカは、
請求項2に記載のリンカにおいて、
各オブジェクトファイル内の自動変数領域のアドレス配置を決定する際に、生成されたファイル毎のファイル内関数呼出し情報を参照することを特徴とするリンカである。
【0011】
本発明に係る請求項4に記載のリンカは、
請求項3に記載のリンカにおいて、
一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群とが、別のオブジェクトファイル内に存在する関数を介することを含めても、呼出し関係に無い場合、
両者内の自動変数領域の配置アドレスを同一化することを特徴とするリンカである。
【0012】
本発明に係る請求項5に記載のシミュレータは、
ソースファイルをコンパイルしてオブジェクトファイルを生成し、それらのオブジェクトファイルをリンクして生成された実行形式プログラムをシミュレートするシミュレータである。そのシミュレータにおいて、
割り込みやマルチタスク動作を含む各関数内から他関数の呼びだし、または割り込みやタスク切り替えによる他関数への遷移状態を解析し、
各関数の開始から終了までに実行される他関数の実行情報を生成し、
動的に決定される末端関数を検出することを特徴とする。
【0013】
本発明に係る請求項6に記載のリンカは、
ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置するコンパイラにより、生成されたオブジェクトファイルの結合処理を行うリンカである。そのリンカにおいて、
各オブジェクトファイル内の自動変数領域のアドレス配置を、上記請求項5にて検出される末端関数の情報を基にして、再度結合処理することにより決定することを特徴とする。
【0014】
本発明に係る請求項7に記載のリンカは、
請求項6に記載のリンカにおいて、
既にオブジェクトファイル毎にコンパイラにより自動変数領域の共有化を行っている場合、
一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群とが、全く依存関係に無い場合、両者内の自動変数領域の配置アドレスを同一化することを特徴とするリンカである。
【0015】
本発明に係る請求項8に記載のリンカは、
請求項6に記載のリンカにおいて、
コンパイラにより自動変数領域の共有化を行っていない場合、
それぞれの関数が、全く依存関係に無い場合、それら関数内の自動変数領域の配置アドレスを同一化することを特徴とするリンカである。
【0016】
本発明に係る請求項9に記載のプログラム開発支援システムは、
コンパイラと、
請求項7又は請求項8に記載のリンカと、
請求項5に記載のシミュレータとを含むことを特徴とするプログラム開発支援システムである。
【0017】
本発明に係る請求項10に記載のコンパイラは、
ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置するコンパイラにおいて、
各オブジェクトファイル内の自動変数領域のアドレス配置に関して、上記請求項5にて検出される末端関数の情報を基にして、末端関数同士の自動変数領域の配置アドレスを同一化することを特徴とするコンパイラ。
【0018】
【発明の実施の形態】
以下、図面を参照して、本発明に係る好適な実施形態を説明する。
【0019】
≪第1の実施形態≫
図1は、本発明の第1の実施形態に係るリンカ30を含む、ホストコンピュータ2での処理の概略の流れ図である。
【0020】
図1のホストコンピュータ2にて、コンパイラ26は、各ソースプログラムファイル4よりそれぞれオブジェクトファイル28を生成する。このときコンパイラ26は、公知技術等を用いて関数間の自動変数領域の共有化による低減化、あるいは関数内の自動変数領域の共有化による低減化を実施する。この処理と同時に、コンパイラ26は、各定義されている関数にて呼び出される外部関数名の一覧情報(依存関連情報リスト)を、オブジェクトファイル28内に埋め込んでおく。
【0021】
続いてリンカ30は、これらのオブジェクトファイル28の結合処理を行い、実行形式プログラム32を生成する。このとき、各オブジェクトファイル28に埋め込まれた関数一覧情報(依存関連情報リスト)を基にして、プログラム全体のソースファイル4に関する相互依存関係テーブルを作成する。ここで、依存関係のないオブジェクトファイル28に含まれる関数群同士の自動変数領域を同じアドレスにマッピングすることにより、オブジェクトファイル間のメモリ容量の低減化を行う。
【0022】
第1の実施形態を、簡易な例により説明する。まず、F1、F2、F3、F4なる4つのソースプログラムファイルがあり、それぞれのプログラムで定義されている関数とそれらが使用する関数の関連が、図2に示される構成であるとする。以下では、図2のソースプログラムファイルに対して第1の実施形態を適用する(図3、図4及び図5)。
【0023】
図2において、ソースファイルF1では、関数F1A、関数F1B、関数F1Cなる関数が定義されている。関数F1Aは関数F1Bと関数F1Cを参照する。関数F1Bは外部関数F2Aを参照する。そして関数F1Cは外部関数F3Aを参照する。それぞれの関数は処理終了に到ると、親関数に戻る。
【0024】
ソースファイルF2では、関数F2A、関数F2B、関数F2Cなる関数が定義されている。関数F2Aは関数F2BとF2Cを参照する。関数F2Bは関数F2Cと外部関数F4Aを参照する。
【0025】
ソースファイルF3では、関数F3A、関数F3Bなる関数が定義されている。関数F3Aが関数F3Bを参照する。関数F3Bは外部関数F4Aを参照する。
【0026】
ソースファイルF4では、関数F4Aなる関数が定義されている。
【0027】
まず、コンパイラ26は、各ソース(プログラム)ファイル4内にて、自動変数領域の共有化を実施する。例えば、ソースファイルF1では、関数F1Bと関数F1Cの自動変数領域が公知技術を用いて共有化されることになる。あるいは、各関数内にて共有化が公知技術により実施されることもある。ソースファイルF2、ソースファイルF3においても、それぞれ公知技術により、自動変数領域の共有化が実施される。これにより各ソースファイル毎に一つの自動変数領域が確保されることになる。
【0028】
さらにコンパイラ26は、各ソースファイル内で定義されている関数が参照している外部関数の依存関連情報リスト(図3)を生成し、オブジェクトファイル内に出力する。図4は、図2の各ソースファイルにおける外部関数の依存関連情報リストの内容である。
【0029】
各オブジェクトファイル28の結合処理を行うリンカ30は、各オブジェクトファイル28内に生成されている外部関数の依存関連情報リストを参照し、ソースファイルに関する相互依存関係テーブルを作成する。この相互依存関係テーブルの例を、図2のソースファイルの例に関して、図5に示す。
【0030】
図5のテーブルにおいて、縦軸横軸いずれにもソースファイル(の名称)が示されている。同テーブルにて、縦軸のソースファイルのファイル内関数から見て横軸のソースファイルのファイル内関数を呼び出していれば「×」、呼び出していなければ「○」が示される。
【0031】
図5のテーブルの対角線に関して対称位置の双方が○となるソースファイルF1とF4、及びF2とF3は、直接には相互依存が無いことが判る。
【0032】
この2つの組み合わせの夫々が、他のファイル内関数を介して依存関係にないか否か、さらに調べる。まず、F1とF4の関係を取り上げる。図5よりF1は、F2又はF3と相互依存関係にあることがわかる。さらにF2は、F4と依存関係にあることがわかる。同じくF3もF4と依存関係にある。つまり、F1とF4は、F2又はF3を介して相互依存関係にあることになる。
【0033】
もう一つの組み合わせであるF2とF3の関係では、F2はF4と依存関係にあり、F3もF4と依存関係にあるが、F2とF3が依存関係にないことがわかる。
【0034】
従って、リンカ30は、F2とF3内の自動変数領域を共有化するようにメモリ配置を行い、自動変数領域の低減化を行う。
【0035】
上記処理では、リンカ30が、
(1)依存関連情報リストを基にして相互依存関係テーブルを作成すること、
(2)依存関係のないオブジェクトファイルに含まれる関数群同士の自動変数領域を同じアドレスにマッピングすること
を行なっている。
【0036】
≪第2の実施形態≫
図6は、本発明の第2の実施形態に係るプログラム開発支援システム60を含む、ホストコンピュータ2での処理の概略の流れ図である。
【0037】
図6のホストコンピュータ2にて、コンパイラ46は、各ソースプログラムファイル4よりそれぞれオブジェクトファイル48を生成する。このときコンパイラ46は、公知技術等を用いて関数間の自動変数領域の共有化による低減化、あるいは関数内の自動変数領域の共有化による低減化を実施する。
【0038】
リンカ50は、一旦これらのオブジェクトファイル48の結合処理を行い、第1の実行形式プログラム52−(1)を生成する。
【0039】
第1の実行形式プログラム52−(1)は、シミュレータ54により、割り込み処理を含めて実動作に近い十分な動作がなされる。シミュレータ54は、各関数の実行トレースを行い、動的な末端関数リストを含む関数依存情報を生成・ファイル化(56)する。この関数依存情報ファイル56を入力データとして参照させつつ、リンカ50を再度実行させ、同時実行されることのない(プログラム)ファイル毎の関数群の自動変数領域を共有化し、メモリの低減化を行った第2の実行形式プログラム52−(2)を生成する。
【0040】
また、コンパイラ46によりそのソースプログラムファイル4毎の自動変数領域の共通化が行われていない場合は、リンカ50により一旦オブジェクトファイル48の結合処理を行い、第1の実行形式プログラム52−(1)を生成した後、同様にその第1の実行形式プログラム52−(1)をシミュレータ54にて実行して、関数依存情報ファイル56を生成する。この関数依存情報ファイル56を入力データとして参照させつつ、リンカ50を再度実行させ、同時実行されることのない関数同士の自動変数領域を共有化し、メモリの低減化を行った第2の実行形式プログラム52−(2)を生成する。
【0041】
第2の実施形態を、簡易な例により説明する。まず、T1、T2、T3なる3つのタスクからなるマルチタスクシステムがあり、タスクT1は関数Aで、タスクT2は関数Dで、またタスクT3は関数Iで表されるものとする。各タスクは図7のような構成であるとする。つまり、タスクT1である関数Aは、関数Bを呼び、また関数Bは関数Cを呼ぶ。タスクT2である関数Dは関数Eを呼び、関数Eは関数Fと関数Gと関数Hを呼ぶ。さらにタスクT3である関数Iは、関数Jを呼ぶものとする。
【0042】
このときの各関数記述は、何本のソースファイルであっても構わない。全ての関数が一本のソースファイルに記述されていてもよいし、関数毎にソースファイルが分かれていてもよい。
【0043】
さて、このマルチタスクシステムを通常にリンクし、第1の実行形式プログラム52−(1)を生成する。この第1の実行形式プログラム52−(1)をシミュレータ54にて実行する。このとき、シミュレータ54は各関数の開始と終了を記録する。
【0044】
十分な実行により得られた各関数のトレース結果が、図8の様であったとする。タスク間の移動は、割り込みやプログラム内のイベント待ちにより発生したもの(太矢印線)とし、タスク内の移動は通常の関数コールにて発生したものとする。関数の開始は“S”、終了は“E”で示す。
【0045】
ここで、関数の開始と終了の記録を見ると、二重線で示す部分、つまり、
・関数Fの開始から終了まで、
・関数Jの開始から終了まで、
・関数Hの開始から終了まで、
・関数Cの開始から終了まで
が、他の関数を呼ぶことがない。つまり、これらが、実行時の末端関数である。
【0046】
図9において、図7のマルチタスクシステムを静的に、即ち、図7の構成図のみによって、解析した場合の関数依存情報を示す。左側が呼び出す主体の関数、右側が呼び出されている客体の関数である。図9でみる限り、関数C、関数F、関数G、関数H、関数Jが末端関数であり、依存関係がないことになる。
【0047】
ここで、第2の実施形態に係るシミュレータ54実行による解析によると、図10に示すような動的な関数依存情報が作成される。図10では、図8で示されるように、関数C、関数F、関数H、関数Jが末端関数であり依存関係がないことがわかる。つまり、関数Gには実際には依存関係があることがわかる。シミュレータ54は、これらの関数依存情報をファイル56に出力する。
【0048】
この関数依存情報ファイル56を入力データとして参照しつつ、リンカ50が、再度リンクを行う。その際には、関数C、関数F、関数H、関数Jの自動変数領域の共有化を行い、メモリ領域を低減化した第2の実行形式プログラム52−(2)を生成する。ただし、公知技術等により、既にいくつかの関数の自動変数領域が共有化されている場合、その関数群単位で共有化を行う。
【0049】
図7の例に関して、公知の技術によりプログラム実行以前に関数の依存関係を解析する場合、関数Gと関数Jとは静的には依存関係にないため、関数Gを含めて自動変数領域の共有化が行われてしまうことがある。本発明では、シミュレータにより動的な依存関係を解析できるため、自動変数領域を正確に共有化することができる。
【0050】
上記処理では、リンカ50が関数依存情報ファイル56を入力データとして参照しつつ、同時実行されることのない関数同士の自動変数領域を共有化させている。このことをコンパイラ46に行なわせるように、リンカ50及びコンパイラ46を設定することも可能である。その場合、図6の矢印62が示すように、関数依存情報ファイル56はコンパイラ46の入力ファイルとなる。
【0051】
【発明の効果】
本発明を利用することにより、以下のような効果を得ることができる。
【0052】
まず、高級プログラミング言語で記述されたソースプログラムファイルをコンパイル・リンクするに際し、各オブジェクトファイル内に生成されている関数の依存関係情報を基に、ソースファイル内関数が他ファイル内関数を呼び出す静的関係の情報を生成することができる。
【0053】
上記のソースファイル内関数が他ファイル内関数を呼び出す静的関係の情報を基にして、リンカが、各オブジェクトファイル内の自動変数領域のアドレス配置を決定することができる。その際、一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群とが、(別のオブジェクトファイル内に存在する関数を介することを含めて)呼び出す関係に無い場合には、両者(即ち、一方と他方)内の自動変数領域の配置アドレスを同一化し、自動変数メモリ領域の専有量を低減化させることができる。
【0054】
コンパイル、及びリンク後に生成された実行形式プログラムをシミュレータにて実行する際、割り込みやマルチタスク動作時を含めて各関数の開始と終了を解析し、関数の依存関係より動的に決定される末端関数を検出することができる。
【0055】
リンカにおいて、各オブジェクトファイル内の自動変数領域のアドレス配置を、シミュレータ実行により動的に生成された関数依存情報を基にして、再度結合処理することにより、決定させることができる。
【0056】
リンカにおいて、既にオブジェクトファイル毎にコンパイラにより自動変数領域の共有化を行っている場合、一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群が、プログラム実行時に全く依存関係が無い場合、両者内の自動変数領域の配置アドレスを同一化し、自動変数メモリ領域の専有量を低減化させることができる。
【0057】
リンカにおいて、コンパイラにより自動変数領域の共有化を行っていない場合、それぞれの関数が、プログラム実行時に全く依存関係が無い場合、それら関数内の自動変数領域の配置アドレスを同一化し、自動変数メモリ領域の専有量を低減化させることができる。
【0058】
コンパイラ、リンカ、シミュレータで構成されるプログラム開発支援システムにおいて、プログラム実行時の全体の関数依存関係から、自動変数領域を低減化することができる。
【図面の簡単な説明】
【図1】本発明の第1の実施形態に係るリンカを含むホストコンピュータでの処理の概略の流れ図である。
【図2】ソースプログラムと、それぞれのソースプログラムで定義されている関数と更にそれら関数が使用する関数の関連の、構成例である。
【図3】第1の実施形態で利用する外部関数の依存関連情報リストの構成である。
【図4】図2の各ソースファイル内で定義されている関数が参照している外部関数の依存関連情報リストの内容である。
【図5】図4の依存関連情報リストから生成される相互依存関係テーブルの内容である。
【図6】本発明の第2の実施形態に係るプログラム開発支援システムを含むホストコンピュータでの処理の概略の流れ図である。
【図7】タスクとそれに含まれる関数の、構成例である。
【図8】図7のシステムをシミュレータで十分にシミュレートすることにより、得られた各関数のトレース結果である。
【図9】図7のマルチタスクシステムを静的に、即ち、図7の構成図のみによって、解析した場合の関数依存情報である。
【図10】図7のマルチタスクシステムを第2の実施形態に係るシミュレータ実行によって、解析して得られる関数依存情報である。
【図11】従来技術のプログラム開発支援システムを含むホストコンピュータでの処理の概略の流れ図である。
【符号の説明】
2・・・ホストコンピュータ、6、26、46・・・コンパイラ、10、30、50・・・リンカ、54・・・シミュレータ。
【発明の属する技術分野】
本発明は、自動変数領域をスタティック領域に確保するコンパイラ、リンカ、及びシミュレータに関する。
【0002】
【従来の技術】
図11に示すように、プログラム開発では、ホストコンピュータ2上でソース(プログラム)ファイル4をコンパイラ6によりコンパイルしてオブジェクトファイル8を生成し、そのオブジェクトファイル8からリンカ10により実行形式プログラム12を生成する。
【0003】
C言語等の高級プログラミング言語で記述されたプログラムをコンパイルすると、自動変数と呼ばれる、関数使用時のみ生成され関数の終了と共に消滅する変数は、スタック領域に生成されることが一般的である。しかし、スタック操作命令のないCPU用のコンパイラでは、自動変数は関数が終了しても消滅しない静的な領域に生成される。関数の数が多い、あるいは自動変数の数が多い場合は、この領域が多く必要になり、特にメモリ容量に制限のある組み込みシステムでは問題になることがある。
【0004】
そこで、異なる関数内の自動変数が同時に存在する必要がないならば、同じ領域に確保されることによりメモリ容量を減らす技術が、例えば特許文献1にて公開されている。あるいは、特許文献2では、一つの関数内の自動変数の使われ方を調べ、排他的に使用される変数を同じ領域に配置する技術が公開されている。
【0005】
しかし、これらの技術はコンパイル単位のメモリ容量削減であり、複数ファイルで構成されるプログラム全体からメモリ削減を行うものではない。
【0006】
【特許文献1】
特開2000−112767
【特許文献2】
特開2000−250761
【0007】
【発明が解決しようとする課題】
本発明は、プログラム開発支援システムにおいて、ソースファイル内関数が他ファイル内関数を呼び出す静的関係の情報から、若しくはプログラム実行時の全体の関数依存関係情報から、自動変数領域を低減化することを目的とする。
【0008】
【課題を解決するための手段】
本発明は、上記の目的を達成するために為されたものである。本発明に係る請求項1に記載のリンカは、
ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置するコンパイラにより、生成されたオブジェクトファイルの結合処理を行うリンカである。そのリンカにおいて、
各オブジェクトファイル内に生成されている関数の依存関係情報を基に、ファイル単位にファイル内関数が他ファイル内関数を呼び出す関係の情報を、生成することを特徴とする。
【0009】
本発明に係る請求項2に記載のリンカは、
請求項1に記載のリンカにおいて、
ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置し、かつ同時使用されない自動変数領域を共有化してメモリ使用量を低減化するコンパイラにより生成されたオブジェクトファイルをも結合処理の対象とし、
各オブジェクトファイル内に生成されている関数の依存関係情報を基に、ファイル単位にファイル内関数が他ファイル内関数の呼出し関係情報を、生成することを特徴とするリンカである。
【0010】
本発明に係る請求項3に記載のリンカは、
請求項2に記載のリンカにおいて、
各オブジェクトファイル内の自動変数領域のアドレス配置を決定する際に、生成されたファイル毎のファイル内関数呼出し情報を参照することを特徴とするリンカである。
【0011】
本発明に係る請求項4に記載のリンカは、
請求項3に記載のリンカにおいて、
一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群とが、別のオブジェクトファイル内に存在する関数を介することを含めても、呼出し関係に無い場合、
両者内の自動変数領域の配置アドレスを同一化することを特徴とするリンカである。
【0012】
本発明に係る請求項5に記載のシミュレータは、
ソースファイルをコンパイルしてオブジェクトファイルを生成し、それらのオブジェクトファイルをリンクして生成された実行形式プログラムをシミュレートするシミュレータである。そのシミュレータにおいて、
割り込みやマルチタスク動作を含む各関数内から他関数の呼びだし、または割り込みやタスク切り替えによる他関数への遷移状態を解析し、
各関数の開始から終了までに実行される他関数の実行情報を生成し、
動的に決定される末端関数を検出することを特徴とする。
【0013】
本発明に係る請求項6に記載のリンカは、
ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置するコンパイラにより、生成されたオブジェクトファイルの結合処理を行うリンカである。そのリンカにおいて、
各オブジェクトファイル内の自動変数領域のアドレス配置を、上記請求項5にて検出される末端関数の情報を基にして、再度結合処理することにより決定することを特徴とする。
【0014】
本発明に係る請求項7に記載のリンカは、
請求項6に記載のリンカにおいて、
既にオブジェクトファイル毎にコンパイラにより自動変数領域の共有化を行っている場合、
一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群とが、全く依存関係に無い場合、両者内の自動変数領域の配置アドレスを同一化することを特徴とするリンカである。
【0015】
本発明に係る請求項8に記載のリンカは、
請求項6に記載のリンカにおいて、
コンパイラにより自動変数領域の共有化を行っていない場合、
それぞれの関数が、全く依存関係に無い場合、それら関数内の自動変数領域の配置アドレスを同一化することを特徴とするリンカである。
【0016】
本発明に係る請求項9に記載のプログラム開発支援システムは、
コンパイラと、
請求項7又は請求項8に記載のリンカと、
請求項5に記載のシミュレータとを含むことを特徴とするプログラム開発支援システムである。
【0017】
本発明に係る請求項10に記載のコンパイラは、
ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置するコンパイラにおいて、
各オブジェクトファイル内の自動変数領域のアドレス配置に関して、上記請求項5にて検出される末端関数の情報を基にして、末端関数同士の自動変数領域の配置アドレスを同一化することを特徴とするコンパイラ。
【0018】
【発明の実施の形態】
以下、図面を参照して、本発明に係る好適な実施形態を説明する。
【0019】
≪第1の実施形態≫
図1は、本発明の第1の実施形態に係るリンカ30を含む、ホストコンピュータ2での処理の概略の流れ図である。
【0020】
図1のホストコンピュータ2にて、コンパイラ26は、各ソースプログラムファイル4よりそれぞれオブジェクトファイル28を生成する。このときコンパイラ26は、公知技術等を用いて関数間の自動変数領域の共有化による低減化、あるいは関数内の自動変数領域の共有化による低減化を実施する。この処理と同時に、コンパイラ26は、各定義されている関数にて呼び出される外部関数名の一覧情報(依存関連情報リスト)を、オブジェクトファイル28内に埋め込んでおく。
【0021】
続いてリンカ30は、これらのオブジェクトファイル28の結合処理を行い、実行形式プログラム32を生成する。このとき、各オブジェクトファイル28に埋め込まれた関数一覧情報(依存関連情報リスト)を基にして、プログラム全体のソースファイル4に関する相互依存関係テーブルを作成する。ここで、依存関係のないオブジェクトファイル28に含まれる関数群同士の自動変数領域を同じアドレスにマッピングすることにより、オブジェクトファイル間のメモリ容量の低減化を行う。
【0022】
第1の実施形態を、簡易な例により説明する。まず、F1、F2、F3、F4なる4つのソースプログラムファイルがあり、それぞれのプログラムで定義されている関数とそれらが使用する関数の関連が、図2に示される構成であるとする。以下では、図2のソースプログラムファイルに対して第1の実施形態を適用する(図3、図4及び図5)。
【0023】
図2において、ソースファイルF1では、関数F1A、関数F1B、関数F1Cなる関数が定義されている。関数F1Aは関数F1Bと関数F1Cを参照する。関数F1Bは外部関数F2Aを参照する。そして関数F1Cは外部関数F3Aを参照する。それぞれの関数は処理終了に到ると、親関数に戻る。
【0024】
ソースファイルF2では、関数F2A、関数F2B、関数F2Cなる関数が定義されている。関数F2Aは関数F2BとF2Cを参照する。関数F2Bは関数F2Cと外部関数F4Aを参照する。
【0025】
ソースファイルF3では、関数F3A、関数F3Bなる関数が定義されている。関数F3Aが関数F3Bを参照する。関数F3Bは外部関数F4Aを参照する。
【0026】
ソースファイルF4では、関数F4Aなる関数が定義されている。
【0027】
まず、コンパイラ26は、各ソース(プログラム)ファイル4内にて、自動変数領域の共有化を実施する。例えば、ソースファイルF1では、関数F1Bと関数F1Cの自動変数領域が公知技術を用いて共有化されることになる。あるいは、各関数内にて共有化が公知技術により実施されることもある。ソースファイルF2、ソースファイルF3においても、それぞれ公知技術により、自動変数領域の共有化が実施される。これにより各ソースファイル毎に一つの自動変数領域が確保されることになる。
【0028】
さらにコンパイラ26は、各ソースファイル内で定義されている関数が参照している外部関数の依存関連情報リスト(図3)を生成し、オブジェクトファイル内に出力する。図4は、図2の各ソースファイルにおける外部関数の依存関連情報リストの内容である。
【0029】
各オブジェクトファイル28の結合処理を行うリンカ30は、各オブジェクトファイル28内に生成されている外部関数の依存関連情報リストを参照し、ソースファイルに関する相互依存関係テーブルを作成する。この相互依存関係テーブルの例を、図2のソースファイルの例に関して、図5に示す。
【0030】
図5のテーブルにおいて、縦軸横軸いずれにもソースファイル(の名称)が示されている。同テーブルにて、縦軸のソースファイルのファイル内関数から見て横軸のソースファイルのファイル内関数を呼び出していれば「×」、呼び出していなければ「○」が示される。
【0031】
図5のテーブルの対角線に関して対称位置の双方が○となるソースファイルF1とF4、及びF2とF3は、直接には相互依存が無いことが判る。
【0032】
この2つの組み合わせの夫々が、他のファイル内関数を介して依存関係にないか否か、さらに調べる。まず、F1とF4の関係を取り上げる。図5よりF1は、F2又はF3と相互依存関係にあることがわかる。さらにF2は、F4と依存関係にあることがわかる。同じくF3もF4と依存関係にある。つまり、F1とF4は、F2又はF3を介して相互依存関係にあることになる。
【0033】
もう一つの組み合わせであるF2とF3の関係では、F2はF4と依存関係にあり、F3もF4と依存関係にあるが、F2とF3が依存関係にないことがわかる。
【0034】
従って、リンカ30は、F2とF3内の自動変数領域を共有化するようにメモリ配置を行い、自動変数領域の低減化を行う。
【0035】
上記処理では、リンカ30が、
(1)依存関連情報リストを基にして相互依存関係テーブルを作成すること、
(2)依存関係のないオブジェクトファイルに含まれる関数群同士の自動変数領域を同じアドレスにマッピングすること
を行なっている。
【0036】
≪第2の実施形態≫
図6は、本発明の第2の実施形態に係るプログラム開発支援システム60を含む、ホストコンピュータ2での処理の概略の流れ図である。
【0037】
図6のホストコンピュータ2にて、コンパイラ46は、各ソースプログラムファイル4よりそれぞれオブジェクトファイル48を生成する。このときコンパイラ46は、公知技術等を用いて関数間の自動変数領域の共有化による低減化、あるいは関数内の自動変数領域の共有化による低減化を実施する。
【0038】
リンカ50は、一旦これらのオブジェクトファイル48の結合処理を行い、第1の実行形式プログラム52−(1)を生成する。
【0039】
第1の実行形式プログラム52−(1)は、シミュレータ54により、割り込み処理を含めて実動作に近い十分な動作がなされる。シミュレータ54は、各関数の実行トレースを行い、動的な末端関数リストを含む関数依存情報を生成・ファイル化(56)する。この関数依存情報ファイル56を入力データとして参照させつつ、リンカ50を再度実行させ、同時実行されることのない(プログラム)ファイル毎の関数群の自動変数領域を共有化し、メモリの低減化を行った第2の実行形式プログラム52−(2)を生成する。
【0040】
また、コンパイラ46によりそのソースプログラムファイル4毎の自動変数領域の共通化が行われていない場合は、リンカ50により一旦オブジェクトファイル48の結合処理を行い、第1の実行形式プログラム52−(1)を生成した後、同様にその第1の実行形式プログラム52−(1)をシミュレータ54にて実行して、関数依存情報ファイル56を生成する。この関数依存情報ファイル56を入力データとして参照させつつ、リンカ50を再度実行させ、同時実行されることのない関数同士の自動変数領域を共有化し、メモリの低減化を行った第2の実行形式プログラム52−(2)を生成する。
【0041】
第2の実施形態を、簡易な例により説明する。まず、T1、T2、T3なる3つのタスクからなるマルチタスクシステムがあり、タスクT1は関数Aで、タスクT2は関数Dで、またタスクT3は関数Iで表されるものとする。各タスクは図7のような構成であるとする。つまり、タスクT1である関数Aは、関数Bを呼び、また関数Bは関数Cを呼ぶ。タスクT2である関数Dは関数Eを呼び、関数Eは関数Fと関数Gと関数Hを呼ぶ。さらにタスクT3である関数Iは、関数Jを呼ぶものとする。
【0042】
このときの各関数記述は、何本のソースファイルであっても構わない。全ての関数が一本のソースファイルに記述されていてもよいし、関数毎にソースファイルが分かれていてもよい。
【0043】
さて、このマルチタスクシステムを通常にリンクし、第1の実行形式プログラム52−(1)を生成する。この第1の実行形式プログラム52−(1)をシミュレータ54にて実行する。このとき、シミュレータ54は各関数の開始と終了を記録する。
【0044】
十分な実行により得られた各関数のトレース結果が、図8の様であったとする。タスク間の移動は、割り込みやプログラム内のイベント待ちにより発生したもの(太矢印線)とし、タスク内の移動は通常の関数コールにて発生したものとする。関数の開始は“S”、終了は“E”で示す。
【0045】
ここで、関数の開始と終了の記録を見ると、二重線で示す部分、つまり、
・関数Fの開始から終了まで、
・関数Jの開始から終了まで、
・関数Hの開始から終了まで、
・関数Cの開始から終了まで
が、他の関数を呼ぶことがない。つまり、これらが、実行時の末端関数である。
【0046】
図9において、図7のマルチタスクシステムを静的に、即ち、図7の構成図のみによって、解析した場合の関数依存情報を示す。左側が呼び出す主体の関数、右側が呼び出されている客体の関数である。図9でみる限り、関数C、関数F、関数G、関数H、関数Jが末端関数であり、依存関係がないことになる。
【0047】
ここで、第2の実施形態に係るシミュレータ54実行による解析によると、図10に示すような動的な関数依存情報が作成される。図10では、図8で示されるように、関数C、関数F、関数H、関数Jが末端関数であり依存関係がないことがわかる。つまり、関数Gには実際には依存関係があることがわかる。シミュレータ54は、これらの関数依存情報をファイル56に出力する。
【0048】
この関数依存情報ファイル56を入力データとして参照しつつ、リンカ50が、再度リンクを行う。その際には、関数C、関数F、関数H、関数Jの自動変数領域の共有化を行い、メモリ領域を低減化した第2の実行形式プログラム52−(2)を生成する。ただし、公知技術等により、既にいくつかの関数の自動変数領域が共有化されている場合、その関数群単位で共有化を行う。
【0049】
図7の例に関して、公知の技術によりプログラム実行以前に関数の依存関係を解析する場合、関数Gと関数Jとは静的には依存関係にないため、関数Gを含めて自動変数領域の共有化が行われてしまうことがある。本発明では、シミュレータにより動的な依存関係を解析できるため、自動変数領域を正確に共有化することができる。
【0050】
上記処理では、リンカ50が関数依存情報ファイル56を入力データとして参照しつつ、同時実行されることのない関数同士の自動変数領域を共有化させている。このことをコンパイラ46に行なわせるように、リンカ50及びコンパイラ46を設定することも可能である。その場合、図6の矢印62が示すように、関数依存情報ファイル56はコンパイラ46の入力ファイルとなる。
【0051】
【発明の効果】
本発明を利用することにより、以下のような効果を得ることができる。
【0052】
まず、高級プログラミング言語で記述されたソースプログラムファイルをコンパイル・リンクするに際し、各オブジェクトファイル内に生成されている関数の依存関係情報を基に、ソースファイル内関数が他ファイル内関数を呼び出す静的関係の情報を生成することができる。
【0053】
上記のソースファイル内関数が他ファイル内関数を呼び出す静的関係の情報を基にして、リンカが、各オブジェクトファイル内の自動変数領域のアドレス配置を決定することができる。その際、一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群とが、(別のオブジェクトファイル内に存在する関数を介することを含めて)呼び出す関係に無い場合には、両者(即ち、一方と他方)内の自動変数領域の配置アドレスを同一化し、自動変数メモリ領域の専有量を低減化させることができる。
【0054】
コンパイル、及びリンク後に生成された実行形式プログラムをシミュレータにて実行する際、割り込みやマルチタスク動作時を含めて各関数の開始と終了を解析し、関数の依存関係より動的に決定される末端関数を検出することができる。
【0055】
リンカにおいて、各オブジェクトファイル内の自動変数領域のアドレス配置を、シミュレータ実行により動的に生成された関数依存情報を基にして、再度結合処理することにより、決定させることができる。
【0056】
リンカにおいて、既にオブジェクトファイル毎にコンパイラにより自動変数領域の共有化を行っている場合、一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群が、プログラム実行時に全く依存関係が無い場合、両者内の自動変数領域の配置アドレスを同一化し、自動変数メモリ領域の専有量を低減化させることができる。
【0057】
リンカにおいて、コンパイラにより自動変数領域の共有化を行っていない場合、それぞれの関数が、プログラム実行時に全く依存関係が無い場合、それら関数内の自動変数領域の配置アドレスを同一化し、自動変数メモリ領域の専有量を低減化させることができる。
【0058】
コンパイラ、リンカ、シミュレータで構成されるプログラム開発支援システムにおいて、プログラム実行時の全体の関数依存関係から、自動変数領域を低減化することができる。
【図面の簡単な説明】
【図1】本発明の第1の実施形態に係るリンカを含むホストコンピュータでの処理の概略の流れ図である。
【図2】ソースプログラムと、それぞれのソースプログラムで定義されている関数と更にそれら関数が使用する関数の関連の、構成例である。
【図3】第1の実施形態で利用する外部関数の依存関連情報リストの構成である。
【図4】図2の各ソースファイル内で定義されている関数が参照している外部関数の依存関連情報リストの内容である。
【図5】図4の依存関連情報リストから生成される相互依存関係テーブルの内容である。
【図6】本発明の第2の実施形態に係るプログラム開発支援システムを含むホストコンピュータでの処理の概略の流れ図である。
【図7】タスクとそれに含まれる関数の、構成例である。
【図8】図7のシステムをシミュレータで十分にシミュレートすることにより、得られた各関数のトレース結果である。
【図9】図7のマルチタスクシステムを静的に、即ち、図7の構成図のみによって、解析した場合の関数依存情報である。
【図10】図7のマルチタスクシステムを第2の実施形態に係るシミュレータ実行によって、解析して得られる関数依存情報である。
【図11】従来技術のプログラム開発支援システムを含むホストコンピュータでの処理の概略の流れ図である。
【符号の説明】
2・・・ホストコンピュータ、6、26、46・・・コンパイラ、10、30、50・・・リンカ、54・・・シミュレータ。
Claims (10)
- ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置するコンパイラにより、生成されたオブジェクトファイルの結合処理を行うリンカにおいて、
各オブジェクトファイル内に生成されている関数の依存関係情報を基に、ファイル単位にファイル内関数が他ファイル内関数を呼び出す関係の情報を、生成することを特徴とするリンカ。 - 請求項1に記載のリンカにおいて、
ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置し、かつ同時使用されない自動変数領域を共有化してメモリ使用量を低減化するコンパイラにより生成されたオブジェクトファイルをも結合処理の対象とし、
各オブジェクトファイル内に生成されている関数の依存関係情報を基に、ファイル単位にファイル内関数が他ファイル内関数の呼出し関係情報を、生成することを特徴とするリンカ。 - 請求項2に記載のリンカにおいて、
各オブジェクトファイル内の自動変数領域のアドレス配置を決定する際に、生成されたファイル毎のファイル内関数呼出し情報を参照することを特徴とするリンカ。 - 請求項3に記載のリンカにおいて、
一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群とが、別のオブジェクトファイル内に存在する関数を介することを含めても、呼出し関係に無い場合、
両者内の自動変数領域の配置アドレスを同一化することを特徴とするリンカ。 - ソースファイルをコンパイルしてオブジェクトファイルを生成し、それらのオブジェクトファイルをリンクして生成された実行形式プログラムをシミュレートするシミュレータにおいて、
割り込みやマルチタスク動作を含む各関数内から他関数の呼びだし、または割り込みやタスク切り替えによる他関数への遷移状態を解析し、
各関数の開始から終了までに実行される他関数の実行情報を生成し、
動的に決定される末端関数を検出することを特徴とするシミュレータ。 - ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置するコンパイラにより、生成されたオブジェクトファイルの結合処理を行うリンカにおいて、
各オブジェクトファイル内の自動変数領域のアドレス配置を、上記請求項5にて検出される末端関数の情報を基にして、再度結合処理することにより決定することを特徴とするリンカ。 - 請求項6に記載のリンカにおいて、
既にオブジェクトファイル毎にコンパイラにより自動変数領域の共有化を行っている場合、
一方のオブジェクトファイル内に存在する関数群と他方のオブジェクトファイル内に存在する関数群とが、全く依存関係に無い場合、両者内の自動変数領域の配置アドレスを同一化することを特徴とするリンカ。 - 請求項6に記載のリンカにおいて、
コンパイラにより自動変数領域の共有化を行っていない場合、
それぞれの関数が、全く依存関係に無い場合、それら関数内の自動変数領域の配置アドレスを同一化することを特徴とするリンカ。 - コンパイラと、
請求項7又は請求項8に記載のリンカと、
請求項5に記載のシミュレータとを含むことを特徴とするプログラム開発支援システム。 - ソースファイルに記述されている関数の自動変数領域をスタティック領域として配置するコンパイラにおいて、
各オブジェクトファイル内の自動変数領域のアドレス配置に関して、上記請求項5にて検出される末端関数の情報を基にして、末端関数同士の自動変数領域の配置アドレスを同一化することを特徴とするコンパイラ。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003038190A JP2004246776A (ja) | 2003-02-17 | 2003-02-17 | 自動変数共有化コンパイラ、自動変数共有化リンカ及びプログラム開発支援システム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003038190A JP2004246776A (ja) | 2003-02-17 | 2003-02-17 | 自動変数共有化コンパイラ、自動変数共有化リンカ及びプログラム開発支援システム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004246776A true JP2004246776A (ja) | 2004-09-02 |
Family
ID=33022780
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2003038190A Pending JP2004246776A (ja) | 2003-02-17 | 2003-02-17 | 自動変数共有化コンパイラ、自動変数共有化リンカ及びプログラム開発支援システム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2004246776A (ja) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2484000A (en) * | 2010-09-23 | 2012-03-28 | Apple Inc | Method for compiler-based vectorization of non leaf code |
US8621448B2 (en) | 2010-09-23 | 2013-12-31 | Apple Inc. | Systems and methods for compiler-based vectorization of non-leaf code |
US8949808B2 (en) | 2010-09-23 | 2015-02-03 | Apple Inc. | Systems and methods for compiler-based full-function vectorization |
US9529574B2 (en) | 2010-09-23 | 2016-12-27 | Apple Inc. | Auto multi-threading in macroscalar compilers |
CN110262803A (zh) * | 2019-06-30 | 2019-09-20 | 潍柴动力股份有限公司 | 一种依赖关系的生成方法及装置 |
-
2003
- 2003-02-17 JP JP2003038190A patent/JP2004246776A/ja active Pending
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2484000A (en) * | 2010-09-23 | 2012-03-28 | Apple Inc | Method for compiler-based vectorization of non leaf code |
US8621448B2 (en) | 2010-09-23 | 2013-12-31 | Apple Inc. | Systems and methods for compiler-based vectorization of non-leaf code |
US8949808B2 (en) | 2010-09-23 | 2015-02-03 | Apple Inc. | Systems and methods for compiler-based full-function vectorization |
US9529574B2 (en) | 2010-09-23 | 2016-12-27 | Apple Inc. | Auto multi-threading in macroscalar compilers |
CN110262803A (zh) * | 2019-06-30 | 2019-09-20 | 潍柴动力股份有限公司 | 一种依赖关系的生成方法及装置 |
CN110262803B (zh) * | 2019-06-30 | 2023-04-18 | 潍柴动力股份有限公司 | 一种依赖关系的生成方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Adya et al. | Cooperative Task Management Without Manual Stack Management. | |
US6446258B1 (en) | Interactive instruction scheduling and block ordering | |
JP2008546086A (ja) | 共有リソースのためのアクセス協調を伴うプログラムコードを変換する方法および装置 | |
WO2011053303A1 (en) | Two way communication support for heterogenous processors of a computer platform | |
EP2176763A2 (en) | Memory transaction grouping | |
US20120166772A1 (en) | Extensible data parallel semantics | |
Tanter | Aspects of composition in the Reflex AOP kernel | |
US8266416B2 (en) | Dynamic reconfiguration supporting method, dynamic reconfiguration supporting apparatus, and dynamic reconfiguration system | |
Loff et al. | High-level stream and data parallelism in C++ for multi-cores | |
JP2004246776A (ja) | 自動変数共有化コンパイラ、自動変数共有化リンカ及びプログラム開発支援システム | |
JP2007066163A (ja) | プログラム生成方法およびプログラム | |
EP3635561B1 (en) | Asynchronous operation query | |
KR20180058579A (ko) | 액티비티 스택에 기반한 테스트 시나리오 생성 방법 | |
CN113867709B (zh) | 区块链智能合约读写集构建方法及装置 | |
KR20060035077A (ko) | 데이터 처리 장치 및 이를 이용한 레지스터 할당 방법 | |
Itoh et al. | Scone: using concurrent objects for low-level operating system programming | |
JP5276094B2 (ja) | トランザクション・メモリ・システムにおけるトランザクション・コード・ブロックを効果的に検索する方法 | |
US20020073133A1 (en) | Register allocation method and software development method for various execution environments and LSI for executing developed software | |
JP7064367B2 (ja) | デッドロック回避方法、デッドロック回避装置 | |
CN111880803A (zh) | 一种应用于多平台的软件构建方法及装置 | |
WO2008147738A1 (en) | Programming model for modular development | |
JP2016029547A (ja) | 実行モジュール生成装置、及び電子制御装置 | |
Harrison et al. | CAT: A toolkit for assembling concerns | |
JP5464673B2 (ja) | コンパイル支援装置、コンパイル支援方法、及びプログラム | |
US10956358B2 (en) | Composite pipeline framework to combine multiple processors |