JP5448976B2 - コード生成処理装置及びコード生成処理プログラム - Google Patents

コード生成処理装置及びコード生成処理プログラム Download PDF

Info

Publication number
JP5448976B2
JP5448976B2 JP2010081822A JP2010081822A JP5448976B2 JP 5448976 B2 JP5448976 B2 JP 5448976B2 JP 2010081822 A JP2010081822 A JP 2010081822A JP 2010081822 A JP2010081822 A JP 2010081822A JP 5448976 B2 JP5448976 B2 JP 5448976B2
Authority
JP
Japan
Prior art keywords
instruction
object file
relocation
program
code generation
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.)
Active
Application number
JP2010081822A
Other languages
English (en)
Other versions
JP2011215759A (ja
Inventor
勝己 奥田
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.)
Mitsubishi Electric Corp
Original Assignee
Mitsubishi Electric 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 Mitsubishi Electric Corp filed Critical Mitsubishi Electric Corp
Priority to JP2010081822A priority Critical patent/JP5448976B2/ja
Publication of JP2011215759A publication Critical patent/JP2011215759A/ja
Application granted granted Critical
Publication of JP5448976B2 publication Critical patent/JP5448976B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Description

本発明は、計算機向け機械語プログラムを生成するためのコード生成処理装置に関し、特に、複数のソースプログラムを複数のオブジェクトファイルにコンパイルあるいはアセンブルし、その後、複数のオブジェクトファイルをリンクしてプロセッサが実行可能な機械語プログラムを生成するコード生成処理装置及びそのプログラムに関する。
一般のアセンブラやリンカの処理方式では、コード生成対象プロセッサの命令セットアーキテクチャに固有の情報をアセンブラやリンカのプログラムコード中に含んでいる。従って、命令セットアーキテクチャの新規開発や仕様変更をした場合、アセンブラやリンカのプログラムコードの新規開発や修正が必要となる。また、特定用途向けプロセッサの開発や構成可能プロセッサにおける拡張命令の開発においては、命令の追加、修正、削除が頻繁に発生するため、アセンブラやリンカなどの開発ツールの再構築に要する時間の短縮が課題となる。この課題に対し、従来、コード生成対象プロセッサの命令セットアーキテクチャに非依存なアセンブラの方式が提案されてきた。
例えば、特許文献1「アセンブラ処理方式」では、プロセッサの周辺リソース情報と命令構成情報をそれぞれ定義したファイルからテーブルを構築し、テーブルを基にソースプログラムからオブジェクトコードを生成するための方法が開示されている。この方法によれば、プロセッサの周辺リソース情報と命令構成情報のファイルを変更することによって、アセンブラの再構築を必要とすることなくプロセッサの仕様変更に対応すること可能である。
この他に、プロセッサに依存する情報を表としてアセンブラの処理から切り離した方式は特許文献2「機械語翻訳プログラム方式」でも開示されている。一般に、アセンブリ言語において命令オペランドとして記述される式の値は、必ずしもそのまま命令に格納されるとは限らない。アセンブラは、アセンブリ言語におけるオペランドの式の値にさらに演算を加えた後で、命令のフィールドに格納することを必要とする場合がある。つまり、実際の命令フィールドに格納されるときに適用される演算は、アセンブリ言語における命令オペランド毎に異なる。特許文献2による方法では、この命令フィールドへの格納時に必要となる演算を数式表として命令表に保持することによって、アセンブラの機種依存性を解消していた。
特開平8−286927号公報 特開平4−7746号公報
しかしながら、上記従来の方法は、ソースプログラムを一旦オブジェクトファイルに変換し、複数のオブジェクトファイルをリンクして単一の実行可能ファイルを生成するコード生成方式に対応していない。コード生成処理が複数オブジェクトファイルのリンク処理を含む場合、アセンブラおよびリンカに機種依存性が残るため、プロセッサ仕様の変更は依然としてアセンブラプログラムおよびリンカプログラムの変更を必要とすることが問題となる。
以下では、リンク処理における機種依存性の説明を行う。特殊な機能を持った特定のアセンブリ言語記述に依存しないように、図2に示す単純な命令フォーマットとニーモニックの対応を持つアセンブリ言語を想定して説明を進める。命令フォーマット201は、オペコードと0個以上のフィールドから構成される。ここで、オペコードは、プロセッサが実行すべき命令を識別すためのコードを表す整数値である。命令のフィールドは、命令のオペランドを表現する整数値である。ただし、命令のオペランドと命令のフィールドは一対一に対応するとは限らない点に注意が必要である。例えば、命令がメモリオペランドを持つ場合、メモリオペランドは、メモリのベースアドレスを保持するレジスタの番号を保持するフィールドとベースアドレスからのオフセットを保持するフィールドの2つを用いて表現される場合もあり得る。ニーモニック202は、以降の説明で使用するアセンブリ言語のニーモニック表現である。ニーモニック表現は、命令名と0個以上の命令フィールドの文字列表現である。命令名は、オペコードに対応し、式はフィールドに対応する。式は、以下のBNFで表現可能である。
式 := 数
| シンボル
| 式 + 式
| 式 - 式
| 式 * 式
| 式 / 式
| 式 % 式
| 式 >> 式
| 式 << 式
| 式 & 式
| 式 | 式
| ^ 式
| - 式
| ( 式 )
上記BNFにおける記号はC言語の演算子の意味、結合性、優先度に従うものとする。例えば、+演算子は和を意味し、左結合を持ち、*演算子より低い優先度を持つ。上記BNFにおける数は、正の整数値を表す文字列である。また、シンボルは、データや手続きのアドレス、セクション開始アドレスを。式の中におけるシンボルは、数式における変数と考えて良い。
例として、MIPSアーキテクチャのGNUアセンブラのアセンブリ言語表現おけるニーモニック
lui $1, %hi(foo)
という記述は、図2によるニーモニックでは
lui 1, foo >> 16
と記述される。
また、GNUアセンブラにおける
beq $1, $2, foo
は、図2におけるニーモニックでは、
beq 1, 2, foo - __pc
として記述することができる。beq命令は、汎用レジスタ1と汎用レジスタ2が等しい場合、アドレスfooに分岐することを表すニーモニックである。ここで、beq命令のアドレスフィールドはプログラムカウンタ相対アドレスであるため、実際の命令フィールドに格納される値はfooの値からプログラムカウンタの値を減じた値である。ここで __pc は、プログラムカウンタを表すシンボルである。
図2のニーモニック表現を入力とするアセンブラは、ニーモニックを機械語に変換する際、式の値を評価し、対応する命令フィールドに値を格納する。しかし、式がシンボルを含む場合、アセンブラは式の値を計算することができない。これは、シンボルの値がアセンブル時にではなくリンク時に決定するためである。リンカは、シンボルの値が決定した後に、リロケーション処理において式の値を計算し命令のフィールドに格納する。
ここで、リンカのリロケーション処理は、アセンブラが出力したオブジェクトファイルのどの位置がシンボルを参照していて、どのように式の値を計算し、値を格納するかについての情報(リロケーション情報)を必要とする。一般のリンク方式では、式の計算方法と値の格納方法についてアセンブラとリンカの間で共通のプロトコルを持つ。すなわち、式の計算方法と値の格納方法の組み合わせ毎に一意な番号をリロケーションタイプとして割り当て、アセンブラがオブジェクトファイルを介してリロケーションタイプをリンカに与えることによってリロケーションの方法を伝達する。したがって、プロセッサの仕様変更によって式の計算方法や格納位置が変わった場合にはアセンブラとリンカの間のプロトコルを変更する必要がある。しかし、このプロトコルの変更はアセンブラプログラムに対する変更だけでは不十分であり、リンカプログラムに対しても変更が必要である。
以上の理由により、従来のテーブルをベースとしたアセンブラでは、命令の生成において機種依存をなくすことができても、リンク処理に関して、機種依存性をなくすことができないという問題があった。
この発明は上記のような課題を解決するためになされたもので、リンク処理に影響を及ぼすプロセッサ仕様の変更や異なるプロセッサを対象とする場合でも再構築することなく利用可能なコード生成装置及びそのプログラムを得ることを目的とする。
この発明に係るコード生成処理装置は、ソースプログラムをオブジェクトファイルにコンパイルあるいはアセンブルし、その後、オブジェクトファイルをリンクしてプロセッサが実行可能な機械語プログラムを生成するコード生成処理装置において、オブジェクトファイルの生成時に、リロケーションを行うための計算手順と計算結果を格納すべきビット位置とをオブジェクトファイルと関連付けるオブジェクトファイル関連付け手段と、リンク時に、オブジェクトファイルと関連付けられたリロケーションを行うための計算手順と計算結果を格納すべきビット位置とを読み出し解釈することによってリロケーション処理を行うリロケーション処理手段とを備え、計算手順は、シンボル参照位置のうちの1つに直接または間接的に格納すべき値の計算手順として2つ以上の命令を含む命令列から構成され、命令は2つ以上のオペランドを使用し、オペランドは定数またはシンボルの値または事前に実行した命令の結果であり、命令列のうち少なくとも1つはシンボルの値を使用する命令であり、命令列のうち少なくとも2つの命令は演算命令であり、演算命令は算術演算命令の集合とビット演算命令の集合とシフト演算命令の集合とに含まれる全てまたは一部の演算命令の集合の中から選択されるものである。
この発明のコード生成処理装置は、リロケーションを行うための計算手順と計算結果を格納すべきビット位置とをオブジェクトファイルと関連付け、リロケーション処理手段は、オブジェクトファイルから、リロケーションを行うための計算手順と計算結果を格納すべきビット位置とを読み出し解釈することによってリロケーション処理を行うようにしたので、リンク処理に影響を及ぼすプロセッサ仕様の変更や異なるプロセッサを対象とする場合でも再構築することなく利用可能とすることができる。
本発明の実施の形態1によるコード生成処理装置の構成図である。 本発明の実施の形態1によるコード生成処理装置の命令フォーマットとニーモニックとの対応を示す説明図である。 本発明の実施の形態1によるコード生成処理装置の命令情報表の構成図である。 本発明の実施の形態1によるコード生成処理装置のアセンブラのニーモニック処理のフローチャートである。 本発明の実施の形態1によるコード生成処理装置の式と抽象構文木の対応を示す説明図である。 本発明の実施の形態1によるコード生成処理装置のリロケーションプログラムの命令体系を示す説明図である。 本発明の実施の形態1によるコード生成処理装置のリロケーションプログラム生成処理のフローチャートである。 本発明の実施の形態1によるコード生成処理装置の抽象構文木プログラム変換を示すフローチャートである。 本発明の実施の形態1によるコード生成処理装置のリロケーションプログラムコードを示す説明図である。 本発明の実施の形態1によるコード生成処理装置のオブジェクトファイルの内部構成を示す説明図である。 本発明の実施の形態1によるコード生成処理装置のリンク処理を示すフローチャートである。 本発明の実施の形態1によるコード生成処理装置の領域連結処理を示すフローチャートである。 本発明の実施の形態1によるコード生成処理装置のテーブル更新処理を示すフローチャートである。 本発明の実施の形態1によるコード生成処理装置のリロケーション処理を示すフローチャートである。 本発明の実施の形態1によるコード生成処理装置のシンボル値の取得手順を示すフローチャートである。 本発明の実施の形態1によるコード生成処理装置のリロケーションプログラム実行時のスタック遷移を示す説明図である。
実施の形態1.
図1は、この発明の実施の形態1によるコード生成処理装置を示す構成図である。
図1に示すコード生成処理装置は、ソースファイル101と命令情報表102とを用いてオブジェクトファイル107を生成するオブジェクトファイル生成部103と、オブジェクトファイル107からリンク処理を行い、ロードモジュール116を出力するリンカ113とを備える。ここで、オブジェクトファイル生成部103とリンカ113は、コンピュータを用いて実現され、それぞれの機能に対応するソフトウェアとこれらのソフトウェアを実行するためのCPUや主記憶装置といったハードウェアから構成されている。あるいはそれぞれ専用のハードウェアで構成されていてもよい。
ソースファイル101は、図2に示すニーモニック202を持つアセンブリ言語プログラムである。また、命令情報表102は、ソースファイル101が対象とするプロセッサの命令フォーマットを格納したテーブルであり、これについては後で詳述する。これらソースファイル101及び命令情報表102はそれぞれ磁気ディスクや光ディスクあるいはフラッシュメモリといった記憶媒体に格納されている。
オブジェクトファイル生成部103は、ソースファイル101と命令情報表102を入力とし、オブジェクトファイル107を生成するアセンブラであり、オブジェクトファイル関連付け手段を構成する。このオブジェクトファイル生成部103は、文法解析部104と機械語生成部105とリロケーション用命令列生成部106とを備えている。文法解析部104は、ソースファイル101を入力し、ソースファイル101に含まれるニーモニック行を命令名と複数の式に分割する処理部である。機械語生成部105は、命令情報表102に基づきオブジェクトファイル107に含まれる命令領域108を生成する処理部である。その他、機械語生成部105では、オブジェクトファイル107に含まれるデータ領域109やシンボルテーブル110、リロケーションテーブル111などを生成する。リロケーション用命令列生成部106は、リロケーションプログラム112を生成する。
オブジェクトファイル107は、命令領域108とデータ領域109、シンボルテーブル110、リロケーションテーブル111、リロケーションプログラム112など複数の領域を含む。ただし、これらの領域は、必ずしも単一のオブジェクトファイル107に格納されている必要はない。例えば、1つの領域毎に1つのファイルが割り当てられていても良い。また、オブジェクトファイル107は、磁気ディスクや光ディスクあるいはフラッシュメモリといった記憶媒体に格納されている。
命令領域108とデータ領域109は、ソースファイル101に含まれる命令やデータから変換された機械語である。ただし、ソースファイル101中のシンボル参照箇所は、正しい値が格納されていない状態である。
リンカ113は、リロケーション処理手段を構成するもので、一度に複数のオブジェクトファイル107を入力とし、プロセッサの主記憶に格納して実行することが可能なロードモジュール116を生成する。リンカ113は、複数のオブジェクトファイル107に含まれる命令領域108やデータ領域109を同じ種類の領域毎に結合する領域連結部114と、ロードモジュール116に含まれる命令領域117やデータ領域118に含まれるシンボル参照位置に正しい値を格納するリロケーションプログラムインタプリタ115を持つ。
次に、図3から図9を用いてオブジェクトファイルの生成処理手順の説明を行う。
図3は、命令情報表102の構成図である。命令情報表102の構築方法に関しては本発明と無関係であるため言及せず構成のみを示す。
命令情報表102は、列として命令名301、テンプレート302、命令サイズ303、フィールド情報304を持つ。命令名301は、命令情報表102において一意なエントリを識別する主キーである。テンプレート302は、命令のオペコードが格納され、オペコード以外のフィールドに0が格納された命令のテンプレートである。命令サイズ303は、命令のバイト数である。フィールド情報304は、命令のフィールドに関する情報をフィールド位置表305の形式で保持する。フィールド位置表305は、1つの命令のすべてのフィールドに対応する個々のエントリを持ち、各エントリはLSB位置306とMSB位置307を持つ。LSB位置306は、フィールドのLSB(Least Significant Bit)が存在する命令中でのビット位置を表す。また、MSB位置307は、フィールドのMSB(Most Significant Bit)が存在する命令中でのビット位置を表す。尚、図3の命令情報表102の構成は、JSONやYAMLなど一般的なデータ格納用のフォーマットで容易に表現可能かつ記憶媒体に格納可能である。
図4は、アセンブラの処理のうち、機械語生成部105がニーモニックの一行に対する機械語生成を行うための処理手順を表すフローチャートである。ここで、機械語生成部105が処理を開始する時点で文法解析部104がニーモニック行を命令名と0個以上の式に分割しているものとする。また、文法解析部104は、文字列表現の式を抽象構文木の形式に変換し、コンピュータの主記憶装置上に格納するものとする。
ステップST401は、命令名をキーとして命令情報表102から命令のテンプレート302、命令サイズ303、フィールド情報304を取得する処理である。ステップST402は、命令のテンプレートから命令を作成する処理である。ステップST403〜ST408を含むループ(A)は、1回の実行でニーモニック行に含まれる1つの式を処理し、ニーモニックが式を含まない場合は1回も実行されない。
ステップST403は、ステップST402で取得したフィールド情報304から式の値を格納すべき命令中のLSB位置306とMSB位置307を取得する処理である。フィールド情報304が保持するフィールド位置表305のエントリは、1つの式と一対一に対応している。例えば、ニーモニック中の先頭の式の値を格納すべき位置は、フィールド位置表305の先頭のエントリが保持している。
ステップST404は、式の値を計算する処理である。式がシンボルを含む場合、シンボルを含まない部分式のみ計算し、式の簡略化を行っても良い。
ステップ405は分岐処理であり、式がシンボルを含まない場合はステップST406を行い、式がシンボルを含む場合は、ステップST407〜ST408を行う。
ステップST406は、ステップST404で計算した値をステップST402で作成した命令中に格納する。ここで命令中での格納位置は、ステップST403で取得した位置である。ステップST407は、リロケーション用命令列生成部106が行う処理であり、命令フィールドのLSB位置と命令フィールドのMSB位置と式を入力としてリロケーション用プログラムコードを生成する。
ステップST408は、現在処理中の式に関してリロケーションテーブル111のエントリを作成する処理である。ステップST408では、オブジェクトファイル107中でリロケーション処理が必要な箇所に対応するリロケーションプログラム112の位置をリロケーションテーブル111のエントリに格納する。
ステップST409は、現在処理中の命令を含む領域に対応するバッファに命令を格納する処理である。この領域はアセンブラにおける一般的な.textセクションであるが、その他に定義されたセクションであっても良い。
次に、ステップST407の処理手順を説明する前に、ステップST407の入出力を明らかにするために、入力となる抽象構文木のデータ構造と出力となるリロケーションプログラムに含まれる命令体系について順に説明する。
抽象構文木は、式中の演算子をノードとし、式中の数あるいはシンボルをリーフとするツリー構造である。すなわち、抽象構文木においてノードは演算子をラベルとし、リーフは式数あるいはシンボルをラベルとする。例として、式と抽象構文木の対応を図5に示す。文字列表現の式501は、抽象構文木502で表現される。式501中の演算子である+と>>は、抽象構文木502ではノードとして表現され、式中のシンボルfooと数4および2はリーフとして表される。
図6は、リロケーションプログラム112を表現するための命令体系図である。リロケーションプログラム112は、スタックマシンで解釈可能な命令体系を持つ。各々の命令は、一つの一意なオペコードを持ち、互いに区別することが可能である。値格納命令601は、fill命令のみであり、オブジェクトファイル107中のシンボル参照位置に対して、リンク時に計算した値を格納するための命令である。fill命令は、三つのスタックオペランドをとり、スタックの上から順に値を格納すべきMSB位置、LSB位置、格納すべき値を取得する。
スタック操作命令602は、スタックにオペランドを積む命令である。オペランドの種類は、即値とシンボルのいずれかである。即値の場合はpushi命令が対応し、シンボルの場合はpushs命令が対応する。pushi命令は、即値オペランドで与えられる値をスタックに積むための命令である。一方、pushs命令は、シンボルに対応するシンボルテーブルエントリのインデックスを即値オペランドとし、シンボルテーブル110中の当該インデックスのシンボルの値をスタックに積む。ここでシンボルテーブル110は、オブジェクトファイル107に含まれるシンボルの一覧を表す一般的なシンボルテーブルである。
演算命令603は、スタックオペランドに対して演算を行い、演算結果をスタックに積む命令である。各演算命令は、式に現れる演算子に対応している。
図7は、リロケーション用命令列生成部106が行うリロケーションプログラムコード生成処理の手順を表すフローチャートである。
リロケーションプログラムコード生成処理は、式の抽象構文木と式の値を格納すべき場所を特定するためのLSB位置およびMSB位置を入力とし、リロケーション用のプログラムを出力する処理である。ステップST701は、抽象構文木に対応するリロケーションプログラムコードを出力する処理である。次のステップST702とステップST703は、それぞれLSB位置とMSB位置をスタックに積むための命令を出力する。最後にステップST704の処理は、値格納命令であるfill命令を出力する。
図8は、図7のステップST701の抽象構文木プログラム変換処理の処理手順を表すフローチャートである。尚、図8では、抽象構文木を入力とし、帰りがけ順でノードを巡回し命令列を出力する処理手順を再帰手続きで実現している点に注意が必要である。ステップST801は、ルートノードがリーフであればステップST802を実行し、ルートノードがリーフでなければ、ステップST803を含むループAとステップST804を実行する分岐処理である。ステップST802は、リーフの種類に応じてスタック操作命令602から適切な命令を出力する。ステップST803を含むループAは、ルートノードのすべての子ノードに対してステップST803を行うループである。ステップST803は、現在の子ノードを新たなルートノードとして設定して自己再起処理を行う。ステップST804は現在処理中のノードのラベルである演算子に対応する演算命令603を出力する。
リロケーションプログラムコード生成処理の動作例として、図5の抽象構文木502とLSB位置として0、MSB位置として15を入力とした際の図7、図8の処理による出力結果を図9に示す。リロケーションプログラム数値表現901は、記憶媒体に格納されたリロケーションプログラム112の数値表現を表わす。また、リロケーションプログラム文字列表現902は、リロケーションプログラム数値表現901に対応する文字列表現を表わす。図8のフローチャートによる抽象構文木502の巡回は、帰りがけ順でfoo、4、+、2、>>で行われ、対応する命令列としてリロケーションプログラム文字列表現902の命令列が出力される。その後、図8の後半処理によって、LSB位置0とMSB位置15をスタックに格納する命令が出力され、最後に値格納命令fill命令が出力される。
次に、図10を用いてリロケーション用の計算手順と計算結果のビット単位の格納位置をオブジェクトファイル107と関連付ける方式を説明する。図10は、オブジェクトファイル生成部103が生成するオブジェクトファイル107の内部構成図でありそのフォーマットをオブジェクトファイル1001として示す。本実施の形態では、計算手順と計算結果の格納位置をいずれもリロケーションプログラム112としてオブジェクトファイル1001中に格納している。オブジェクトファイルフォーマットは、一般的なELF形式である。オブジェクトファイル1001は、一般的なELFオブジェクトファイルが持つべきシンボルテーブル1004やリロケーションテーブル1002に加えてリロケーションプログラム領域1003を持つ。ELF形式では、リロケーションテーブルは、リロケーションを必要とするオブジェクトファイルの領域毎に存在する。ここでは、リロケーションテーブル1002は、コード領域用のリロケーションテーブルである。リロケーションテーブル1002の各エントリは、コード領域中でリロケーション処理が必要なバイト単位の位置を領域先頭からオフセットをリロケーション位置オフセットとして保持している。
一般のELFファイルでは、リロケーションテーブルエントリは、位置オフセットに加えて、r_infoフィールドに機種依存のリロケーションタイプとシンボルテーブルインデックスを保持するが、本実施の形態では、シンボルテーブルインデックスの代わりにリロケーションプログラム領域1003中のリロケーションプログラムのエントリポイントへのバイトオフセットを保持している。リロケーションプログラム領域1003は、リロケーションテーブル1002と同様、オブジェクトファイル1001中のリロケーションを必要とする領域毎に存在し、コード領域と対応している。この対応は、リロケーションプログラム領域1003の名前.relp.textの末尾がコード領域の名前.textと一致していることによって判別可能である。リロケーションプログラム領域1003中のプログラムにおけるシンボルの参照は、シンボルテーブル1004中のインデックスで表現される。尚、本実施の形態ではELFオブジェクトファイルを用いているが、その他のオブジェクトファイルフォーマットであっても類似の方法で本発明を実施可能である。
以下では、一つ以上のオブジェクトファイルを入力とし、単一の実行可能ファイルを生成するリンカ113の処理手順を図11〜15を用いて説明する。
図11は、リンカ処理を表すフローチャートである。ステップST1101を含むループAは、領域連結部114が、1回の実行で1つのオブジェクトファイルに対して領域連結処理を実行する。ステップ1102を含むループBでは、リロケーションプログラムインタプリタ115が、個々のオブジェクトファイルに関連するリロケーションテーブルを基にリロケーション処理を行う。
図12は、ステップST1101の領域連結処理の手順を示すフローチャートである。領域連結処理は、オブジェクトファイルに含まれるすべてのセクションに対してST1201〜ST1203の処理を行う(ループA)。ステップST1201は、処理中のセクションが出力対象セクション、すなわち実行可能ファイル中に含ませるべきセクションであれば、ステップST1202〜ステップST1203を実行する分岐処理である。通常ここでは、.textセクションや.dataセクションなどが処理される。ステップST1202は、セクションを実行可能ファイルに出力する処理である。尚、セクションを実行ファイル中のどこに含ませるかといった情報や出力すべきセクションの判断基準などは、リンカスクリプトやコマンドラインオプションなどよく知られた方法でリンカ113に与えられるものとする。ステップST1203は、ステップST1202でセクションに割り当てられた開始アドレスを各種テーブルに反映するためのテーブル更新処理である。
図13は、ステップST1203のテーブル更新処理の処理手順を示すフローチャートである。テーブル更新処理は、シンボルテーブル110とリロケーションテーブル111など個々のオブジェクトファイル107に付随する情報を更新するほか、出力可能実行ファイルに含まれるグローバルシンボルの情報を含むグローバルシンボルテーブルを更新する。ステップST1301〜ステップ1303を含むループAは、オブジェクトファイル107からコピーしたシンボルテーブル110のすべてのエントリに対して処理を行うループである。ステップST1301は、セクション開始アドレスをシンボルテーブルエントリの値フィールドに加算する処理である。オブジェクトファイル107中においてシンボルテーブルエントリの値フィールドは処理中のセクション開始位置からのバイトオフセットであるが、ステップST1301で処理中のセクション先頭アドレスを加えることによってシンボルの最終的な値が決定する。
ステップST1302は、処理中のシンボルテーブルエントリがグローバルのシンボルであればステップST1303を実行する分岐処理である。ステップST1303は、現在処理中のシンボルテーブルエントリをグローバルなシンボルテーブルに追加する。ステップST1304を含むループBは、オブジェクトファイル107からコピーしたリロケーションテーブル111のすべてのエントリに対して処理を行うためのループである。ステップST1304は、リロケーションエントリに含まれるリロケーション位置オフセットに対して、統合された領域における現在処理中の領域の先頭までのオフセットを加える。ステップST1304の処理は、現在作成中の実行可能ファイルの中からリロケーション処理が必要な位置を後のリロケーション処理が取得できるようにするための処理である。
図14は、図11におけるステップST1102のリロケーション処理の処理手順を示すフローチャートである。ステップST1401〜ステップST1403を含むループは、1つのオブジェクトファイル107に関連するリロケーションテーブル111に含まれるすべてのリロケーションテーブルエントリに対して処理を行うループである。ステップST1401は、テーブルエントリから位置オフセットを取得する処理である。テーブル更新処理ST1203によって位置オフセットは、統合された領域の先頭からのオフセットに置き換わっている。ステップST1402は、リロケーションテーブルエントリからリロケーションプログラム112の開始位置を取得する処理である。ステップST1403は、ステップST1403は、スタックマシンを模擬することによってリロケーションプログラム112を解釈実行する。
ステップST1403におけるリロケーションプログラム112がpushs命令を含む場合、シンボルテーブル110を参照する。図15は、これを示すためのフローチャートであり、pushs命令解釈実行におけるシンボル値取得手順を示す。ステップST1501は、pushs命令の即値オペランドからシンボルテーブルインデックスを取得する処理である。ステップST1502は、オブジェクトファイル107からコピーしたシンボルテーブルからステップST1501で取得したインデックスを元にエントリを取得する処理である。ステップST1503は、ST1502で取得したシンボルテーブルエントリからシンボルが外部シンボルであるかをチェックし、シンボルが外部シンボルでなければステップST1504を実行し、そうでなければステップST1505を実行する。
ステップST1504は、ステップST1502で取得したエントリが保持するシンボル値をスタックにプッシュする処理である。ステップST1505は、シンボルテーブルエントリから対応する文字列を取得する処理である。ELFファイルでは、シンボルテーブルエントリが文字列テーブルのオフセットを保持しており、文字列テーブル先頭から当該オフセットを加算した位置から0終端の文字列を取得することができる。ステップST1506は、シンボル名がプログラムカウンタとして予約されていないかどうかを判断し、プログラムカウンタであればステップST1507を実行し、そうでなければステップST1508を実行する。
ステップST1507は、プログラムカウンタの値をスタックにプッシュする処理である。プログラムカウンタの値は、ステップST1401で取得した領域先頭からの位置オフセットに領域先頭開始アドレスを加算することによって求める。ステップST1508は、シンボル名をキーとしてグローバルシンボルテーブルをルックアップする処理である。ステップST1509では、ステップST1508の処理が成功していればステップST1510を実行し、そうでなければエラーとする処理である。ステップST1510は、ステップ1508で取得したグローバルシンボルテーブルエントリの値をスタックにプッシュする処理である。
リロケーションプログラム112の実行例として図10のリロケーションプログラムを入力としてステップST1403を実行するときの様子を図16に示す。ステップST1601ではpushs命令によって数値0x100がスタックに積まれる。pushs命令のオペランドはシンボルテーブルインデックスであるので、オペランドの1がそのままスタックに積まれるのではなく、シンボルテーブルの1番目のエントリの値としてここでは0x100がスタックに積まれる。ステップST1602は、pushi命令によって数値0x4が積まれる。ステップST1603でadd命令はスタックトップに存在する2つの値0x4と0x100をポップし、加算した結果の値0x104をスタックに積む。ステップST1604では、pushi命令が数値0x2をスタックに積む。ステップST1605では、shr命令がスタックから2つの値0x2と0x104をポップし、0x104を2ビット右シフトした値0x82をスタックに積む。ステップST1606とステップST1607では、pushi命令によってそれぞれ値0x0と0xFをスタックに積む。最後にステップST1607では、fill命令の解釈実行によってスタックから値0xF、0x0、0x82をポップし、ステップST1401で取得した実行可能ファイルのバイトオフセットから0ビットの位置をLSB、15(0xF)ビットの位置をMSBとして値0x82を格納する。
尚、上記例では、オブジェクトファイル生成部103をアセンブラとしたが、直接オブジェクトファイルを生成するようなコンパイラであっても良い。
以上のように、実施の形態1のコード生成処理装置によれば、ソースプログラムをオブジェクトファイルにコンパイルあるいはアセンブルし、その後、オブジェクトファイルをリンクしてプロセッサが実行可能な機械語プログラムを生成するコード生成処理装置において、オブジェクトファイルの生成時に、リロケーションを行うための計算手順と計算結果を格納すべきビット位置とをオブジェクトファイルと関連付けるオブジェクトファイル関連付け手段と、リンク時に、オブジェクトファイルと関連付けられたリロケーションを行うための計算手順と計算結果を格納すべきビット位置とを読み出し解釈することによってリロケーション処理を行うリロケーション処理手段とを備えたので、命令セットアーキテクチャ毎に固有のリンカを構築する必要がなくなり、また、アセンブリ言語記述において、オペランドに従来より複雑な式を記述することができる。
また、実施の形態1のコード生成処理装置によれば、オブジェクトファイル関連付け手段は、命令中でのビット位置を示す命令情報表に基づいてリロケーション時の計算結果を格納すべきビット位置を決定し、オブジェクトファイルと関連付けるようにしたので、容易にリロケーション時の計算結果を格納すべきビット位置を決定することができる。
また、実施の形態1のコード生成処理装置によれば、オブジェクトファイル関連付け手段は、計算手順と計算結果の格納位置をリロケーションプログラムとしてオブジェクトファイル中に格納するようにしたので、オブジェクトファイルのリンク時にリロケーションに必要な計算方法と計算結果の格納位置を容易に取得することができる。
また、実施の形態1のコード生成処理装置によれば、オブジェクトファイルは記憶媒体に格納されるようにしたので、オブジェクトファイルをリンクするリンカとしてオブジェクトファイル関連付け手段とは独立したものを用いることができる。
また、実施の形態1のコード生成処理プログラムによれば、ソースプログラムをオブジェクトファイルにコンパイルあるいはアセンブルするオブジェクトファイル生成部と、オブジェクトファイルをリンクしてプロセッサが実行可能な機械語プログラムを生成するリンカとをコンピュータ上に実現するコード生成処理プログラムであって、オブジェクトファイルの生成時に、リロケーションを行うための計算手順と計算結果を格納すべきビット位置とをオブジェクトファイルと関連付けるオブジェクトファイル関連付け手段と、リンク時に、オブジェクトファイルと関連付けられたリロケーションを行うための計算手順と計算結果を格納すべきビット位置とを読み出し解釈することによってリロケーション処理を行うリロケーション処理手段としてコンピュータを機能させるようにしたので、リンク処理に影響を及ぼすプロセッサ仕様の変更や異なるプロセッサを対象とする場合でも再構築することなく利用可能とすることのできるコード生成処理装置をコンピュータ上に実現することができる。
101 ソースファイル、102 命令情報表、103 オブジェクトファイル生成部、104 文法解析部、105 機械語生成部、106 リロケーション用命令列生成部、107 オブジェクトファイル、108 命令領域、109 データ領域、110 シンボルテーブル、111 リロケーションテーブル、112 リロケーションプログラム、113 リンカ、114 領域連結部、115 リロケーションプログラムインタプリタ、116 ロードモジュール、117 命令領域、118 データ領域。

Claims (5)

  1. ソースプログラムをオブジェクトファイルにコンパイルあるいはアセンブルし、その後、前記オブジェクトファイルをリンクしてプロセッサが実行可能な機械語プログラムを生成するコード生成処理装置において、
    前記オブジェクトファイルの生成時に、リロケーションを行うための計算手順と計算結果を格納すべきビット位置とを当該オブジェクトファイルと関連付けるオブジェクトファイル関連付け手段と、
    前記リンク時に、前記オブジェクトファイルと関連付けられたリロケーションを行うための計算手順と計算結果を格納すべきビット位置とを読み出し解釈することによってリロケーション処理を行うリロケーション処理手段とを備え
    前記計算手順は、シンボル参照位置のうちの1つに直接または間接的に格納すべき値の計算手順として2つ以上の命令を含む命令列から構成され、前記命令は2つ以上のオペランドを使用し、前記オペランドは定数またはシンボルの値または事前に実行した命令の結果であり、前記命令列のうち少なくとも1つはシンボルの値を使用する命令であり、前記命令列のうち少なくとも2つの命令は演算命令であり、前記演算命令は算術演算命令の集合とビット演算命令の集合とシフト演算命令の集合とに含まれる全てまたは一部の演算命令の集合の中から選択される
    ことを特徴とするコード生成処理装置。
  2. オブジェクトファイル関連付け手段は、命令中でのビット位置を示す命令情報表に基づいてリロケーション時の計算結果を格納すべきビット位置を決定し、オブジェクトファイルと関連付けることを特徴とする請求項1記載のコード生成処理装置。
  3. オブジェクトファイル関連付け手段は、計算手順と計算結果の格納位置をリロケーションプログラムとしてオブジェクトファイル中に格納することを特徴とすることを特徴とする請求項1または請求項2記載のコード生成処理装置。
  4. オブジェクトファイルは記憶媒体に格納されることを特徴とする請求項3記載のコード生成処理装置。
  5. ソースプログラムをオブジェクトファイルにコンパイルあるいはアセンブルするオブジェクトファイル生成部と、前記オブジェクトファイルをリンクしてプロセッサが実行可能な機械語プログラムを生成するリンカとをコンピュータ上に実現するコード生成処理プログラムであって、
    前記オブジェクトファイルの生成時に、リロケーションを行うための計算手順と計算結果を格納すべきビット位置とを当該オブジェクトファイルと関連付けるオブジェクトファイル関連付け手段と、
    前記リンク時に、前記オブジェクトファイルと関連付けられたリロケーションを行うための計算手順と計算結果を格納すべきビット位置とを読み出し解釈することによってリロケーション処理を行うリロケーション処理手段としてコンピュータを機能させ
    前記計算手順は、シンボル参照位置のうちの1つに直接または間接的に格納すべき値の計算手順として2つ以上の命令を含む命令列から構成され、前記命令は2つ以上のオペランドを使用し、前記オペランドは定数またはシンボルの値または事前に実行した命令の結果であり、前記命令列のうち少なくとも1つはシンボルの値を使用する命令であり、前記命令列のうち少なくとも2つの命令は演算命令であり、前記演算命令は算術演算命令の集合とビット演算命令の集合とシフト演算命令の集合とに含まれる全てまたは一部の演算命令の集合の中から選択される
    ことを特徴とするコード生成処理プログラム。
JP2010081822A 2010-03-31 2010-03-31 コード生成処理装置及びコード生成処理プログラム Active JP5448976B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2010081822A JP5448976B2 (ja) 2010-03-31 2010-03-31 コード生成処理装置及びコード生成処理プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010081822A JP5448976B2 (ja) 2010-03-31 2010-03-31 コード生成処理装置及びコード生成処理プログラム

Publications (2)

Publication Number Publication Date
JP2011215759A JP2011215759A (ja) 2011-10-27
JP5448976B2 true JP5448976B2 (ja) 2014-03-19

Family

ID=44945436

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010081822A Active JP5448976B2 (ja) 2010-03-31 2010-03-31 コード生成処理装置及びコード生成処理プログラム

Country Status (1)

Country Link
JP (1) JP5448976B2 (ja)

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01205342A (ja) * 1988-02-12 1989-08-17 Sofuto Uea Ashisuto:Kk 汎用型クロスソフトウエアの開発システム
JPH04145536A (ja) * 1990-10-05 1992-05-19 Pfu Ltd プログラム変換処理システムにおけるアドレス再配置処理方式
CA2158848A1 (en) * 1993-03-23 1994-09-29 Erik L. Eidt Apparatus and method for a relocatable file format
JPH08286927A (ja) * 1995-04-18 1996-11-01 Hitachi Ltd アセンブラ処理方式
JP2000200202A (ja) * 1999-01-07 2000-07-18 Nec Ic Microcomput Syst Ltd アプリケ―ションプログラムのデバッグにおけるリンク処理方法及びそのシステム並びに情報記録媒体

Also Published As

Publication number Publication date
JP2011215759A (ja) 2011-10-27

Similar Documents

Publication Publication Date Title
CN106919434B (zh) 一种代码生成方法及装置
JP4057938B2 (ja) コンパイラ、コンパイル方法、及びプログラム開発ツール
US7313773B1 (en) Method and device for simulator generation based on semantic to behavioral translation
CN108920496B (zh) 一种渲染方法及装置
JP2010504572A (ja) モデル検査で用いられる遷移システムの生成
US20080250231A1 (en) Program code conversion apparatus, program code conversion method and recording medium
Pandey et al. LLVM cookbook
JP2008276735A (ja) プログラムコード変換装置及びプログラムコード変換方法
Nacke et al. Learn LLVM 17: A beginner's guide to learning LLVM compiler tools and core libraries with C++
CN112631604B (zh) 一种前端框架实现方法及装置
JP5448976B2 (ja) コード生成処理装置及びコード生成処理プログラム
US20070169054A1 (en) Process of automatically translating a high level programming language into an extended activity diagram
JP2011170749A (ja) シミュレーション装置及びシミュレーション方法
Bezzubikov et al. Automatic dynamic binary translator generation from instruction set description
CN108369499B (zh) 一种代码虚拟化系统和方法
JP6175306B2 (ja) 制御プログラム分割装置、制御プログラム分割方法及びその記録媒体
Kroustek et al. Advanced preprocessing of binary executable files and its usage in retargetable decompilation
Schlamelcher et al. Extending clang/llvm with custom instructions using tablegen–an experience report
JP2014099108A (ja) 実行時間算出装置、実行時間算出方法、およびプログラム
KR101192438B1 (ko) 자바 프로그램 중간 표현 언어 생성 시스템 및 방법
JP2011090511A (ja) 実行プログラム、コンパイラ、実行プログラム動作修正装置及び実行プログラム動作修正方法
Kraas Towards an extensible modeling and validation framework for SDL-UML
JP2013080406A (ja) コンパイル装置、情報処理システム、コンパイル方法、コンパイルプログラム、記録媒体
Curtis On language-agnostic abstract-syntax trees: student research abstract
CN118860487A (zh) 一种硬件加速指令确定方法、系统、电子设备及存储介质

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20111013

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20130321

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130416

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130528

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20131126

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20131224

R150 Certificate of patent or registration of utility model

Ref document number: 5448976

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250