JP2005228047A - 言語処理装置及び言語処理プログラム - Google Patents

言語処理装置及び言語処理プログラム Download PDF

Info

Publication number
JP2005228047A
JP2005228047A JP2004036179A JP2004036179A JP2005228047A JP 2005228047 A JP2005228047 A JP 2005228047A JP 2004036179 A JP2004036179 A JP 2004036179A JP 2004036179 A JP2004036179 A JP 2004036179A JP 2005228047 A JP2005228047 A JP 2005228047A
Authority
JP
Japan
Prior art keywords
global variable
global
base
code
address
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
Application number
JP2004036179A
Other languages
English (en)
Inventor
Hiroaki Sato
藤 弘 明 佐
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Original Assignee
Toshiba Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Toshiba Corp filed Critical Toshiba Corp
Priority to JP2004036179A priority Critical patent/JP2005228047A/ja
Publication of JP2005228047A publication Critical patent/JP2005228047A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】 大域変数のアドレスを生成するコストを可及的に低する。
【解決手段】 入力コードから同一のグループに属する大域変数をグループ別に抽出し、各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定し、前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成する。
【選択図】 図2

Description

本発明は、言語処理装置及び言語処理プログラムに関する。
一般的な32bitRISCでは、大域変数にアクセスするために、32bit幅のアドレスを生成する必要がある。この32bit幅のアドレスを生成するためには、複数の命令を使用しなければならない。
図9は、従来における大域変数のアクセス手法を説明する図である。
命令INST1の「lui r2, hi(a)」は、大域変数aのアドレスの上位16ビットを、全32ビット長のレジスタr2の上位16ビット領域に格納することを指示する(レジスタr2内の下位16ビットは全て0)。また、命令INST2の「lw r4, lo(a)(r2)」は大域変数aのアドレスの下位16ビットと、レジスタr2内のデータとを加算して大域変数aのアドレスを算出し、この大域変数aのアドレス内のデータをレジスタr4にロードすることを指示する。
よって、大域変数aにアクセスするためには、2つの命令INST1、INST2を必要とし、同様に、命令INST3、INST4に示すように、大域変数bにアクセスするためにも、2つの命令を必要とする。つまり、1つの大域変数にアクセスするためには2つの命令を必要とする。命令サイズを4バイト(32ビット)とすると、本手法により複数の大域変数にアクセスする場合、合計、アクセス数×8バイトのコードサイズを要する。
このように、本手法により大域変数へアクセスするには、大域変数ごとに2つの命令を使用するため、スタックポインタからのオフセットによりアクセスする局所変数の場合と比較して、常に倍に近いコードサイズ及び実行速度を要する。
そこで、ベースとなるアドレス(ベースアドレス)を設定し、そのベースアドレスからのオフセットによってアクセスするようにすると、コードサイズが縮小し、実行速度が向上する。具体的には、コンパイル時に、特定のメモリ領域に配置した大域変数については、ベースアドレスからのオフセットによりアクセスするようにする。これについて図10を用いて説明する。
図10は、従来における、ベースアドレスを用いた大域変数のアクセス手法を説明する図である。
命令INST5の「lw r4, g_off(a)(r2)」は、レジスタr2内に格納されたベースアドレスと、このベースアドレスから大域変数aのアドレスまでのオフセットg_off(a)とを加算して大域変数aのアドレスを算出し、このアドレス内のデータをレジスタr4にロードすることを指示する。従って、大域変数aにアクセスするためには、1つの命令を必要とし、同様に、命令INST6に示すように、大域変数bにアクセスするためにも、1つの命令を必要とする。つまり、1つの大域変数にアクセスするためには1つの命令を必要とする。よって、複数の大域変数にアクセスする場合、合計、アクセス数×4バイトのコードサイズを要する。
このように、ベースアドレスを用いることで、より少ない命令数によって大域変数にアクセスできる。しかし、問題点として、ベースアドレスが常に固定であるため、大域変数のアドレスを簡易に生成できるメモリ領域がベースアドレスから一定の範囲に限られることがある。
そこで、ベースアドレスを固定ではなく可変にする方法も考えられる。これについて図11を用いて説明する。
図11は、ベースアドレスを可変とした場合における大域変数のアクセス手法を説明する図である。
命令INST7の「lui gp, hi(base1)」は、ベースアドレスbase1の上位16ビットを、全32ビット長のグローバルポインタgpの上位16ビット領域に格納することを指示する(グローバルポインタgpの下位16ビットは全て0)。また、命令INST8の「addiu gp, gp, lo(base1)」は、ベースアドレスbase1の下位16ビットと、グローバルポインタgp内のデータとを加算してベースアドレスbase1を算出し、このベースアドレスbase1をグローバルポインタgpに格納することを指示する。即ち、これら2つの命令を用いてグローバルポインタgp内にベースアドレスbase1を設定する。
次に、命令INST9の「lw r4, g_off(a)(gp)」は、グローバルポインタgp内のベースアドレスbase1と、ベースアドレスbase1から大域変数aのアドレスまでのオフセットg_off(a)とを加算して大域変数aのアドレスを算出し、このアドレスに格納されたデータをレジスタr4にロードすることを指示する。
従って、本手法により複数の大域変数にアクセスする場合、ベースアドレスbase1を設定する2つの命令と、各大域変数へアクセスするためのそれぞれ1つの命令とを要し、コードサイズは、合計、8+アクセス数×4バイトとなる。
以上から分かるように、ベースアドレスbase1を切り替えるには、その都度、2つの命令を必要とするベースアドレスbase1の再設定が必要となる(命令INST7、INST8参照)。このため、大域変数が必要とするメモリ領域が大きい場合、ベースアドレスbase1の切り替えが頻繁に発生して、本手法による最適化の効果が薄くなってしまう。
一方、割り込み処理時には、ベースアドレスbase1を一旦保存し、割り込みプログラムにおいて上述の再設定を行い、割り込み終了後には、保存したベースアドレスbase1を復帰させる必要がある。つまり、ベースアドレスbase1の保存及び復帰という余計な処理が必要となる。なお、上述の固定のベースアドレスを用いる場合は、このような処理は生じない。
これらの結果、応答性能及びコードサイズは、アドレスを直接生成して大域変数にアクセスする場合(図9参照)よりも悪化及び増大してしまう。
特開2002−182926号公報 特開平10−124325号公報 特開平05−120028号公報 特開平02−171831号公報
本発明の目的は、コードサイズの縮小、延いては、実行速度の向上を図ることのできる言語処理装置及び言語処理プログラムを提供することにある。
本発明の言語処理装置は、入力コードから同一のグループに属する大域変数をグループ別に抽出する大域変数抽出手段と、各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定手段と、前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成するコード生成手段と、を備える。
本発明の言語処理装置は、ソースコードのコンパイルにより生成された目的コードにおける大域変数へのアクセスコード部分を書き換える言語処理装置であって、同一のグループに属する大域変数を前記目的コードからグループ別に抽出する大域変数抽出手段と、 各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定手段と、前記ソースコードから前記目的コードへの変換時に生成される大域変数の配置関係を表す情報を用いて、前記ベース大域変数と同一のグループに属する他の大域変数について前記ベース大域変数のアドレスからのオフセットを計測するオフセット計測手段と、前記ベース大域変数のアドレスに前記オフセットを加算して前記他の大域変数にアクセスするように、前記目的コードにおける前記他の大域変数へのアクセスコード部分を書き換えるコード変更手段と、を備える。
本発明の言語処理プログラムは、入力コードから同一のグループに属する大域変数をグループ別に抽出する大域変数抽出ステップと、各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定ステップと、前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成するコード生成ステップと、をコンピュータに実行させる。
本発明の言語処理プログラムは、ソースコードのコンパイルにより生成された目的コードにおける大域変数へのアクセスコード部分を書き換えることをコンピュータに実行させる言語処理プログラムであって、同一のグループに属する大域変数を前記目的コードからグループ別に抽出する大域変数抽出ステップと、各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定ステップと、前記ソースコードから前記目的コードへの変換時に生成される大域変数の配置関係を表す情報を用いて、前記ベース大域変数と同一のグループに属する他の大域変数について前記ベース大域変数のアドレスからのオフセットを計測するオフセット計測ステップと、 前記ベース大域変数のアドレスに前記オフセットを加算して前記他の大域変数にアクセスするように、前記目的コードにおける前記他の大域変数へのアクセスコード部分を書き換えるコード変更ステップと、をコンピュータに実行させる。
本発明により、コードサイズの縮小、延いては、実行速度の向上を図ることができる。
図1は、本実施の形態に従ったコンパイラ(言語処理プログラム)による処理ステップ(後述)により生成された、複数の関数を含むコードの一部を示す図である。
このコード部分は、ある関数内における例えば先頭の3つの命令を示し、最初の2つの命令INST11、12で大域変数aにアクセスし、次の命令INST12で大域変数bにアクセスする。より詳しくは以下の通りである。
命令INST11、INST12は、大域変数aのアドレスを生成し、生成された大域変数aのアドレスに格納されたデータをレジスタr4にロードする命令である。
即ち、命令INST11の「lui r2, hi(a)」は、大域変数a(32ビット)の上位16ビットを、全32ビット長のレジスタr2の上位16ビット領域に格納することを指示する(レジスタr2の下位16ビットには全て0が格納される)。また、命令INST12の「lw r4, lo(a)(r2)」は、大域変数aの下位16ビットとレジスタr2内のデータとを加算して大域変数aのアドレスを生成し、この大域変数aのアドレスに格納されたデータをレジスタr4にロードすることを指示する。
次に、命令INST13は、大域変数aのアドレスに、大域変数aのアドレスと大域変数bのアドレスとのオフセットを加えることにより大域変数bのアドレスを生成し、この大域変数bのアドレスに格納されたデータをレジスタr5にロードする命令である。
即ち、命令INST13の「lw r5, lo(a)+offset(b-a)(r2)」は、レジスタr2内のデータと大域変数a、b間のオフセット(offset(b−a))とを加算し、さらにこれに、大域変数aの下位アドレス(lo(a))を加えたアドレス(大域変数bのアドレス)に格納されたデータをレジスタr5にロードすることを指示する。言い換えると、命令INST13は、大域変数aのアドレス(lo(a)+レジスタr2内のデータ)に大域変数a、b間のオフセット(offset(b−a))を加算することにより大域変数bのアドレスを算出し、このアドレスに格納されたデータをレジスタr5にロードすることを指示する。
以上のように、このコードでは、最初にアクセスする大域変数aについては従来と同様に直接、アドレスを生成し、アクセスする。従って、2つの命令を要する(図9参照)。しかし、2番目以降にアクセスする大域変数b等については、大域変数aからのオフセットによりアクセスするので、必要な命令数は、1命令である。従って、複数の大域変数にアクセスするために必要な合計のコードサイズは、1つの命令長を4バイトとすると、図1に示すように、(4+アクセス数×4)バイトとなる。
以上では1つの関数に着目して説明したが、他の関数においても同様のコード形式を有する。つまり、各関数において最初にアクセスする大域変数については従来と同様に直接、アドレスを生成してアクセスするが、2番目以降の大域変数については最初にアクセスした大域変数のアドレスからのオフセットにより、つまり1命令でアクセスする。
但し、以上までの説明において、同一関数内の各大域変数は同一のメモリ領域(例えば、tiny領域、near領域、far領域、各領域が複数のセクションに分割されている場合の各セクション等)に配置されているものとする。
図2は、本発明の実施の形態としてのコンパイラによる処理ステップを示すフローチャートである。
本コンパイラによる処理ステップは、例えば、従来のコンパイルによる処理(前処理)の後処理として実行される。従って、本処理の開始前には、変数配置が既に決定されており、本処理では、この変数配置を利用する。より詳しくは以下の通りである。
まず、従来のコンパイル処理の結果としてのコード(対象コード)(例えばアセンブリコード)を先頭から読み込んで最初に現れる関数を特定し、特定した関数内の大域変数をメモリ領域別に抽出する(ステップS1)。
即ち、一般的に、上述の前処理では、大域変数へのアクセス手法(図9、図10参照)等に応じて各大域変数をそれぞれ異なるメモリ領域に割り当てる。大域変数が実際に配置されるアドレスは、リンク処理時に決定されるので、コード生成の段階(コンパイル時)では特定できないが、大域変数がどの種類のメモリ領域に属するかという情報は、コンパイラが有している。従って、この情報を利用することで、特定した関数内の大域変数がいずれのメモリ領域に配置されたのかを判断できる。
次に、抽出した大域変数が、各メモリ領域について、一番はじめに抽出されたものであるかどうか、つまり、一番はじめにアクセスされるものであるかどうかを判断する(ステップS2)。
抽出した大域変数が一番初めのものである場合は(ステップS2のYes)、当該関数中においてこの大域変数へアクセスするコードを、アドレスを直接生成してアクセスするコードに書き換える(ステップS3)。例えば、図1の命令INST11、INST22に示す形式のコードに書き換える。但し、既にこの形式を有していれば書き換える必要はない。
一方、抽出した大域変数が一番はじめに抽出されたものでない場合は(ステップS2のNo)、その大域変数が、外部参照型であるかどうかを判断する(ステップS4)。抽出した大域変数が外部参照型であるかどうかは、例えば、対象コード中に記述された宣言に基づいて判断する。
その大域変数が外部参照型である場合は(ステップS4のYes)、上述と同様に、この大域変数へアクセスするコードを、アドレスを直接生成してアクセスするコードに書き換える(ステップS3)。但し、既にこの形式を有していれば書き換える必要はない。
一方、その大域変数が外部参照型でない場合は(ステップS4のNo)、この大域変数と、ステップS2で一番はじめに抽出したと判断された大域変数とのオフセットを上述の変数配置に基づき計算し、このオフセットが所定の範囲(命令セットの範囲)に収まるか否かを判断する(ステップS5)。つまり、上述の前処理により各大域変数の既に決定しているので、この変数配置に基づき、抽出した大域変数が、所定のオフセットによる範囲内に収まるか否かを判断する。
抽出した大域変数がオフセットによる範囲内に収まる場合は(ステップS5のYes)、当該関数中においてこの大域変数へアクセスするコードを、一番はじめに抽出した大域変数からのオフセットによりアクセスするコードに書き換える(図1の命令INST13参照)(ステップS6)。つまり、最初にアクセスする大域変数のアドレスにオフセット(命令INST13の「offset(b−a)」参照)を加算することによりこの大域変数へアクセスするコードを生成する。
以上のようにして、最初に特定した関数内における大域変数へのアクセスコードを書き換えたら、対象コード中の他の関数についても、上述の処理ステップS1〜S6を繰り返して、大域変数へのアクセスコードを書き換える。
以上のように、本実施の形態によれば、同一の関数且つ同一のメモリ領域ごとに固有のベースアドレスを持たせるようにしたので、少ない命令数で大域変数にアクセスできる可能性を可及的に高めることができる。つまり、これらの大域変数が、従来の固定のグローバルポインタから遠くに配置されていたとしても、最初にアクセスした大域変数からのオフセットによる範囲に収まれば、1命令でアクセスすることが可能となる。この際、ベースアドレスとして最初にアクセスした大域変数のアドレスを再利用するので、従来のベースアドレスの設定(図11参照)のような余計な命令は必要なく、従って、少ない命令数でアクセスできる。このように、本実施形態によれば、少ない命令数で大域変数にアクセスできる結果、コードサイズの縮小及び実行速度の向上を図ることができる。
また、本実施の形態によれば、割り込み処理時においても、従来から行われていたのと同様のレジスタ待避等を行えば良く、図11を用いて説明したような特別なレジスタの待避(グローバルポインタの待避)等の余計な処理は生じない。よって、割り込み処理時においても、実行性能の低下は生じない。
以上では、前処理により決定された変数配置をそのまま用いたが、以上の処理により生成されたコードを用いて変数の再配置を行い、この新たな変数配置に基づいて、上述の処理を再度行うことも可能である。以下、この例について説明する。
図3は、上述した図2に示す処理により生成されたコードに基づいて変数を再配置し、新たな変数の再配置に基づいて上述の処理を再度行う処理ステップ例を示すフローチャートである。
まず、上述した図2に示す処理により生成されたコード中からメモリ領域別且つ関数別に大域変数を抽出し、大域変数テーブルに登録する(ステップS11)。
図4(a)〜図4(c)は、コード中に3つの関数func1,func2,func3が含まれる場合において各関数func1,func2,func3について作成された大域変数テーブルを示す図である。
図中、各大域変数の前に付された「int」は、各大域変数が整数であることを表す型コードである。
図4(a)〜図4(c)の見方について、図4(a)を例に取り、説明する。
図4(a)の左欄は、大域変数a1のアドレスをベースアドレスとしてアクセスする回数が、大域変数b1は2回、大域変数c1は3回あることを表す。一方、図4(a)の右欄は、大域変数a2のアドレスをベースアドレスとしてアクセスする回数が、大域変数b2は1回、大域変数c2は2回あることを表す。
次に、関数ごとに作成した大域変数テーブルをメモリ領域別に集計した集計テーブルを作成する(ステップS12)。
図5は、メモリ領域M1に関して作成された集計テーブルを示す図である。図6は、メモリ領域M2に関して作成された集計テーブルを示す図である。
図5に示すように、大域変数a1は計5回、大域変数d1、f1はそれぞれ計2回、ベースアドレスとして参照されている。一方、図6に示すように、大域変数a2、c2はそれぞれ計3回、大域変数d2は計4回、ベースアドレスとして参照されている。
次に、各メモリ領域の集計テーブルを用いて、メモリ領域ごとに、大域変数の配置順序を決定する(図3のステップS13)。現時点での変数配置は、メモリ領域M1は、a1、b1、c1、d1、e1、f1、メモリ領域M2は、a2、b2、c2、e2、d2の順であるとする(図4参照)。
図7は、メモリ領域M1に関する集計テーブル(図5参照)に基づき、大域変数の配置順序を決定する様子を示す図である。図8は、メモリ領域M2に関する集計テーブル(図6参照)に基づき、大域変数の配置順序を決定する様子を示す図である。
具体的な大域変数の配置順序の決定手法について、図5及び図7を用いて、メモリ領域M1を例にして説明する。
(1)まず、図5の集計テーブルに基づき、被参照回数が最も多い大域変数を1つ選択(ここでは大域変数a1)して、図7に示すように、メモリ領域M1の先頭に配置する。被参照回数が最大の大域変数が複数ある場合は、例えば集計テーブルの上位に配置された方を優先する。
(2)次に、選択された大域変数を参照する回数の多い、同じ関数内の大域変数を、参照する回数(但し1回以上)の多い順に選択して(ここでは大域変数c1、b1の順に選択)、図7に示すように、大域変数a1の後側(高位アドレス側)に順次配置する。
(3)次に、残りの大域変数(ここでは大域変数d1、e1、f1)の中から、被参照回数が最も多い大域変数を選択し(ここでは大域変数d1)、(2)と同じ処理を行う。この結果、図7に示すように、大域変数b1の後側に、大域変数d1、e1が、順次配置される。
(4)次に、(3)の処理を繰り返す。この結果、大域変数e1の後に、大域変数f1が配置される。
(5)残った大域変数(本例では特に該当するものはない)、つまり、参照・被参照関係のない大域変数(他の大域変数のアドレスをベースとしてアクセスする大域変数でも、他の大域変数によってベースアドレスとして用いられる大域変数でもない)は、メモリ領域内の任意の位置、例えば(4)までの処理によって配置された大域変数の直後に配置する。
以上では、メモリ領域M1を例にして、大域変数の配置順序を決定したが、メモリ領域M2についても、同様にして行う(図6及び図8参照)
この後、新たな大域変数の配置順序に基づいて、図2のフローチャートに示す処理ステップを再度行い、コードを生成する(ステップS14)。
以上の処理による効果として以下のことが考えられる。即ち、ベースアドレスを参照する回数の多い大域変数を、ベースアドレスを有する大域変数に近づけて配置したので、変数の再配置を行わない場合よりも、最終的により短い機械語コード(例えばアセンブリコードをアセンブルしたコード)を生成できる可能性がある。例えば、図5に示すように、大域変数の再配置前は、大域変数の配置順序は、大域変数a1、b1、c1・・の順序であったが、大域変数の再配置後は、大域変数a1、c1、b1・・となり、大域変数a1を参照する回数の多い大域変数c1(3回)を、参照回数の少ない回数の大域変数b1(2回)と入れ替えて、大域変数a1に近づけた。大域変数a1に近い程、オフセット長を短くできるので、この結果、最終的に生成される機械語のコードサイズを短くできる可能性がある。
本発明の実施の形態としてのコンパイラによる処理ステップにより生成されたコードの一部を示す図である。 本発明の実施の形態としてのコンパイラによる処理ステップを示すフローチャートである。 図2の処理ステップにより生成されたコードに基づいて、変数の再配置を行う処理ステップを示すフローチャートである。 大域変数テーブルを示す図である。 集計テーブルを示す図である。 集計テーブルを示す図である。 図5の集計テーブルに基づき、大域変数の配置順序を決定する様子を示す図である。 図6の集計テーブルに基づき、大域変数の配置順序を決定する様子を示す図である。 従来における大域変数のアクセス手法を説明する図である。 従来における、ベースアドレスからのオフセットによる大域変数のアクセス手法を説明する図である。 従来における、ベースアドレスを可変とした場合の大域変数のアクセス手法を説明する図である。
符号の説明
INST1〜INST12 命令
S1〜S6、S11〜S14 ステップ

Claims (5)

  1. 入力コードから同一のグループに属する大域変数をグループ別に抽出する大域変数抽出手段と、
    各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定手段と、
    前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成するコード生成手段と、
    を備えた言語処理装置。
  2. ソースコードのコンパイルにより生成された目的コードにおける大域変数へのアクセスコード部分を書き換える言語処理装置であって、
    同一のグループに属する大域変数を前記目的コードからグループ別に抽出する大域変数抽出手段と、
    各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定手段と、
    前記ソースコードから前記目的コードへの変換時に生成される大域変数の配置関係を表す情報を用いて、前記ベース大域変数と同一のグループに属する他の大域変数について前記ベース大域変数のアドレスからのオフセットを計測するオフセット計測手段と、
    前記ベース大域変数のアドレスに前記オフセットを加算して前記他の大域変数にアクセスするように、前記目的コードにおける前記他の大域変数へのアクセスコード部分を書き換えるコード変更手段と、
    を備えたことを特徴とする言語処理装置。
  3. 前記大域変数抽出手段は、同一の関数内に属する大域変数を、前記同一のグループに属する大域変数として抽出することを特徴とする請求項1又は2に記載の言語処理装置。
  4. 入力コードから同一のグループに属する大域変数をグループ別に抽出する大域変数抽出ステップと、
    各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定ステップと、
    前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成するコード生成ステップと、
    をコンピュータに実行させる言語処理プログラム。
  5. ソースコードのコンパイルにより生成された目的コードにおける大域変数へのアクセスコード部分を書き換えることをコンピュータに実行させる言語処理プログラムであって、
    同一のグループに属する大域変数を前記目的コードからグループ別に抽出する大域変数抽出ステップと、
    各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定ステップと、
    前記ソースコードから前記目的コードへの変換時に生成される大域変数の配置関係を表す情報を用いて、前記ベース大域変数と同一のグループに属する他の大域変数について前記ベース大域変数のアドレスからのオフセットを計測するオフセット計測ステップと、
    前記ベース大域変数のアドレスに前記オフセットを加算して前記他の大域変数にアクセスするように、前記目的コードにおける前記他の大域変数へのアクセスコード部分を書き換えるコード変更ステップと、
    をコンピュータに実行させることを特徴とする言語処理プログラム。
JP2004036179A 2004-02-13 2004-02-13 言語処理装置及び言語処理プログラム Pending JP2005228047A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2004036179A JP2005228047A (ja) 2004-02-13 2004-02-13 言語処理装置及び言語処理プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2004036179A JP2005228047A (ja) 2004-02-13 2004-02-13 言語処理装置及び言語処理プログラム

Publications (1)

Publication Number Publication Date
JP2005228047A true JP2005228047A (ja) 2005-08-25

Family

ID=35002716

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004036179A Pending JP2005228047A (ja) 2004-02-13 2004-02-13 言語処理装置及び言語処理プログラム

Country Status (1)

Country Link
JP (1) JP2005228047A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2014531680A (ja) * 2011-10-03 2014-11-27 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation デコード時間命令最適化を用いた、強化されたアプリケーション・バイナリ・インターフェース(abi)のためのコードのコンパイル
CN112334873A (zh) * 2018-07-03 2021-02-05 欧姆龙株式会社 编译装置以及编译方法

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2014531680A (ja) * 2011-10-03 2014-11-27 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation デコード時間命令最適化を用いた、強化されたアプリケーション・バイナリ・インターフェース(abi)のためのコードのコンパイル
CN112334873A (zh) * 2018-07-03 2021-02-05 欧姆龙株式会社 编译装置以及编译方法

Similar Documents

Publication Publication Date Title
TWI691898B (zh) 仿真裝置、仿真方法及儲存仿真程式的儲存媒體
JP2007293383A (ja) プログラム開発支援装置及びプログラム開発支援装置の動作方法
JP2008269569A (ja) コード変換装置
US8266416B2 (en) Dynamic reconfiguration supporting method, dynamic reconfiguration supporting apparatus, and dynamic reconfiguration system
JP2001216169A (ja) 第1ビット・アーキテクチャの命令を第2ビット・アーキテクチャの命令に変換する方法、システム、プログラムおよびデータ構造
CN101847096A (zh) 包含栈变量函数的优化方法
JP5504960B2 (ja) シミュレーション装置及びシミュレーション方法
JP3863544B1 (ja) 演算処理装置及び演算処理方法
JP2005228047A (ja) 言語処理装置及び言語処理プログラム
US20210373859A1 (en) Instruction translation support method and information processing apparatus
JP2021184246A (ja) 命令変換支援プログラム、命令変換支援方法および情報処理装置
JPH01118931A (ja) プログラム変換方式
JPH10320212A (ja) キャッシュ向け最適化方法
JP5551868B2 (ja) 実行ファイル作成装置
JPH11345127A (ja) コンパイラ
JP2000020318A (ja) メモリアクセス命令削減装置および記録媒体
JP7168731B1 (ja) メモリアクセス制御装置、メモリアクセス制御方法、及び、メモリアクセス制御プログラム
JPH02140825A (ja) プログラムの再配置処理方法
JPH086797A (ja) 定数参照最適化処理装置
JP2006113935A (ja) ダイナミックリンクライブラリ呼び出しコード生成方法、プログラム、および、装置
JP2002312167A (ja) 変数の値をコンピュータに算出させるためのプログラム、コンパイルプログラム、変数値確定方法およびプログラム生成方法
JP2002073347A (ja) 例外処理方法及びコンパイラ
CN116775127A (zh) 一种基于RetroWrite框架的静态符号执行插桩方法
CN117762423A (zh) Java智能合约的编译方法、装置、存储介质以及电子设备
JPH10301791A (ja) オブジェクトコード最適化装置、オブジェクトコード最適化方法、オブジェクトコード最適化プログラムを記録した機械読み取り可能な記録媒体、及び、コンパイラ