JP2009258796A - Program development device and program development method - Google Patents
Program development device and program development method Download PDFInfo
- Publication number
- JP2009258796A JP2009258796A JP2008103861A JP2008103861A JP2009258796A JP 2009258796 A JP2009258796 A JP 2009258796A JP 2008103861 A JP2008103861 A JP 2008103861A JP 2008103861 A JP2008103861 A JP 2008103861A JP 2009258796 A JP2009258796 A JP 2009258796A
- Authority
- JP
- Japan
- Prior art keywords
- register
- function
- program
- user
- registers
- 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
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
Description
本発明は、プログラム開発装置及びプログラム開発方法に関し、特に、レジスタの破壊の発生を検出することができるプログラム開発装置及びプログラム開発方法に関する。 The present invention relates to a program development device and a program development method, and more particularly to a program development device and a program development method that can detect the occurrence of register destruction.
従来、プログラミング言語により記述されたプログラムを機械語に変換するために、プログラム開発装置が用いられている。プログラマが、高級プログラミング言語によりプログラムを作成する場合、プログラム中で使用する変数を、マイクロプロセッサの資源であるどのレジスタ及びメモリ領域に割り付けるかは、プログラム開発装置の最適化及び資源割付け手段により決定される。そのため、プログラマは、マイクロプロセッサの資源に関して意識することなく、純粋にアルゴリズムに集中してプログラムを開発することができる。 Conventionally, a program development apparatus is used to convert a program written in a programming language into a machine language. When a programmer creates a program using a high-level programming language, optimization of the program development device and resource allocation means determine which registers and memory areas, which are resources of the microprocessor, are allocated to variables used in the program. The Therefore, the programmer can develop the program purely on the algorithm without being aware of the resources of the microprocessor.
しかしながら、組み込み機器向けのプログラム開発等では、すべての処理を高級プログラミング言語により作成するとは限らず、プログラマが機械語命令に対応するアセンブリ言語を記述しなければならない場合がある。この理由は、コンパイラ自体の高級プログラミング言語から機械語命令への翻訳において、プロセッサ特有の命令を実行するような翻訳ができないためである。更に、マイクロプロセッサに1命令で複数の機能を果たす機械語命令が記述できない。例えば、近年多く見られるマルチメディア対応命令などの高機能な処理を使用したくとも、高級プログラミング言語の文法では命令を使うように記述できない。或いは、たとえ記述できたとしても、コンパイラによっては、効率のいい形での機械語命令に翻訳することが難しい場合があるためである。 However, in program development for embedded devices, etc., not all processes are created in a high-level programming language, and the programmer may have to write an assembly language corresponding to machine language instructions. This is because in the translation from the high-level programming language of the compiler itself to the machine language instruction, it is not possible to translate the processor-specific instruction. Furthermore, machine language instructions that perform a plurality of functions with one instruction cannot be written in the microprocessor. For example, even if you want to use sophisticated functions such as multimedia-compatible instructions that are common in recent years, it is not possible to write instructions using high-level programming language grammars. Or, even if it can be described, depending on the compiler, it may be difficult to translate it into machine language instructions in an efficient form.
従って、このような場合、プログラマは、高級プログラミング言語と機械語と1対1に対応し、細かくレジスタの指定ができるアセンブリ言語とを組み合わせてプログラムを記述する。 Therefore, in such a case, the programmer describes the program by combining a high-level programming language and a machine language in one-to-one correspondence with an assembly language that allows detailed register designation.
このような場合、高級プログラミング言語により記述された原始プログラムは、コンパイラから読み込まれ、アセンブリ言語により記述されたアセンブラソースファイルは、リロケータブルオブジェクト生成手段から読み込まれて、それぞれのリロケータブルオブジェクトファイルを得る。これらのリロケータブルオブジェクトファイルに対し、アブソリュートオブジェクト生成手段を起動することで、1つのアブソリュートオブジェクトファイルを得ることになる。 In such a case, the source program described in the high-level programming language is read from the compiler, and the assembler source file described in the assembly language is read from the relocatable object generating means to obtain each relocatable object file. One absolute object file is obtained by activating absolute object generation means for these relocatable object files.
また、1つのファイルに高級プログラミング言語とアセンブリ言語との記述を混在させたい場合、プログラマは、コンパイラの拡張機能を利用して原始プログラムを作成し、コンパイラから読み込むことによりリロケータブルオブジェクトファイルを得る。コンパイラの拡張機能とは、インラインアセンブリ文、機械命令関数、或いはアセンブリ言語によりC言語の関数と同様の振る舞いをするように記述するアセンブリ言語関数などを利用することができる機能である。 When it is desired to mix descriptions of high-level programming language and assembly language in one file, a programmer creates a source program using an extended function of the compiler and reads it from the compiler to obtain a relocatable object file. The extended function of the compiler is a function that can use an inline assembly statement, a machine instruction function, or an assembly language function described in the assembly language so as to behave like a C language function.
しかし、コンパイラの拡張機能を利用する場合は、プログラマが明示的にレジスタ名を指定して、値の受け渡しを直接記述するようになっている。そのため、プログラマは、プログラムに使用したレジスタの種類及び役割をすべて把握していなければならず、複雑な処理を記述しようとした場合、プログラマにレジスタの種類等を把握させることは、大きな負担となる。また、レジスタ名を指定して値を直接設定するため、ハードウエア仕様又はコンパイラの動作に不慣れなプログラマが使用すると、プログラムの動作不良の原因ともなる。 However, when using an extended function of a compiler, a programmer explicitly specifies a register name and directly describes value passing. Therefore, the programmer must understand all the types and roles of the registers used in the program. When trying to describe complicated processing, it is a heavy burden to let the programmer know the types of registers. . In addition, since a register name is specified and a value is directly set, if a programmer unfamiliar with hardware specifications or compiler operation is used, it may cause a malfunction of the program.
Cコンパイラは、C言語の中に記述されたインラインアセンブリ文中で使用されるレジスタ、或いは、レジスタ擬似変数への代入式など、プログラマが直接レジスタを指定している記述については関知しない。即ち、C言語のプログラム中で使用されるある変数が、インラインアセンブリ文を跨って生存している場合、インラインアセンブリ文中で指定されているレジスタと同一のレジスタがその変数に割り当てられることがあるという問題がある。そのため、プログラマは、コンパイラを実行して生成されるアセンブリコードを目視して、問題となる箇所を発見しなければならず、不正なレジスタの指定の発見はたいへん困難である。 The C compiler is unaware of a description in which a programmer directly designates a register, such as a register used in an inline assembly statement written in C language or an assignment expression to a register pseudo variable. In other words, if a variable used in a C language program exists across inline assembly statements, the same register as that specified in the inline assembly statement may be assigned to the variable. There's a problem. For this reason, the programmer must visually check the assembly code generated by executing the compiler to find the problematic part, and it is very difficult to find an illegal register specification.
そこで、インラインアセンブリ文の使用時におけるチェックをプログラマに課すことのないよう、プログラムの翻訳を行うコンパイル装置が提案されている(例えば、特許文献1参照)。 Therefore, a compiling device that translates a program has been proposed so that a check is not imposed on the programmer when using an inline assembly statement (see, for example, Patent Document 1).
この提案によると、中間プログラムの仮引数の使用部分を全て変数に置き換え、この変数がアセンブリルーチンを跨いで生存しているかを調べる。この変数がアセンブリルーチンを跨いで生存している場合、アセンブリルーチンで指定されているレジスタを全て検出し、アセンブリルーチンで指定されているレジスタ以外のレジスタを変数に割り当てる。 According to this proposal, all used parts of the dummy arguments in the intermediate program are replaced with variables, and it is checked whether these variables are alive across the assembly routines. If this variable is alive across the assembly routine, all registers specified in the assembly routine are detected, and registers other than those specified in the assembly routine are assigned to the variable.
しかし、インラインアセンブリを跨いでいる変数に割り当てられるレジスタが、インラインアセンブリ中で指定されているレジスタとバッティングしていないこともある。そのため、この提案による処理は、無駄な処理となる場合もある。
そこで、本発明は、高級プログラミング言語とアセンブリ言語とが混在するプログラムにおいて、アセンブリ言語の部分を跨いで生存するレジスタとアセンブリ言語の部分において指定されるレジスタとが実際にバッティングする場合のみ検出することができるプログラム開発装置及びプログラム開発方法を提供することを目的とする。 Therefore, the present invention detects only when a register that lives across the assembly language part and a register specified in the assembly language part actually batting in a program in which high-level programming language and assembly language are mixed. An object of the present invention is to provide a program development apparatus and a program development method capable of performing the above.
本発明の一態様によれば、ターゲットプロセッサ上で実行される目的プログラムのための原始プログラム中に、前記ターゲットプロセッサのレジスタを直接指定している1以上の代入文を含むか否かを解析する解析部と、前記原始プログラムがコンパイルされ割り付けられるレジスタの生存区間情報を検出し、検出した前記生存区間情報に基づき前記割り付けられるレジスタが前記1以上の代入文を跨いで生存しているか否かを検出する第1の検出部と、を有することを特徴とするプログラム開発装置を提供することができる。 According to one aspect of the present invention, it is analyzed whether or not a source program for a target program executed on a target processor includes one or more assignment statements that directly specify a register of the target processor. An analysis unit, and detecting a live range information of a register in which the source program is compiled and allocated, and whether the allocated register is alive across the one or more assignment statements based on the detected live range information It is possible to provide a program development device including a first detection unit for detection.
本発明の一態様によれば、ターゲットプロセッサ上で実行される目的プログラムのための原始プログラム中に、前記ターゲットプロセッサのレジスタを直接指定している1以上の代入文を含むか否かを解析し、前記原始プログラムがコンパイルされ割り付けられるレジスタの生存区間情報を検出し、検出した前記生存区間情報に基づき前記割り付けられるレジスタが前記1以上の代入文を跨いで生存しているか否かを検出することを特徴とするプログラム開発方法を提供することができる。 According to one aspect of the present invention, it is analyzed whether or not a source program for a target program executed on a target processor includes one or more assignment statements that directly specify a register of the target processor. Detecting the live range information of a register to which the source program is compiled and allocated, and detecting whether the allocated register is alive across the one or more assignment statements based on the detected live range information A program development method characterized by the above can be provided.
本発明によれば、高級プログラミング言語とアセンブリ言語とが混在するプログラムにおいて、アセンブリ言語の部分を跨いで生存するレジスタとアセンブリ言語の部分において指定されるレジスタとが実際にバッティングする場合のみ検出することができるプログラム開発装置及びプログラム開発方法を実現することができる。 According to the present invention, in a program in which high-level programming language and assembly language are mixed, detection is performed only when a register that survives across the assembly language part and a register specified in the assembly language part actually perform batting. It is possible to realize a program development apparatus and a program development method capable of
以下、図面を参照して本発明の実施の形態を詳細に説明する。
(第1の実施の形態)
まず図1に基づき、本発明の第1の実施の形態に係るプログラム開発装置の構成を説明する。図1は、本発明の第1の実施の形態に係るプログラム開発装置のハードウエアの構成を示す構成図である。
Hereinafter, embodiments of the present invention will be described in detail with reference to the drawings.
(First embodiment)
First, based on FIG. 1, the structure of the program development apparatus which concerns on the 1st Embodiment of this invention is demonstrated. FIG. 1 is a block diagram showing the hardware configuration of the program development apparatus according to the first embodiment of the present invention.
本実施の形態のプログラム開発装置1は、コンピュータ装置であり、本体装置101と、各種処理の実行結果を表示する表示部102と、キーボード103と、マウス104とを含んで構成されている。本体装置101は、中央処理装置(以下、CPUという)105と、記憶装置106とを含んで構成されている。記憶装置106には、C言語及びアセンブリ言語により記述された原始プログラムが記憶されている。ユーザは、各種指示をCPU105に与えるためのキーボード103及びマウス104等の入力部を操作することにより、上述した原始プログラムを入力データとして指定することができる。このようなプログラム開発装置1を用いてプログラムを実行することにより、原始プログラムから後述するオブジェクトファイルを生成することができる。
The
図2は、本実施の形態に係るプログラム開発装置の機能構成を説明するためのブロック図である。プログラム開発装置1は、構文解析部11と、中間コード生成部12と、最適化/資源割付部13と、デバッグ情報生成部14と、アセンブリ命令生成部15と、リロケータブルオブジェクト生成部16と、アブソリュートオブジェクト生成部17とを含んで構成されている。
FIG. 2 is a block diagram for explaining a functional configuration of the program development apparatus according to the present embodiment. The
構文解析部11は、入力される原始プログラム21に対し、字句解析、構文解析及び意味解析を行い、所定のフォーマットにより解析したデータを記憶装置106の一部に格納する。中間コード生成部12は、構文解析部11の解析したデータの結果に基づいて中間コード22を生成する。
The
最適化/資源割付部13は、生成された中間コード22に対し、不要コードの削除、定数の畳み込み、誘導変数最適化等、プログラムのコードサイズ削減及び実行速度向上を目的とした最適化処理を行い、且つ、プログラム実行時に割り付けられるCPU資源を決定する。ユーザは、オプション指定により、コードサイズ削減及び実行速度向上等の最適化項目をプログラム開発装置1に対して指示することができる。
The optimization /
デバッグ情報生成部14は、最適化/資源割付部13により処理された中間コードからデバッグ情報を生成し、生成したデバッグ情報を保持する。デバッグ情報生成部14に保持されるデバック情報には、配置情報、各アセンブリ命令に対し原始プログラム21の行番号を対応付ける行番号情報、原始プログラム21に記述されている関数及び変数の名前及び型などについての情報及び原始プログラム21に記述されている変数が、CPU資源に割り付けられ、最後に参照されるまでの区間を示す生存区間情報等がある。後述するデバッグシステムでは、デバッグ情報生成部14により生成されたデバッグ情報が利用される。
The debug
アセンブリ命令生成部15は、最適化/資源割付部13により処理された中間コードをターゲットプロセッサが実行可能なアセンブリ命令列に変換し、アセンブラソースファイル23を生成する。また、アセンブリ命令生成部15は、デバッグ情報生成部14により生成されたデバッグ情報をアセンブラソースファイル23の対応する箇所にデータ列として出力する。なお、アセンブリ命令生成部15においてアセンブラレベルでの最適化が行われることもあり、最適化が行われた場合には、デバッグ情報の修正も行われる。
The assembly
リロケータブルオブジェクト生成部16は、アセンブリ命令生成部15により生成されたアセンブラソースファイル23からリロケータブルオブジェクトファイル24を生成する。
The relocatable object generation unit 16 generates a
アブソリュートオブジェクト生成部17は、上述した処理により生成された複数のリロケータブルオブジェクトファイル24aを適切にリンクして、シンボル及び変数の配置アドレスの最終決定を行い、アブソリュートオブジェクトファイル25を生成する。アブソリュートオブジェクトファイル25は、ターゲットプロセッサ上において実行が可能な最終的な形式のオブジェクトファイルである。オブジェクトファイルには、ユーザがオプション指定によりデバッグ情報を含ませることが可能であり、デバッグを行う場合には、デバッグ情報を含んだアブソリュートオブジェクトファイル25をデバッグシステムに読み込ませる。以下、構文解析部11からアセンブリ命令生成部15までをコンパイラと呼ぶ。
The absolute
図3は、C言語により記述された原始プログラムの例を示す図である。図4は、図3の原始プログラムをコンパイルして得られるアセンブラソースファイルの例を示す図である。 FIG. 3 is a diagram showing an example of a source program written in C language. FIG. 4 is a diagram showing an example of an assembler source file obtained by compiling the source program of FIG.
図3に示すように、C言語により記述された原始プログラム21には、main関数の中において関数func()が呼び出されている。この原始プログラム21を上述したコンパイラによりコンパイルすることにより、図4に示すアセンブラソースファイル23が得られる。アセンブラソースファイル23では、原始プログラム21に記述されている変数毎にレジスタが割り付けられている。
As shown in FIG. 3, the function func () is called in the main function in the
図4に示す$12は、演算結果を一時的に保持する用途で使用されるレジスタである。$1,$2,$3は、引数に設定された値を引き渡す用途で使用されるレジスタである。$8は、関数func()が呼び出される前後において、値が保証されるレジスタである。以下、値が保証されるレジスタを値保証レジスタと呼ぶ。$0は、関数の値の返却に使用されるレジスタである。 $ 12 shown in FIG. 4 is a register used for the purpose of temporarily holding the calculation result. $ 1, $ 2, and $ 3 are registers that are used to pass the value set in the argument. $ 8 is a register whose value is guaranteed before and after the function func () is called. Hereinafter, a register whose value is guaranteed is called a value guarantee register. $ 0 is a register used to return a function value.
このように、コンパイラが変数に割り付けるレジスタは、コンパイルする時点おいて使用可能なレジスタから順番に選択されるわけではなく、目的により予め規定されているレジスタ使用規約に従ってレジスタの割り付けが行われる。図5は、コンパイラのレジスタ使用規約の例を示す図である。 As described above, the registers to be assigned to the variables by the compiler are not selected in order from the registers that can be used at the time of compiling, and the registers are assigned in accordance with the register usage rules defined in advance by the purpose. FIG. 5 is a diagram illustrating an example of register usage rules of the compiler.
図5に示すレジスタ群31、具体的には$9,$10,$11,$12は、演算の途中結果が一時的に置かれる用途で用いられる。これらのレジスタは、生存区間内に関数が呼び出されるとレジスタの内容は保証されず、値が書き換わる可能性がある。
The
一方、図5に示すレジスタ群32、具体的には$5,$6,$7,$8は、生存区間内に関数が呼び出されてもレジスタの内容が保証される用途で用いられる。これらのレジスタを関数内で使用する場合、その関数の先頭においてこれらのレジスタの値がスタックに退避され、関数の最後においてスタックに退避された値がレジスタに戻されるという動作が決められている。コンパイルを実行する場合、コンパイラは、上述したレジスタ使用規約に従い、自動的に適切なレジスタを選択する。更に、コンパイラは、値保証レジスタがある場合、その値を保護するための退避及び復帰コードを生成する。
On the other hand, the
しかし、インラインアセンブリ文及びアセンブリ言語関数等を使用する場合、コンパイラは、ユーザが直接レジスタを指定している記述については関知しない。そのため、ユーザは、コンパイラのレジスタ使用規約を記憶し、レジスタ使用規約に従いプログラムを記述しなければならない。 However, when using an inline assembly statement, an assembly language function, or the like, the compiler does not know about a description in which a user directly specifies a register. Therefore, the user must memorize the register usage rules of the compiler and write a program according to the register usage rules.
図6は、アセンブリ言語関数を用いて記述されたプログラムの例を示す図である。図6に示すように、アセンブリ言語関数では、データの受け渡しにレジスタ擬似変数を利用する。レジスタ擬似変数とは、矢印C11で示す行のR10である。ユーザは、このレジスタ擬似変数を利用して、ターゲットプロセッサのレジスタを直接指定し、指定したレジスタに値を設定することができる。 FIG. 6 is a diagram illustrating an example of a program described using assembly language functions. As shown in FIG. 6, in the assembly language function, a register pseudo variable is used for data transfer. The register pseudo variable is R10 in the row indicated by the arrow C11. Using this register pseudo variable, the user can directly specify a register of the target processor and set a value in the specified register.
図7は、図6のアセンブリ言語関数を呼び出すC言語により記述された原始プログラムの例を示す図である。図7に示すように、C言語により記述された関数func1内において、上述したアセンブリ言語関数により定義された関数user_func()が矢印C12で示す行において呼び出されている。 FIG. 7 is a diagram showing an example of a source program written in C language that calls the assembly language function of FIG. As shown in FIG. 7, in the function func1 described in the C language, the function user_func () defined by the assembly language function described above is called in the line indicated by the arrow C12.
図8は、図7の原始プログラムをコンパイルして得られるアセンブラソースファイルの例を示す図である。このアセンブラソースファイルは、ユーザが図7の原始プログラムにコンパイルを実行することによって得られるファイルである。このとき、コンパイラは、レジスタ使用規約に従い、原始プログラム中の変数に対し自動的に適切なレジスタを割り付ける。 FIG. 8 is a diagram showing an example of an assembler source file obtained by compiling the source program of FIG. This assembler source file is a file obtained by compiling the source program of FIG. 7 by the user. At this time, the compiler automatically assigns an appropriate register to the variable in the source program in accordance with the register usage rule.
図6に示す関数user_func()では、コンパイラのレジスタ使用規約によると、一時用のレジスタである$9,$10,$11,$12と、関数呼び出しの前後において値保証レジスタである$5,$6とがユーザにより指定されている。そのため、この関数user_func()を呼び出す他の関数が$5及び$6のレジスタを使用する場合、この関数user_func()を呼び出した時点において、$5及び$6のレジスタの内容が破壊されてしまうことになる。即ち、関数user_func()を呼び出すプログラムに対しコンパイルを実行したときに、コンパイラがある変数に$5又は$6のレジスタを割り付けた場合、呼び出された関数user_func()内では、$5及び$6のスタックへの退避が行われていないため、ユーザが指定したレジスタの使用により、$5及び$6のレジスタの内容が破壊されてしまうことになる。$5及び$6は、関数呼び出し前後において値保証レジスタのため、$5又は$6が、関数user_func()を跨いで生存している場合、プログラムの動作不良が発生する。 In the function user_func () shown in FIG. 6, according to the register usage rules of the compiler, the temporary registers $ 9, $ 10, $ 11, $ 12 and the value guarantee registers $ 5, $ 6 before and after the function call are changed by the user. It is specified. Therefore, when another function that calls this function user_func () uses the registers $ 5 and $ 6, the contents of the registers $ 5 and $ 6 are destroyed when this function user_func () is called. That is, when compiling for a program that calls the function user_func (), if the compiler allocates a register of $ 5 or $ 6 to a certain variable, within the called function user_func (), $ 5 and $ 6 are placed on the stack. Since the saving is not performed, the contents of the registers of $ 5 and $ 6 are destroyed by using the register specified by the user. Since $ 5 and $ 6 are value guarantee registers before and after the function call, if $ 5 or $ 6 is alive across the function user_func (), a malfunction of the program occurs.
そこで、ユーザがコンパイルを実行すると、プログラム開発装置1は、構文解析部11において原始プログラムを解析し、ユーザが指定したレジスタ擬似変数があるか否かを検出する。レジスタ擬似変数が存在する場合、関数呼び出し解析部により求めた関数呼び出し情報が参照され、呼び出し元の関数が検出される。その後、レジスタ擬似変数が使用されている関数とこの関数の呼び出し元の関数とのそれぞれにおいて使用されている全てのレジスタが検出される。
Therefore, when the user executes compilation, the
このように検出される関数とレジスタの関係を図9に示す。図9は、関数呼び出し情報とレジスタ使用情報の例を示す図である。この図9は、図8に示すプログラムの関数呼び出し構造と使用レジスタとを概念的に示している。図9に示すように、関数main()から関数func1()が呼び出され、関数func1()から関数func2()と関数user_func()とが呼び出されている。関数func1()内では、$1,$2,$3,$5,$6,$8,$9,$12,$15のレジスタが使用され、関数func2()内では、$1,$2,$8,$15のレジスタが使用されている。関数user_func()内では、ユーザが指定したレジスタとコンパイラが割り付けたレジスタとが使用されている。コンパイラが割り付けたレジスタとは、スタックフレームの形成、戻り値の処理等に使用されるレジスタであり、コンパイラが自動的にコードを生成する。関数user_func()においてユーザが指定したレジスタは、$5,$6,$9,$10,$11,$12であり、コンパイラが割り付けたレジスタは、$0,$1,$8,$15である。 FIG. 9 shows the relationship between functions detected in this way and registers. FIG. 9 is a diagram illustrating an example of function call information and register usage information. FIG. 9 conceptually shows the function call structure and the used registers of the program shown in FIG. As shown in FIG. 9, the function func1 () is called from the function main (), and the function func2 () and the function user_func () are called from the function func1 (). In the function func1 (), $ 1, $ 2, $ 3, $ 5, $ 6, $ 8, $ 9, $ 12, $ 15 registers are used, and in the function func2 (), $ 1, $ 2, $ 8, $ 15 registers are used. Yes. In the function user_func (), a register specified by the user and a register allocated by the compiler are used. The register allocated by the compiler is a register used for forming a stack frame, processing a return value, and the like, and the compiler automatically generates a code. The registers specified by the user in the function user_func () are $ 5, $ 6, $ 9, $ 10, $ 11, $ 12, and the registers allocated by the compiler are $ 0, $ 1, $ 8, $ 15.
次に、呼び出し元の関数func1()において使用されている全てのレジスタの生存区間情報を検出する。なお、検出する生存区間情報は、値保証レジスタだけでもよい。このレジスタの生存区間情報は、上述したように、デバッグ情報生成部14により求められる。図10は、呼び出し元の関数のレジスタ生存区間情報の例を示す図である。この例では、$5及び$6のレジスタの生存区間情報のみ示している。図10に示すように、$5のレジスタが関数user_func()を跨いで生存している。そのため、関数user_func()内においてユーザが$5のレジスタを指定している場合、レジスタの内容が破壊されることになる。
Next, the lifetime information of all registers used in the caller function func1 () is detected. Note that the lifetime information to be detected may be only the value guarantee register. The lifetime information of this register is obtained by the
このような場合、プログラム開発装置1は、レジスタ擬似変数が使用されている関数user_func()を跨いで生存しているレジスタが存在することを表示部102を用いてユーザに通知する処理を行う。
In such a case, the
ここで、レジスタ破壊を通知する処理の流れについて説明する。図11は、レジスタ破壊を通知する処理の流れの例を示すフローチャートである。 Here, the flow of processing for notifying register destruction will be described. FIG. 11 is a flowchart illustrating an example of a flow of processing for notifying register destruction.
まず、ユーザが、マウス104等を用いてソースプログラムを指定し、コンパイルを実行すると、関数の先頭から構文解析が行われ(ステップS1)、ソースプログラム中にユーザがレジスタを直接指定している代入文があるか否かが検出される(ステップS2)。具体的には、図6の矢印C11のように、ユーザがレジスタを直接指定し、指定したレジスタに値を設定している記述を検出する。
First, when a user designates a source program using the
ユーザがレジスタを直接指定している代入文がない場合、NOとなり、処理を終了する。ユーザがレジスタを直接指定している代入文がある場合、YESとなり、関数呼び出し解析部により求めた関数呼び出し情報が参照され、呼び出し元の関数が検出される(ステップS3)。 If there is no assignment statement in which the user directly specifies a register, the determination is NO and the process ends. If there is an assignment statement in which the user directly specifies the register, the answer is YES, the function call information obtained by the function call analysis unit is referred to, and the caller function is detected (step S3).
次に、中間コードから呼び出し元の関数のレジスタの生存区間が検出され(ステップS4)、検出された生存区間にユーザがレジスタを直接指定しているか否かが検出される(ステップS5)。呼び出し元の関数のレジスタの生存区間内にユーザがレジスタを直接指定していない場合、NOとなり、処理を終了する。呼び出し元の関数のレジスタの生存区間内にユーザがレジスタを直接指定している場合、YESとなり、レジスタの破壊をユーザに通知する(ステップS6)。 Next, the live range of the register of the caller function is detected from the intermediate code (step S4), and it is detected whether or not the user directly designates a register in the detected live range (step S5). If the user does not directly specify a register within the life of the register of the caller function, the result is NO and the process ends. If the user directly designates a register within the lifetime of the register of the caller function, the determination is YES and the user is notified of the destruction of the register (step S6).
以上の処理の結果、ユーザが直接レジスタを指定している関数を跨いで生存するレジスタが存在する場合、プログラム開発装置1は、その関数を呼び出すことによるレジスタの破壊の発生をユーザに通知するようにした。その結果、ユーザは、ユーザが直接指定したレジスタとそのレジスタを跨いで生存するレジスタとがバッティングしていることを認識することができる。
As a result of the above processing, when there is a register that survives across the function for which the user directly designates the register, the
よって、本実施の形態のプログラム開発装置によれば、高級プログラミング言語とアセンブリ言語とが混在するプログラムにおいて、アセンブリ言語の部分を跨いで生存するレジスタとアセンブリ言語の部分において指定されるレジスタとが実際にバッティングする場合のみ検出することができる。 Therefore, according to the program development apparatus of the present embodiment, in a program in which a high-level programming language and an assembly language are mixed, the registers that live across the assembly language part and the registers specified in the assembly language part are actually It can be detected only when batting.
(第2の実施の形態)
次に、第2の実施の形態について説明する。第1の実施の形態は、ユーザによるレジスタ指定の存在する関数が、ある1つの関数から呼ばれる場合であり、第2の実施の形態は、ユーザによるレジスタ指定の存在する関数が、複数の関数から呼ばれる場合である。
(Second Embodiment)
Next, a second embodiment will be described. The first embodiment is a case where a function in which register designation by the user exists is called from a certain function. In the second embodiment, a function in which register designation by the user exists is obtained from a plurality of functions. This is the case.
本実施の形態のプログラム開発装置の構成は、第1の実施の形態のプログラム開発装置の構成と同様なため説明を省略する。 Since the configuration of the program development apparatus according to the present embodiment is the same as that of the program development apparatus according to the first embodiment, description thereof is omitted.
図12は、C言語により記述された原始プログラムとコンパイルして得られるアセンブラソースファイルの例を示す図である。図12に示すように、func1(),func3(),func4()の3つの関数が、レジスタ擬似変数を含む関数user_func()を呼び出している。 FIG. 12 is a diagram illustrating an example of an assembler source file obtained by compiling with a source program described in the C language. As shown in FIG. 12, three functions of func1 (), func3 (), and func4 () call a function user_func () including a register pseudo variable.
ユーザがコンパイルを実行すると、関数呼び出し解析部により求めた関数呼び出し情報が参照され、レジスタ擬似変数を含む関数とこの関数を呼び出しているすべての関数とが検出される。その後、レジスタ擬似変数を含む関数とこの関数を呼び出しているすべての関数とのそれぞれにおいて使用されているレジスタが検出される。 When the user executes the compilation, the function call information obtained by the function call analysis unit is referred to, and the function including the register pseudo variable and all the functions calling this function are detected. Thereafter, the registers used in each of the function including the register pseudo variable and all the functions calling this function are detected.
このように検出される関数とレジスタの関係を図13に示す。図13は、関数呼び出し情報とレジスタ使用情報の例を示す図である。この例では、関数main()から関数func1(),func3,func4が呼び出されている。また、関数func1()から関数func2()が呼び出されるとともに、関数func1(),func3(),func4()のそれぞれから、レジスタ擬似変数を含む関数user_func()が呼び出されている。図13に示すように、関数user_func()においてユーザが指定したレジスタは、$5,$6,$9,$10,$11,$12である。また、関数user_func()を呼び出している関数func1()において使用されるレジスタは、$1,$2,$3,$5,$6,$8,$9,$12,$15である。同様に、関数func3()において使用されるレジスタは、$1,$2,$3,$6,$8,$12,$13,$15であり、関数func4()において使用されるレジスタは、$1,$2,$3,$11,$12である。 FIG. 13 shows the relationship between functions detected in this way and registers. FIG. 13 is a diagram illustrating an example of function call information and register usage information. In this example, functions func1 (), func3, and func4 are called from the function main (). A function func2 () is called from the function func1 (), and a function user_func () including a register pseudo variable is called from each of the functions func1 (), func3 (), and func4 (). As shown in FIG. 13, the registers specified by the user in the function user_func () are $ 5, $ 6, $ 9, $ 10, $ 11, and $ 12. The registers used in the function func1 () that calls the function user_func () are $ 1, $ 2, $ 3, $ 5, $ 6, $ 8, $ 9, $ 12, and $ 15. Similarly, the registers used in the function func3 () are $ 1, $ 2, $ 3, $ 6, $ 8, $ 12, $ 13, $ 15, and the registers used in the function func4 () are $ 1, $ 2, $ 3, $ 11. , $ 12.
このように検出された関数func1(),func3(),func4()のそれぞれについて、第1の実施の形態にて説明したレジスタの破壊の発生を通知する処理を実行することにより、プログラム開発装置1は、ユーザにレジスタ破壊の発生の通知をすることができる。
By executing the processing for notifying the occurrence of register destruction described in the first embodiment for each of the functions func1 (), func3 () and func4 () detected in this way, a
次に、レジスタの破壊が発生する場合、破壊されるレジスタの退避及び復帰が必要であることをユーザに通知する処理について説明する。ここで、関数func1()では$5のレジスタの生存区間内に関数user_func()が呼び出され、関数func3()では$6のレジスタの生存区間内に関数user_func()が呼び出され、関数func4()では関数user_func()が呼び出される前後において、値保証レジスタが使用されていなかったと仮定する。 Next, a description will be given of a process for notifying the user that when a register is destroyed, it is necessary to save and restore the destroyed register. Here, in the function func1 (), the function user_func () is called in the lifetime of the register of $ 5, in the function func3 (), the function user_func () is called in the lifetime of the register of $ 6, and in the function func4 () Assume that the value guarantee register was not used before and after the function user_func () was called.
この場合、関数user_func()を呼び出しているすべての関数内において、関数user_func()を跨いで生存する値保証レジスタは、$5及び$6のみとなる。関数user_func()では、ユーザが、$5及び$6のレジスタを指定しているため、関数user_func()が呼び出されると、レジスタ破壊による動作不良が発生することになる。 In this case, in all the functions that call the function user_func (), the value guarantee registers that live across the function user_func () are only $ 5 and $ 6. In the function user_func (), since the user specifies the registers of $ 5 and $ 6, when the function user_func () is called, an operation failure due to register destruction occurs.
そこで、$5及び$6について退避及び復帰コードを挿入することになる。この退避及び復帰コードの挿入には、2つの方法が存在する。1つ目は、呼び出される関数の先頭に退避コードを挿入し、最後に復帰コードを挿入する方法である。この場合、関数user_func()の先頭に$5及び$6の退避コードを挿入し、関数user_func()の最後に$5及び$6の復帰コードを挿入する。 Therefore, save and return codes are inserted for $ 5 and $ 6. There are two methods for inserting the save and return codes. The first is a method of inserting a save code at the beginning of the function to be called and inserting a return code at the end. In this case, $ 5 and $ 6 save codes are inserted at the beginning of the function user_func (), and $ 5 and $ 6 return codes are inserted at the end of the function user_func ().
例えば、関数user_func()内において$7及び$8のレジスタが使用されていても、関数func1(),func3(),func4()において$7及び$8のレジスタが使用されていないため、関数user_func()に$7及び$8の退避及び復帰コードは不要となる。そのため、上述した第1の方法によれば、不要な退避及び復帰処理を抑えることができる。 For example, even though the registers $ 7 and $ 8 are used in the function user_func (), the registers $ 7 and $ 8 are not used in the functions func1 (), func3 () and func4 (). $ 7 and $ 8 save and return codes are not required. Therefore, according to the first method described above, unnecessary save and restore processing can be suppressed.
2つ目は、関数の呼び出し元の関数内において、関数を呼び出す直前に退避コードを挿入し、関数の呼び出しが終了した直後に復帰コードを挿入する方法である。この場合、関数func1()において、関数user_func()を呼び出す直前に$5の退避コードを挿入し、関数user_func()の呼び出しが終了した直後に$5の復帰コードを挿入する。同様に、関数func3()において、関数user_func()を呼び出す直前に$6の退避コードを挿入し、関数user_func()の呼び出しが終了した直後に$6の復帰コードを挿入する。関数func4()においては、値保証レジスタが使用されていないため、退避及び復帰コードは不要となる。 The second is a method in which a save code is inserted immediately before calling a function and a return code is inserted immediately after the function call is finished in the function caller function. In this case, in the function func1 (), a saving code of $ 5 is inserted immediately before calling the function user_func (), and a return code of $ 5 is inserted immediately after the calling of the function user_func () is completed. Similarly, in the function func3 (), a saving code of $ 6 is inserted immediately before calling the function user_func (), and a return code of $ 6 is inserted immediately after the calling of the function user_func () is completed. In the function func4 (), since the value guarantee register is not used, the save and return codes are unnecessary.
第1の方法によれば、関数func4()が、関数user_func()を呼び出す場合、関数user_func()内に挿入された$5及び$6の退避及び復帰コードは、不要なコードとなる。しかし、第2の方法によれば、呼び出し元の関数内において必要な退避及び復帰コードのみが挿入されるため、第1の方法に比べ、不要な退避及び復帰処理を抑えることができる。 According to the first method, when the function func4 () calls the function user_func (), the save and return codes of $ 5 and $ 6 inserted in the function user_func () are unnecessary codes. However, according to the second method, since only necessary save and return codes are inserted in the caller function, unnecessary save and restore processing can be suppressed compared to the first method.
ここで、値保証レジスタの退避及び復帰が必要か不要かを通知する処理について説明する。図14は、値保証レジスタの退避及び復帰が必要か不要かを通知する処理の流れの例を示すフローチャートである。ステップS1からS5は、上述した第1の実施の形態と同様であるため説明を省略する。 Here, a process for notifying whether the value guarantee register needs to be saved and restored will be described. FIG. 14 is a flowchart showing an example of the flow of processing for notifying whether saving and restoring of the value guarantee register is necessary or unnecessary. Steps S1 to S5 are the same as those in the first embodiment described above, and thus the description thereof is omitted.
ステップS5において、検出された生存区間にユーザがレジスタを直接指定しているか否かが検出され、呼び出し元の関数のレジスタの生存区間内にユーザがレジスタを直接指定している場合、退避及び復帰が必要であることをユーザに通知する(ステップS11)。ユーザは、レジスタの退避及び復帰処理が必要であることを認識すると、上述した2つの退避及び復帰コードの挿入方法から適当な方法を選択し、退避及び復帰コードの挿入を実行することができる。 In step S5, it is detected whether or not the user directly specifies a register in the detected live range, and if the user directly specifies a register in the live range of the register of the caller function, save and restore Is notified to the user (step S11). When the user recognizes that register saving and restoring processing is necessary, the user can select an appropriate method from the above-described two saving and restoring code insertion methods, and execute the saving and restoring code insertion.
最後に、全ての呼び出し元の関数をチェックしたか検出される(ステップS12)。全ての呼び出し元の関数をチェックしていない場合、NOとなり、ステップS4に戻り、同様の処理が繰り返される。全ての呼び出し元の関数をチェックした場合、YESとなり、処理を終了する。 Finally, it is detected whether all the caller functions have been checked (step S12). If all the caller functions are not checked, the determination is NO, the process returns to step S4, and the same processing is repeated. If all the caller functions have been checked, the determination is YES and the process is terminated.
以上の処理の結果、ユーザが直接レジスタを指定している関数を跨いで生存するレジスタが呼び出し元の関数内に存在する場合、プログラム開発装置1は、その関数を呼び出すことによるレジスタの破壊の発生を防ぐための退避及び復帰のための処理が必要なことをユーザに通知するようにした。その結果、ユーザは、ユーザが直接指定しているレジスタとそのレジスタを跨いで生存するレジスタとがバッティングしていることを認識し、レジスタの破壊を防ぐための退避及び復帰コードを挿入することができる。
As a result of the above processing, when there is a register that exists across the function for which the user directly designates the register in the caller function, the
よって、本実施の形態のプログラム開発装置によれば、高級プログラミング言語とアセンブリ言語とが混在するプログラムにおいて、アセンブリ言語の部分を跨いで生存するレジスタとアセンブリ言語の部分において指定されるレジスタとが実際にバッティングする場合のみ検出することができる。 Therefore, according to the program development apparatus of the present embodiment, in a program in which a high-level programming language and an assembly language are mixed, the registers that live across the assembly language part and the registers specified in the assembly language part are actually It can be detected only when batting.
なお、ユーザが直接レジスタを指定している関数を跨いで生存するレジスタが存在する場合、プログラム開発装置1が、レジスタの破壊を防ぐための退避及び復帰コードを自動的に挿入するようにしてもよい。
Note that when there is a register that survives across the function for which the user directly designates the register, the
(変形例)
なお、第2の実施の形態の変形例として、関数user_func()内において一時用のレジスタに不足があり、止むを得ずスタックメモリに退避させる場合、関数呼び出し前後において使用されていないレジスタを一時用のレジスタとして転用するようにしてもよい。ここでは、関数呼び出し前後において使用されていないレジスタとして、上述した値保証レジスタを一時用のレジスタとして使用する。本変形例のプログラム開発装置の構成は、第2の実施の形態のプログラム開発装置と同様のため説明を省略する。
(Modification)
As a modification of the second embodiment, when there is a shortage of temporary registers in the function user_func (), and unavoidably saving to the stack memory, registers that are not used before and after the function call are temporarily stored. It may be diverted as a register for use. Here, the above-described value guarantee register is used as a temporary register as a register that is not used before and after the function call. The configuration of the program development apparatus according to the present modification is the same as that of the program development apparatus according to the second embodiment, and a description thereof will be omitted.
一時用のレジスタである$9,$10,$11,$12は、その内容が破棄されても構わないレジスタである。しかしながら、一時用として定められているレジスタは、この4本のため、一時用のレジスタを4本以上使用したい場合は、レジスタの内容を退避及び復帰させるコードの記述、即ち、図6の矢印C13で示す行を追加し、4本のレジスタを使い回さなければならない。 The temporary registers $ 9, $ 10, $ 11, $ 12 are registers whose contents may be discarded. However, since these four registers are defined as temporary registers, if four or more temporary registers are to be used, a description of a code for saving and restoring the register contents, that is, an arrow C13 in FIG. You must add the line indicated by and use four registers.
しかし、関数user_func()を呼び出す呼び出し元の関数内において、使用されていない値保証レジスタがある場合、その値保証レジスタを関数user_func()内において一時用のレジスタとして転用することができる。また、呼び出し元の関数内において、値保証レジスタが使用されている場合でも、そのレジスタが関数user_func()を跨いで生存していなければ、同様に、呼び出し元の関数内において使用されている値保証レジスタを呼び出されている関数user_func()内において一時用のレジスタとして転用することができる。 However, if there is an unused value guarantee register in the function of the caller that calls the function user_func (), the value guarantee register can be diverted as a temporary register in the function user_func (). In addition, even if a value guarantee register is used in the caller function, if the register does not survive across the function user_func (), the value used in the caller function is similarly used. The guarantee register can be diverted as a temporary register in the called user_func () function.
図15は、値保証レジスタを一時用のレジスタとして転用する処理の流れの例を示すフローチャートである。ステップS1からS12は、上述した第2の実施の形態と同様であるため説明を省略する。 FIG. 15 is a flowchart illustrating an example of a flow of processing for diverting a value guarantee register as a temporary register. Steps S1 to S12 are the same as those in the above-described second embodiment, and thus description thereof is omitted.
ステップS12において、全ての呼び出し元の関数がチェックされると、ユーザ関数内、即ち、関数user_func()内において不足している一時用のレジスタがないかチェックされる(ステップS21)。不足している一時用のレジスタがない場合、NOとなり、処理を終了する。不足している一時用のレジスタがあり、且つ、呼び出し元の関数で使用されていない値保証レジスタがある場合、YESとなり、その値保証レジスタを一時用のレジスタとして転用することができるという情報をユーザに通知する(ステップS22)。 When all the caller functions are checked in step S12, it is checked whether there are any temporary registers missing in the user function, that is, in the function user_func () (step S21). If there is no insufficient temporary register, NO is returned and the process is terminated. If there is an insufficient temporary register and there is a value guarantee register that is not used in the caller's function, the information is YES and the value guarantee register can be used as a temporary register. The user is notified (step S22).
上述した第2の実施の形態の例では、呼び出し元の関数func1(),func2(),func3()内において、値保証レジスタである$7,$8が使用されていないため、関数user_func()内において、$7,$8を一時用のレジスタとして転用することができる。よって、ユーザは、値保証レジスタを一時用のレジスタとして転用することができることを認識する。その結果、ユーザは、この通知された情報に基づいて、関数user_func()を最適なコードに修正することができる。 In the example of the second embodiment described above, since the value guarantee registers $ 7 and $ 8 are not used in the caller functions func1 (), func2 () and func3 (), the functions user_func () $ 7 and $ 8 can be diverted as temporary registers. Therefore, the user recognizes that the value guarantee register can be diverted as a temporary register. As a result, the user can correct the function user_func () into an optimal code based on the notified information.
このような処理を図6のアセンブリ言語関数のプログラムに適用し、最適なコードに修正したアセンブリ言語関数のプログラムの例を図16に示す。図16は、図6を最適化したアセンブリ言語関数のプログラムの例を示す図である。 FIG. 16 shows an example of an assembly language function program in which such processing is applied to the assembly language function program of FIG. FIG. 16 is a diagram showing an example of an assembly language function program optimized from FIG.
図16では図6に対し、関数user_func()の先頭において、値保証レジスタである$5及び$6の退避コードが追加され、関数user_func()の最後において、値保証レジスタである$5及び$6の復帰コードが追加されている。更に、矢印C14に示す行では、呼び出し元の関数において使用されていない値保証レジスタを一時用のレジスタとして使用している。そのため、図6の矢印C13の行に示す一時用のレジスタの退避及び復帰コードが削減でき、最適なコードの生成を実現できる。 In FIG. 16, a saving code for $ 5 and $ 6 as value guarantee registers is added at the beginning of the function user_func (), and a return code for $ 5 and $ 6 as value guarantee registers at the end of the function user_func (). Has been added. Further, in the line indicated by the arrow C14, a value guarantee register that is not used in the caller function is used as a temporary register. Therefore, the temporary register save and return code indicated by the line indicated by the arrow C13 in FIG. 6 can be reduced, and optimal code generation can be realized.
よって、本変形例のプログラム開発装置によれば、不必要な退避及び復帰コードを削減することができる。 Therefore, according to the program development device of this modification, unnecessary save and return codes can be reduced.
なお、値保証レジスタを一時用のレジスタに転用することができる場合、プログラム開発装置1が、値保証レジスタを一時用のレジスタに転用し、自動的に最適なコードに修正するようにしてもよい。
When the value guarantee register can be diverted to a temporary register, the
さらになお、本変形例を第1の実施の形態に適用してもよい。即ち、図11に示すステップS6の処理を実行後、図15に示すステップS21及びS22の処理を実行する。その結果、本変形例と同様に、不必要な退避及び復帰コードを削減することができる。 Furthermore, this modification may be applied to the first embodiment. That is, after executing the process of step S6 shown in FIG. 11, the processes of steps S21 and S22 shown in FIG. 15 are executed. As a result, unnecessary save and return codes can be reduced as in this modification.
本発明は、上述した実施の形態に限定されるものではなく、本発明の要旨を変えない範囲において、種々の変更、改変等が可能である。 The present invention is not limited to the above-described embodiments, and various changes and modifications can be made without departing from the scope of the present invention.
1 プログラム開発装置、11 構文解析部、12 中間コード生成部、13 最適化/資源割付部、14 デバッグ情報生成部、15 アセンブリ命令生成部、16 リロケータブルオブジェクト生成部、17 アブソリュートオブジェクト生成部、101 本体装置、102 表示部、103 キーボード、104 マウス、105 CPU、106 記憶装置
DESCRIPTION OF
Claims (5)
前記原始プログラムがコンパイルされ割り付けられるレジスタの生存区間情報を検出し、検出した前記生存区間情報に基づき前記割り付けられるレジスタが前記1以上の代入文を跨いで生存しているか否かを検出する第1の検出部と、
を有することを特徴とするプログラム開発装置。 An analysis unit for analyzing whether or not the source program for the target program executed on the target processor includes one or more assignment statements that directly specify the registers of the target processor;
First detection of whether or not the allocated register is alive across the one or more assignment statements based on the detected life interval information. A detector of
A program development apparatus comprising:
前記原始プログラムがコンパイルされ割り付けられるレジスタの生存区間情報を検出し、検出した前記生存区間情報に基づき前記割り付けられるレジスタが前記1以上の代入文を跨いで生存しているか否かを検出すること
を特徴とするプログラム開発方法。 Analyzing whether or not the source program for the target program executed on the target processor includes one or more assignment statements that directly specify the registers of the target processor;
Detecting the lifetime information of a register to which the source program is compiled and allocated, and detecting whether or not the allocated register is alive across the one or more assignment statements based on the detected lifetime information. A featured program development method.
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2008103861A JP2009258796A (en) | 2008-04-11 | 2008-04-11 | Program development device and program development method |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2008103861A JP2009258796A (en) | 2008-04-11 | 2008-04-11 | Program development device and program development method |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2009258796A true JP2009258796A (en) | 2009-11-05 |
Family
ID=41386161
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2008103861A Pending JP2009258796A (en) | 2008-04-11 | 2008-04-11 | Program development device and program development method |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2009258796A (en) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2018047620A1 (en) * | 2016-09-09 | 2018-03-15 | オムロン株式会社 | Executable program creation device, executable program creation method, and executable program creation program |
CN112925566A (en) * | 2019-12-06 | 2021-06-08 | 中科寒武纪科技股份有限公司 | Method and device for establishing virtual register living interval and compiling method and device |
CN114072740A (en) * | 2019-08-08 | 2022-02-18 | 欧姆龙株式会社 | Information processing apparatus, support program, and support system |
US11327758B2 (en) | 2020-07-27 | 2022-05-10 | Fujitsu Limited | Non-transitory computer-readable recording medium, assembly instruction conversion method and information processing apparatus |
-
2008
- 2008-04-11 JP JP2008103861A patent/JP2009258796A/en active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2018047620A1 (en) * | 2016-09-09 | 2018-03-15 | オムロン株式会社 | Executable program creation device, executable program creation method, and executable program creation program |
CN114072740A (en) * | 2019-08-08 | 2022-02-18 | 欧姆龙株式会社 | Information processing apparatus, support program, and support system |
CN112925566A (en) * | 2019-12-06 | 2021-06-08 | 中科寒武纪科技股份有限公司 | Method and device for establishing virtual register living interval and compiling method and device |
US11327758B2 (en) | 2020-07-27 | 2022-05-10 | Fujitsu Limited | Non-transitory computer-readable recording medium, assembly instruction conversion method and information processing apparatus |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102360334B (en) | Dynamic and static combined software security test method | |
US8453128B2 (en) | Method and system for implementing a just-in-time compiler | |
US7478366B2 (en) | Debugger and method for debugging computer programs across multiple programming languages | |
US7725883B1 (en) | Program interpreter | |
JP5893038B2 (en) | Compile-time boundary checking for user-defined types | |
US20230004368A1 (en) | Multi-chip compatible compiling method and device | |
US8806436B2 (en) | Systems and methods for debugging applications using dual code generation | |
US20050015751A1 (en) | Automated program debugging tool | |
US7917899B2 (en) | Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus | |
US20020019973A1 (en) | Compiler and method for compiling easily adaptable to processor specifications | |
CN110825386B (en) | Code compiling method and device and storage medium | |
JP2004164554A (en) | Device and method for executing and monitoring program | |
JP2012038231A (en) | Compile method for optimizing binary code, compiler system therefor, and computer program | |
JP2001022591A (en) | Compiler device, computer-readable recording medium where compiling program is recorded, and compiling method | |
JP6357814B2 (en) | Analysis of incomplete software | |
JP2009258796A (en) | Program development device and program development method | |
JP2008276735A (en) | Program code converter and program code conversion method | |
JP2009169864A (en) | Compile method and compile program | |
JP2008305337A (en) | Program converter, program conversion method, program, storage medium, debugging device, debugging method and program development system | |
JP2010287101A (en) | Software debugging device and method | |
CN115098158A (en) | SDK packaging method and device, computer equipment and storage medium | |
El-Shobaky et al. | Automatic vectorization using dynamic compilation and tree pattern matching technique in Jikes RVM | |
JPH11110256A (en) | Device and method for debugging program, and computer readable recording medium recorded with the method for the same | |
JP2011180814A (en) | Compiler apparatus, compiling method and program | |
JP5910197B2 (en) | Embedded program development apparatus, compilation method, and compiler program |