EP0731409B1 - Method and apparatus for computer code processing in a code translator - Google Patents
Method and apparatus for computer code processing in a code translator Download PDFInfo
- Publication number
- EP0731409B1 EP0731409B1 EP96200921A EP96200921A EP0731409B1 EP 0731409 B1 EP0731409 B1 EP 0731409B1 EP 96200921 A EP96200921 A EP 96200921A EP 96200921 A EP96200921 A EP 96200921A EP 0731409 B1 EP0731409 B1 EP 0731409B1
- Authority
- EP
- European Patent Office
- Prior art keywords
- register
- block
- code
- input
- register set
- 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.)
- Expired - Lifetime
Links
- 238000000034 method Methods 0.000 title claims description 56
- 238000012545 processing Methods 0.000 title claims description 5
- 230000000007 visual effect Effects 0.000 claims 2
- 230000006870 function Effects 0.000 description 15
- 230000008901 benefit Effects 0.000 description 10
- 230000008859 change Effects 0.000 description 8
- 230000008569 process Effects 0.000 description 7
- 238000012360 testing method Methods 0.000 description 6
- 238000010586 diagram Methods 0.000 description 5
- 238000012986 modification Methods 0.000 description 5
- 230000004048 modification Effects 0.000 description 5
- 238000013519 translation Methods 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 4
- 230000001186 cumulative effect Effects 0.000 description 3
- 238000005206 flow analysis Methods 0.000 description 3
- 238000005457 optimization Methods 0.000 description 3
- 238000004458 analytical method Methods 0.000 description 2
- 238000010276 construction Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 238000012856 packing Methods 0.000 description 2
- 101150026173 ARG2 gene Proteins 0.000 description 1
- 101100005166 Hypocrea virens cpa1 gene Proteins 0.000 description 1
- 101100404032 Schizosaccharomyces pombe (strain 972 / ATCC 24843) arg6 gene Proteins 0.000 description 1
- 101100379633 Xenopus laevis arg2-a gene Proteins 0.000 description 1
- 101100379634 Xenopus laevis arg2-b gene Proteins 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 101150088826 arg1 gene Proteins 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000002457 bidirectional effect Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000006073 displacement reaction Methods 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000004877 small RNA loading onto RISC Effects 0.000 description 1
- 238000012549 training Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/52—Binary to binary
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/76—Adapting program code to run in a different environment; Porting
Definitions
- This invention relates to programs for digital computers, and more particularly to code translation for conversion of instruction code which was written for one computer architecture to code for a more advanced architecture.
- Computer architecture is the definition of the basic structure of a computer from the standpoint of what exactly can be performed by code written for this computer. Ordinarily, architecture is defined by such facts as the number of registers in the CPU, their size and content, the logic operations performed by the ALU, shifter, and the like, the addressing modes available, data types supported, memory management functions, etc. Usually, the architectural definition is expressed as an instruction set, and related elaboration.
- CISC processors are characterized by having a large number of instructions in their instruction set, often including memory-to-memory instructions with complex memory accessing modes.
- the instructions are usually of variable length, with simple instructions being only perhaps one byte in length, but the length ranging up to dozens of bytes.
- the VAXTM instruction set is a primary example of CISC and employs instructions having one to two byte opcodes plus from zero to six operand specifiers, where each operand specifier is from one byte to many bytes in length.
- the size of the operand specifier depends upon the addressing mode, size of displacement (byte, word or longword), etc.
- the first byte of the operand specifier describes the addressing mode for that operand, while the opcode defines the number of operands: one, two or three.
- the opcode itself is decoded, however, the total length of the instruction is not yet known to the processor because the operand specifiers have not yet been decoded.
- Another characteristic of processors of the VAX type is the use of byte or byte string memory references, in addition to quadword or longword references; that is, a memory reference may be of a length variable from one byte to multiple words, including unaligned byte references.
- Reduced instruction set or RISC processors are characterized by a smaller number of instructions which are simple to decode, and by requiring that all arithmetic/logic operations be performed register-to-register. Another feature is that of allowing no complex memory accesses; all memory accesses are register load/-store operations, and there are a small number of relatively simple addressing modes, i.e., only a few ways of specifying operand addresses. Instructions are of only one length, and memory accesses are of a standard data width, usually aligned. Instruction execution is of the direct hardwired type, as distinct from microcoding. There is a fixed instruction cycle time, and the instructions are defined to be relatively simple so that they all execute in one short cycle (on average, since pipelining will spread the actual execution over several cycles).
- CISC processors are in writing source code.
- the variety of powerful CISC instructions, memory accessing modes and data types should result in more work being done for each line of code (actually, compilers do not produce code taking full advantage of this).
- whatever gain in compactness of source code for a CISC processor is accomplished at the expense of execution time.
- pipelining of instruction execution has become necessary to achieve performance levels demanded of systems presently, the data or state dependencies of successive instructions, and the vast differences in memory access time vs. machine cycle time, produce excessive stalls and exceptions, slowing execution.
- the advantage of a RISC processor is the speed of execution of code, but the disadvantage is that less is accomplished by each line of code, and the code to accomplish a given task is much more lengthy.
- One line of VAX code can accomplish the same as many lines of RISC code.
- RISC processors taking into account these and other factors, is considered to outweigh the shortcomings, and, were it not for the existing software base, most new processors would probably be designed using RISC feaures.
- software base including operating systems and applications programs, to build up to a high level so that potential and existing users will have the advantages of making use of the product of the best available programming talent, a computer architecture must exhibit a substantial market share for a long period of time. If a new architecture was adopted every time the technology advances allowed it, the software base would never reach a viable level.
- Code translators are thus needed to ease the task of converting code written for one computer architecture to that executable on a more advanced architecture.
- the purpose of a code translator is to take in, as input, computer code written for execution on one type of architecture (e.g., VAX), and/or one operating system (e.g., VMS), and to produce as an output either executable code (object code) or assembly code for the advanced architecture. This is preferably to be done, of course, with a minimum of operator involvement.
- a particular task of a code translator is to detect latent error-producing features of the code, i.e., features that were acceptable in the prior use of the code as it executed on the previous operating system or architecture, but which may produce errors in the new environment.
- the invention is defined according to claim 1 (apparatus) and claim 3 (method).
- a code translator is constructed in a manner similar to a compiler, and may indeed be implemented as part of a compiler.
- the code translator accepts as an input the assembly code or source code which is to be translated, in a manner similar to the front end of any compiler.
- the input code is parsed to determine its content, with the basic building blocks of the code identified (separated) and converted into an intermediate language.
- the intermediate language version of the code is stored in a data structure referred to as a flow graph.
- the flow graph is referenced by flow analyzer techniques and optimization routines, before generating object code for the target machine.
- This translator is particularly adapted for translating VAX assembly language into an advanced RISC architecture.
- a VAX procedure call (e.g., a CALLS instruction) uses the stack to pass arguments, and it has been a coding practice to use the VAX procedure call in ways that result in errors if translated literally.
- the compiler can distinguish up-level stack and return address references from valid local references. In addition, it can inform the user of stack misalignment, which has a severe performance penalty. Finally, it can detect code segments where different flow paths may result in different stack depths at runtime, which may indicate a source code error.
- the compiler For each routine being compiled, the compiler builds a flow graph and visits each basic block in flow order, beginning at the routine entry point. The compiler records the amount of which the stack pointer is changed in each block, and maintains the cumulative offset from the routine entry point. As it processes each instruction in the block, it can use this cumulative offset, along with any stack-based operand specifiers in the instruction (or stack reference implicit in the instruction). to distinguish whether the instruction:
- the compiler/translator detects these occurrences so that user can be advised of the specific usage, and thus the user can make the appropriate changes to the source code.
- Multiple flow paths to the same basic block are also detected; these may result in different cumulative stack depths - the user can be advised of this occurrence, which is sometimes an indication of an error in the original source code, where a value was inadvertently left on the stack.
- Routines in VAX assembly language frequently preserve register values at routine entry points by pushing the values on the stack, and restore them before routine exit. In other instances, register values are pushed and popped around a small range of instructions which are known to destroy them.
- code generated by the compiler for register saves for an advanced 64-bit RISC architecture only the low 32-bits of the 64-bit register can be put on the stack, so that any references to higher stack addresses will continue to work. However, this compiled code will be executing in an environment where many routines use full 64-bit values, so that a 32-bit save/restore operation is not sufficient.
- the compiler tracks register usage to determine which registers are destroyed by a routine, and generate routine prologue and epilogue code which performs 64-bit register saves.
- the compiler can also advise the user of registers which are input registers to the routine, or appear to be output registers.
- register "hints" can aid the user in adding an entry point declaration or documentation for the routine.
- a declaration of routine output registers is required so that the compiler does not restore the original register value after it has been changed; the output register hints may also be useful in identifying these.
- the input register hints may also uncover bugs in which code incorrectly uses uninitialized register values.
- the compiler For each basic block in the routine being compiled, the compiler tracks which registers are read and written by the instructions in the block. At the same time, it accumulates the set of registers written for the entire routine. During a forward flow-order walk through the basic blocks, the compiler computes which registers are written but not subsequently read, to be reported as possible output of registers of the routine. During backward flow-order walks from all exit points of the routine, the compiler computes which registers are read before being written, to be reported as possible input registers.
- routine prologue code When generating code for the routine, the compiler uses the list of registers written to determine which should be saved by routine prologue code. Registers which have been explicitly declared as routine output or scratch registers are removed from the set. Routine epilogue code is generated to perform the register restores.
- condition codes are tracked.
- Many computer architectures such as VAX make use of condition codes (overflow, equal to zero, not equal to zero. etc.) generated by the ALU and internally stored for later reference in a conditional branch, for example.
- condition codes overflow, equal to zero, not equal to zero. etc.
- Nearly all VAX instructions modify these condition code bits which are part of the machine architecture.
- Other instructions test these bits to detect conditions such as overflow or perform conditional branches.
- these bits survive jump-subroutine (JSB) routine invocations, they are sometimes used in assembly language as implicit routine parameters or return status codes (though this is not a recommended coding practice).
- JB jump-subroutine
- the compact builds a flow graph of each routine being compiled. It subsequently walks this graph in reverse flow order from all exit points, through all basic blocks, up through the routine entry point, maintaining a map of which condition codes are "required” for instructions it has processed.
- the compiler records which condition codes its successor requires. It then examines the instructions in the block in reverse order. If the instruction sets any condition codes, it will remove them from the "required” set, and set corresponding bits in the instruction data structure, which direct the code generator to fabricate those condition codes. If the instruction reads any condition codes, it will add them to the ' ⁇ required” set. When all instructions in the block have been read, the compiler will record the set of condition codes still “required” as "input” to this block. This will continue through all predecessors of the current block.
- the compiler checks the basic block corresponding to the routine entry node. If the "input" set is not empty for this node, the user is informed that the routine expects condition codes as input and that a source code change is required.
- VAX assembly language routines rely on the argument list pointer (AP) established by the VAX CALLS/-CALLG instructions to refer to routine parameters.
- AP argument list pointer
- the calling standard dictates that parameters art passed registers, and, if necessary, on top of the stack.
- the code translator resolves this difference without requiring all argument list references to be modified in the source code.
- the argument list references are mapped across the architectures in making the code translation.
- the compiler examines all AP-based memory references in the input code to determine how the same argument reference may be made in the target environment.
- Element 0 of the argument list vector represents the argument count on VAX; in the target RISC architecture, the argument count appears in a defined register, e.g., the Argument Information Register (R25).
- R25 the Argument Information Register
- a memory reference of the form 0(AP) will be compiled to an R25 reference.
- the first six arguments are received in registers R16-R21 on in the target RISC architecture, so that 4(AP) will be compiled to use R16, 8(AP) to use R17, etc.
- the compiler mimics VAX argument lists by packing the quadword register and stack arguments into a longword argument list on the stack.
- This argument list "homing" occurs if the compiler detects any AP uses which may result in aliased references to the argument list, any AP references with variable indices, or any non-longword aligned AP offsets.
- argument list references are compiled into FP (frame pointer) based references to the homed list, which is built by code generated for the routine entry point.
- the compiler When a CALLS (call subroutine) instruction is encountered in the input VAX code, the compiler generates code to copy arguments from the stack, where they have been placed by the original source code, into the RISC argument registers. If there are more than six arguments (requiring more than R16-R21), the seventh and beyond must be copied to consecutive aligned 64-bit slots on top of the stack.
- the argument information register R25 receives the argument count, which, on VAX, would have been at 0(FP). Corresponding code to clean the stack after the called routine returns is also generated.
- the code translator or interpreter 10 resembles a compiler, and includes a portable operating system interface referred to as the shell 11, as well as a front end for converting the code and a back end, with optimizer and code generator, as is the usual practice.
- the shell 11 may be portable in that can be adapted to function with any of several operating systems such as VAX/VMS, Unix, etc., executing on the host computer 12.
- the shell 11 operates under this host operating system 13 executing on a host computing system 12 of various architectures, as seen in Figure 2, typically including a CPU 14 coupled to a main memory 15 by a system bus 16, and coupled to disk storage 17 by an I/O controller 18.
- the shell 11 and other elements are combined with a front end converter 20 to create a translator or "compiler" for converting code in a first language, e.g., VAX/VMS assembly language, into object code for a different target architecture, e.g., and advanced 64-bit RISC architecture.
- a first language e.g., VAX/VMS assembly language
- object code e.g., and advanced 64-bit RISC architecture.
- the front end converter 20 is the only component of the translator 10 which understands the input language being translated (compiled). This input language is that used in the file or files (module or modules) 21 which define the input of the translator.
- the front end converter 20 performs a number of functions. First, it calls the shell 11 to obtain command line information entered by the user (person operating the host computer 12 of Figure 2). Second, the front end 20 calls the shell 11 to control the listing file, write diagnostic messages, and the like, as is usual for compilers. Third, the front end 20 does lexical, syntactic, and semantic analysis to translate the code of the input file 21 to a language-independent internal representation used for the interface between the front end and the back end.
- the front end converter 20 invokes the back end (remaining parts of the translator) to generate object code modules 23 from the information in the internal representation.
- a linker 24 which links the object code modules or images 23 (with runtime library, etc.) to form an executable image to run on the target machine 25.
- the target machine 25 for which the back end 12 of the compiler creates code is a computer (generally of the form of Figure 2) of some specific architecture, i.e., it has a register set of some specific number and data width, the logic executes a specific instruction set, specific addressing modes are available, etc.
- Examples are (1) a RISC type of architecture based upon the 32-bit RISC chip available from MIPs, Inc., as part number R2000 or R3000 and described by Lane in "MIPS R2000 RISC Architecture", Prentice-Hall, 1987, and (2) an advanced RISC architecture with 64-bit registers as described in US patent application Serial No. 547,589, filed June 29, 1990 which corresponds to EP-A-0463973.
- Various other architectures could be likewise accommodated, employing features of the invention.
- the front end convener 20 need not consider the architecture of the target machine 25 upon which the object code 23 will be executed, when the front end 20 is translating from source code to the intemal representation, since the internal representation is independent of the target machine 25 architecture.
- the back end of the translator 10 functions like a compiler to translate the internal representation constructed by the front end 20 into target system object code 23. To this end, the back end performs the basic functions of optimization 26, storage and register allocation 27, and code generation and object file emission 28. The optimization function is performed on the code when it is in its intemal representation.
- the shell 11 receives control.
- the shell 11 invokes the front end convener 20 to compile an input stream from input module 21 into an object file 23; the front end 20 invokes the back end to produce each object module within the object file 23.
- the front end 20 parses the input code 21 and generates an intermediate language version of the program expressed in the input code.
- This intermediate language version is stored in intermediate language tables 30 (including a symbol table), which are updated and rearranged by the stages of the compile functions as will be described.
- the elemental structure of the intermediate language is a tuple.
- This code will be eventually translated into object code for a RISC machine which does only register-to-register arithmetic, and only register-to-memory or memory-to-register stores and loads, so it will appear as LOAD Rn,J; Load memory location J to Register N ADD Rn,#1; Add constant 1 to Register N STORE Rn,I; Store Register N to memory location I
- the code is in a more elemental (and generic) form than even RISC assembly, and would include five tuples, these being number $1, $2, $3, $4 and $5 in Figure 3.
- This way of expressing the code in IL includes a tuple $2 which is a fetch represented by an item 31, with the object of the fetch being a reference to symbol J, shown in tuple $1.
- the next tuple is a literal, item 32, making reference to the constant "1.”
- the next tuple, item 33 is symbol reference to "I", which will be the target of the addition operator.
- the last tuple is an Add, item 34, which makes reference to the source tuples $2 and $3, and to the destination tuple $4.
- the expression may also be expressed as a logic tree as seen in Figure 3, where the tuples are identified by the same reference numerals.
- a tuple (also referred to as an n-tuple), then, is the elemental expression of a computer program, and in the form used in this invention is a data structure 35 which contains at least the elements set forth in Figure 4, including (1) an operator field 36, e.g., Fetch, Store, Add. etc., (2) a locator 37 for defining where in the input module 21 the input-code equivalent to the tuple is located, (3) operand pointers 38 to other tuples, to literal nodes or symbol nodes, such as the pointers to I and #1 tuples $1 and $2 in Figure 3.
- an operator field 36 e.g., Fetch, Store, Add. etc.
- a locator 37 for defining where in the input module 21 the input-code equivalent to the tuple is located
- operand pointers 38 to other tuples to literal nodes or symbol nodes, such as the pointers to I and #1 tuples $1 and $2 in Figure 3.
- a tuple also has attribute fields 39, which may include, for example, Label, Conditional Branch, Argument (for Calls), or SymRef (a symbol in the symbol table).
- the tuple has a number field 40, representing the order of this tuple in the block.
- the front end converter 20 parses the input code 21 to identify tuples and to build an intermediate language tuple stream 41 and associated symbol table 42.
- the next step is performed by a flow analyzer 43 is to scan the tuple stream and identify basic blocks of code, called nodes.
- a block of code is defined to be a sequence of tuples with no entry or exit between the first and last tuple. Usually a block starts with a label or routine entry and ends with a branch to another label.
- a task of the converter 20 and flow analyzer 43 in the front end is to parse the input code 21 and identify the tuples and blocks (nodes), which of course requires the front end to be language specific.
- the tuple data structure 35 contains fields 44 and 45 that say whether or not this tuple is the beginning of a block, or the end of a block.
- a flow graph 46 is generated by the flow analyzer 43 in the front end.
- the flow graph 46 consists of nodes, which are the basic blocks of the program, and edges, which represent the flow between nodes.
- the flow graph is built by processing the tuples 35 (intermediate language) created by the front end converter 20 of the compiler.
- the process of building the flow graph 46 by the flow analyzer 43 includes walking the tuples sequentially for each program section. Referring to an example of code as seen in Figure 6, the flow analyzer 43 adds tuples to the current flow node until one of the following is encountered, thus defining when the previous node ends and a new node begins:
- a branch instruction such as the BEQL of Figure 6 also results in an edge being created, linking the node (Node-1) containing the branch to the node (Node-3) containing the label which is the branch destination (LAB1). If the branch is conditional, as here, an edge to the immediately following node (Node-2) will also be created, since flow may "fall through” to it. Indeed, an edge is a bidirectional link; the flow needs to be traceable in both forward and backward directions.
- the intermediate language used in the code translator of Figure 1 is expressed in the tuple stream 41 and a symbol table 42, along with the flow graph 46.
- the primitive concept is the tuple, and the intermediate language flow graph 46 is made up to link the tuples into node or blocks representing the operations to be executed, each tuple 35 having a data structure as in Figure 4.
- These tuples 35 within nodes are tied together by pointers which represent various relations.
- the most important relations are the operator-operand relation (a pointer 38 from an operator to each of its operands) and the linear ordering represented as a tuple number field 40 on all the tuples in each basic block of the intermediate language flow graph 46; the order of the tuples within a node provides the execution order.
- each tuple 35 has various fields, including the following:
- attributes 39 Some types of tuples have additional fields, known as attributes 39. Instances of attributes in the code translator in an embodiment of Figure 1 include:
- the flow graph 46 is a major component of the intermediate representation, and is constructed and used by the flow analyzer 43, then later traversed by the optimizer 26, the storage allocator 27 and code generator 28.
- the tuples 35 for a particular routine or program (or input module 21) are in the tuple stream 41, linked by pointers 38, 54, 55, and having blocks or nodes defined by fields 48, 49.
- the flow graph 46 identifies the nodes or blocks by pointers to the beginning and ending tuples of the tuple stream. Since routines, labels, etc., will have entries in the symbol table 42, the symbol table is the reference point for tracing the program, i.e., finding the blocks and their ordering.
- the flow graph of the code of Figure 6 may be illustrated as in Figure 7, when it is seen that there are two paths from Node-1. that is, to Node-3 via Node-2 if the conditional branch fails, or directly to Node-3 if the branch is taken.
- a routine such as that of Figure 7 has an entry or node 59 in the symbol table 42 as seen in Figure 5 which includes a pointer 60 to the flow node 61 in the flow graph 46, and this node 61 includes pointers 62 and 63 to the beginning and ending tuples 35 of the tuples stream 41.
- Each flow node 61 also has a number of other fields, e.g., for stack usage, register usage and condition code usage, as will be described.
- the flow for each routine can be walked by the flow analyzer 43 for computing the stack, register, and condition code information of interest for certain features of the invention.
- a pass is made by the flow analyzer 43 through each routine in the module 21 as represented in intermediate language as illustrated in Figure 5.
- the routine node 59 in the symbol table 42 points to the flow node 61 for the entry point of the routine.
- the flow graph 46 is recursively traversed starting at this node; first, the tuples 35 of a node as referenced in the tuple stream 41 will be walked looking for constructs described below. Then, the graph traversal routine is called for each of its successors (nodes 61 linked by a forward edge) which has not already been visited. The recursive walk ends at nodes which have only routine exit nodes as successors.
- the tuples 35 of each node 61 are scanned looking for the following:
- the net change to SP due to the tuples in this node is stored in a field 67 in the flow node.
- the total depth thus far in the routine flow is also computed. This is passed to the node processing routine with each recursive call, and stored in the node in a field 68.
- the flow analyzer 43 makes a second pass through each routine in the module. This time, the walk is in reverse flow order, starting at the routine exit node, and walking backward through all paths back to the routine entry point. This is also a recursive graph walk, using the edges which link each node 61 to its predecessors. This time, nodes 61 may be revisited multiple times.
- the tuples 35 of each node 61 are scanned in reverse order, looking for the following:
- the current "required" set of field 70 is passed, and stored in field 70 of the predecessor node.
- the node is then processed as above. If the node is encountered later in another backward flow path, but the "required" set is a subset of the set previously stored, the node (and its predecessors) does not need to be revisited. However, if the new "required" set contains CCs not previously searched for, the node must be re-processed to insure the CC flag is set on the correct instruction.
- the current node's "input register” set of field 64 (computed in the forward walk) is passed.
- the "input register” set of field 64 for the predecessor is then updated to include those registers in the passed set which are not in its own “written registers” set of field 66.
- the "input register” set for a node will eventually reflect all registers read by this node or any of its successors which are "input” to this point in the flow.
- the node's "written registers" set of field 66 is added to the "written" set for the current routine.
- the information stored in the flow node 61 for the routine entry point is examined. If the "required" CC set of field 70 is not empty, it implies that the corresponding condition codes are expected as input to this routine. This is a VAX architecture specific coding practive, and it therefore flagged as an error, it is undesirable on some architectures and impossible on others. (This may also be indicative of a coding error, rather than an intentional interface.) The particular CCs required as inputs are reported to the user in the printout. If the "input register" set stored in this node at field 64 is not empty, those registers are reported in a compiler "hint" message as possible input registers to the routine. These registers can then be added to the entry point declaration as input registers. (Again, this may also detect a coding error, where an uninitialized register is inadvertently used.)
- the "written" set of field 66 for the routine is used in conjunction with the OUTPUT register declarations for the routine, to determine which registers the compiler must generate code to save.
- the original values of these modified registers may be saved in the source code, using, for example, PUSHL and POPL instructions. However, these instructions will only save the low 32-bits of the register value. Since the code will be executing in a 64-bit environment if code is being generated for the advanced 64-bit RISC architecture, the compiler must generate 64-bit register saves in routine prologue code, and restore them in routine epilogue code. The compiler saves those in the "written set" which are not declared to be OUTPUT (or SCRATCH) registers. (ROA 2)
- Appendix D a listing is given for a different program (not that of Figure 6) showing some of the compiler messages mentioned above. This listing is printed out by the facility ordinarily included in a compiler for producing a source code listing for use in error checking and correction.
- Build_Flow_Graph The procedure referred to as Build_Flow_Graph, illustrated in Figure 10, is called once per compilation, and functions to build all of the routine flow graphs for the entire module being compiled.
- Analyze_Flow_Graph The procedure referred to as Analyze_Flow_Graph, illustrated in Figure 11, is called after Build_Flow_Graph, also once per compilation, and functions to perform the analysis on all the routines in the module.
- Traverse_Graph_Forward illustrated in Figure 12, is called by Analyze_Flow_Graph, and itself calls Process_Forward_Node of Figure 14a, to process the tuples of the current node in forward order, and then calls itself recursively for each successor of the current node which has not already been visited.
- Traverse_Graph_Backward illustrated in Figure 13
- Analyze_Flow_Graph and itself calls Process_Backward_Node of Figure 15, to process the tuples of the current node in reverse order, and then calls itself recursively for each predecessor of the current node, unless it has been visited and the register and condition code information stored in it indicate that a re-visit is not necessary.
- Process_Forward_Node illustrated in Figure 14a-14b, is self-contained and functions to simply walk the tuples in forward order.
- Process_Backward_Node illustrated in Figure 15, is self-contained, and functions to simply walk the tuples in reverse order.
- the decision point 80 examines to see if there are more tuples in this section. If not, the procedure is exited at point 81; if so, then the next tuple is fetched as indicated by the item 82. This next tuple is examined to see if it is a label or entry point tuple, at decision point 83. If so, then the current node is ended at the previous tuple, at item 84, and this tuple is noted as starting a new node, at item 85, after which control returns to the decision point 80 via path 86.
- the selected program section i.e., tuple stream 41
- the decision point 80 examines to see if there are more tuples in this section. If not, the procedure is exited at point 81; if so, then the next tuple is fetched as indicated by the item 82. This next tuple is examined to see if it is a label or entry point tuple, at decision point 83
- the tuple is found not to be a label or entry point, it is examined at point 87 to see if it is an unconditional branch or return tuple. If so, the current node is ended with this tuple, as indicated by item 88, and the next tuple is noted as starting a new node, at item 89. A flow edge is created from the current node - to the branch target node - as indicated by the item 90, after which control returns to the decision point 80 via path 86. If, at decision point 87, the tuple is found to be neither an unconditional branch or a return tuple, then it is examined to see if it is a conditional branch tuple. indicated by decision point 91.
- the procedure Analyze_Flow_Graph begins by getting the head of the routine list for the module being processed as indicated by the item 100. Then, the list is checked to see if there are more routines in the module, at decision point 101. If so, then the procedure Traverse_Graph_Forward is called for the next routine, as indicated by the item 102; the Traverse_Graph_Forward is discussed below with reference to Figure 12. If not, then again the head of the routine list is fetched, at item 103, and again a check is made at decision point 104 of whether there are more routines in the module.
- the Traverse_Graph,Backward procedure is called for the next routine, as indicated by the item 105 of the flow chart, passing empty Required-CCs" and Required-regs".
- the "Output-regs" value returned by Traverse_Graph_Backward is stored as output registers for the routine. If no is the result at decision point 104, then again the head of the routine list for the module is fetched, at item 107, and a test is made to see if there are more routines in the module at point 108.
- control returns to the calling procedure at point 109; if so, the flow node at head of routine is fetched at item 110, and this data is examined at decision points 111, 112 and 113 to see if the "Input-regs". "Output-regs" and Input-CCs" are non-zero. Each of these showing non-zero results in a report hint at items 114, 115 or 116 as indicated. This is done for each flow node at head of each routine, and after the last routine control returns at point 109.
- the Traverse_Graph_Forward routine begins at item 120 by calling the Process_Forward_Node procedure of Figure 14a, for this node. After return from the Process_Forward_Node call, for each node, a check is made at decision point 121 to see if there are any successor nodes. If not, control returns to item 102 of Figure 11 via point 122. If so, information about the successor node is fetched at item 123, and checked to see if it has already been visited at decision point 124.
- the initial stack depth of successor node (isd s ) is compared to a value of the final stack depth of the current node (isd c ); if these are equal then control returns to the item 121 via path 126, but if not the item 127 reports a "run-time stack difference" message, indicating that this code point can be reached with different stack depths.
- the item 128 is entered where the initial stack depth of the successor node (isd s ) is set to the initial stack depth of the current node (isd c ) plus the total stack change in the current node. Then, the Traverse_Graph_Forward procedure is called for the successor node, at item 129. Return from Traverse_Graph_Forward passes control back to the point 121, checking for any successor nodes.
- the Traverse_Graph_Backward procedure illustrated in Figure 13 begins by calling the Process_Backward_Node procedure at item 130, passing "Required-CCs" as a parameter.
- the item 131 is entered; in item 131 the operation is to add registers which are in "Required-regs" (but are not in the "Written-regs” set for the current node) to the "Input-regs" set for the current node.
- decision point 132 a check is made to see if there are any predecessor nodes. If not, the control returns to the call Traverse_Graph_Backward point, with "Output-regs" as a parameter, via point 133.
- FIG. 14a the Process_Forward_Node procedure is illustrated in flow chart form.
- a check is made to see if there are more tuples in the node. If not, control is returned to the calling procedure, item 120 of Figure 12. If so, the next tuple is fetched at item 141, and the next tuple is checked at point 142 to see if it is a register reference. If so, then the tuple is checked at points 143 and 144 to see if it is a read or write reference. If neither a read reference nor a write reference, control returns to point 140 via path 145.
- the tuple is checked at point 146 to see if it is in the "Written-regs" set, and, if so, it is removed from the "Output-regs" set at item 147, but if not then the register is added to the "Input-regs" set at item 148. If the tuple is a write reference, then the register is added to the "Written-regs" set at item 149, and added to the "Output-regs" set at item 150, before returning to point 140 via path 145.
- an "uplevel stack reference" error is reported at item 156, then return via path 154. If not, then the tuple is checked at point 157 to see if it is a stack pointer reference with offset equal to ⁇ ; if so the tuple is checked at point 158 to see if it is a "write” reference, and if a write reference a "return address modification” error is reported at item 159, but if not a write reference then a "return address reference” error is reported at item 160, before returning via path 154 in either case. A negative result from the check at point 157 results in control passing to the check at point 161 where the tuple is examined to see if it is a return-subroutine RSB instruction.
- the tuple is not an RSB instruction, then it is checked at point 166 to see if it is a jump-subroutine JSB instruction, in which case it is checked at point 167 to see if the JSB target is a stack pointer based location, with offset plus current stack offset plus initial stack value equal to ⁇ , in which case a "co-routine call" error is reported at item 168. If none of the tests at points 152, 155, 157, 161, or 166 is positive, the stack is not involved, and control passes back to the point 140 of Figure 14a via path 154.
- the Process_Backward_Node procedure illustrated in Figure 15 begins by checking to see if there are more tuples in the node, at point 170. If not, control returns via point 171. If so, the next tuple is fetched at item 172. Then the next tuple is examined at point 173 to determine if it represents an instruction which sets the condition codes. If so, then the condition codes which this instruction sets are removed from the "Required-CCs" set, as indicated by the item 174. A flag is set (item 175) in the tuple indicating which condition codes which were required must be realized for this instruction.
- control returns via path 181 to the point 170.
- the tuple does not satisfy any of the tests of decision points 173, 176 or 178, control returns via path 181 to see if there are more tuples.
- argument list references are mapped across the architectures in making the code translation in the system of Figure 1.
- VAX assembly language routines rely on the argument list pointer (AP) established by the VAX CALLS/CALLG instructions to refer to routine parameters.
- AP argument list pointer
- This routine rout1 is called by, for example: push1#1 push1#5 calls#2.rout1
- the stack thus has the literal #2 (number of arguments to be passed) at top-of-stack, and literals #1 and #5 in the next two longwords of the stack.
- the code with the two mov1 instructions moves the first two longwords from the stack to R0 and R2.
- a RISC machine has a large number of registers. e.g., thirty-two 64-bit registers, and these are used in passing arguments, instead of memory references to stack as VAX uses.
- the argument information may be designated to be in register-25 (R25), and R16-R21 used for arguments. Then, if there are more than six arguments to be passed, the calling routine leaves the remainder of the arguments on top of the stack.
- the code translator resolves this difference in the way argument lists are passed, without requiring all argument list references to be modified by hand by the user through editing the source code.
- the compiler examines all AP-based memory references in the input code to determine how the same argument reference may be made in the target environment.
- Element 0 of the argument list vector represents the argument count on VAX; in the target RISC architecture, the argument count appears in a defined register. e.g., the Argument Infonnafion Register (R25).
- R25 the Argument Infonnafion Register
- a memory reference of the form 0(AP) will be compiled to an R25 reference.
- the first six arguments are received in registers R16-R21 on in the target RISC architecture, so that 4(AP) will be compiled to use R16, 8(AP) to use R17, etc.
- variable offsets for the arguments in the VAX code, other steps must be taken.
- the compiler mimics VAX argument lists by packing the quadword register and stack arguments into a longword argument list on the stack. This is referred to as argument list "homing", and occurs if the compiler detects any AP uses which may result in aliased references to the argument list, any AP references with variable indices, or any non-longword aligned AP offsets.
- argument list references are compiled into FP (frame pointer) based references to the homed list, which is built by code generated for the routine entry point.
- the storage allocator 27 of the compiler when a CALLS (call subroutine) instruction is encountered in the input VAX code, the storage allocator 27 of the compiler generates code to copy arguments from the stack, where they have been placed by the original source code. into the RISC argument registers if there are more than six arguments (requiring more than R16-R21), the seventh and beyond must be copied to consecutive aligned 64-bit slots on top of the stack.
- the argument information register R25 receives the argument count, which, on VAX would have been at 0(FP). Corresponding code to clean the stack after the called routine returns is also generated.
- a tuple is fetched at item 190, and examined to see if it is a memref at decision point 191. If not, the control returns via path 192. If so, memref is checked to see if the base register is AP at point 193, and if so, checked at point 194 to see if the argument list has been homed; if not then checked at point 195 to see if the offset is ⁇ 28 (meaning the number of longword is less than seven).
- the operation in item 198 is to change the argument pointer AP to a frame pointer FP in the register reference, and add the offset to the homed list in the frame, to the offset.
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Ink Jet (AREA)
- Communication Control (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Description
- reads the return address from the stack
- modifies the return address on the stack
- removes the return address from the stack
- issues a JSB procedure call through the return address to implement a co-routine linkage
- makes an up-level stack reference
- makes an unaligned stack reference
- modifies SP such that it is no longer longword aligned
LOAD Rn,J; Load memory location J to Register N
ADD Rn,#1; Add constant 1 to Register N
STORE Rn,I; Store Register N to memory location I
In intermediate language, however, the code is in a more elemental (and generic) form than even RISC assembly, and would include five tuples, these being number $1, $2, $3, $4 and $5 in Figure 3. This way of expressing the code in IL includes a tuple $2 which is a fetch represented by an
calls#2.rout1
The stack thus has the literal #2 (number of arguments to be passed) at top-of-stack, and
LDQ R16,arg1
LDQ R17,arg2
.
.
.
LDQ R21,arg6
SUBQ SP,#16,SP
STQ R5,8(SP)
STQ R6,0(SP)
JSR R28,R24
MOVL 4(AP)[R0],R1
so that a run-time indexed reference is made, it is necessary to make a different translation. In this case, the compiler mimics VAX argument lists by packing the quadword register and stack arguments into a longword argument list on the stack. This is referred to as argument list "homing", and occurs if the compiler detects any AP uses which may result in aliased references to the argument list, any AP references with variable indices, or any non-longword aligned AP offsets. In this case, argument list references are compiled into FP (frame pointer) based references to the homed list, which is built by code generated for the routine entry point.
Claims (5)
- Apparatus including a processor (14) for processing in a compiler or code translator input computer code (21) written for a first machine architecture to produce object code for a second different machine architecture, said apparatus comprising :means for generating a flow graph (46) in an intermediate language (30) from said input computer code, the flow graph being composed of blocks, and the blocks being composed of intermediate language elements (31-33), where each element (35) represents a single expression in said input computer code, and where each block represents a sequence of one or more elements beginning with an entry expression and ending in a branch expression or a return expression with no intermediate entry; andmeans for tracing in a forward direction (43) through each block of said flow graph to detect references to registers and to create an output-register set;means for recording identity of a register in an input-register set for this block if a reference to such register is a read from the register not yet written to in the current block (148);means for adding identity of a register to the output-register set if a reference to such register is a write to the register (150);means for removing identity of a register from the output-register set if a register reference is a read from the register already written to in the current block (147);means for recording identity of the register in a written-register set for this block if a reference to such register is a write to the register (149);means for passing said output-register set to the succeeding block; andmeans for tracing through each block of said flow graph in a reverse direction (FIG.15), and for each said block passing the input-register set to a predecessor block (137), and in each predecessor block updating the input-register set to include registers in the input-register set passed to this predecessor block by a successor block and not in the written-register set for this predecessor block.
- Apparatus according to claim 1 further including :means for reporting by visual means to a user of said processor the content of said output-register set upon completing said tracing for all of said blocks; andmeans for reporting by visual means to a user of said processor said input-register set and said written-register set upon completing said step of tracing in the reverse direction.
- A method of compiling input computer code (21) written for a first machine architecture to produce object code for a second different machine architecture, said method being executed by a processor (14), comprising the steps of:generating a flow graph (46) in an intermediate language (30) from said input computer code by a converter, the flow graph being composed of blocks, and the blocks being composed of tuples (31-33), where each tuple represents a single expression in said input computer code, and where each block represents a sequence of one or more tuples beginning with an entry expression and ending in a branch expression of a return expression with no intermediate entry; andtracing (43, FIG. 14a, b) through each block of said flow graph in a forward direction to detect reference to registers and to create an output-register register set;if a reference to a register is a read from the register not yet written to in the current block, recording such register in an input-register set for this block (148),if a reference to a register is a write, adding such register to the output-register set (150),if the register referenced is a read from the register already written to in the current block, removing such register from the output-register set (147),if a reference to a register is a write, recording such register in a written-register set for this block (149), andpassing said output-register set to the succeeding block;tracing through each block of said flow graph in a reverse direction (FIG. 15), and for each said block passing the input-register set to a predecessor block (137), and in each predecessor block updating the input-register set to include registers in the input-register set passed to this predecessor block by a successor block and not in the written-register set for this predecessor block; andupon completing said steps of tracing in the forward direction and tracing in the reverse direction for all of said blocks, reporting (115) to a user of said processor by visible means the content of said output-register set for said code.
- A method according to claim 3 wherein said output-register set is recorded in each block.
- A method according to claim 3 wherein said input code contains one or more routines, and the content of said output-register set is reported to the user for each said routine.
Applications Claiming Priority (9)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US07/666,084 US5339238A (en) | 1991-03-07 | 1991-03-07 | Register usage tracking in translating code for different machine architectures by forward and reverse tracing through the program flow graph |
US666085 | 1991-03-07 | ||
US07/666,085 US5307492A (en) | 1991-03-07 | 1991-03-07 | Mapping assembly language argument list references in translating code for different machine architectures |
US666084 | 1991-03-07 | ||
US666082 | 1991-03-07 | ||
US07/666,082 US5598560A (en) | 1991-03-07 | 1991-03-07 | Tracking condition codes in translation code for different machine architectures |
US07/666,083 US5301325A (en) | 1991-03-07 | 1991-03-07 | Use of stack depth to identify architechture and calling standard dependencies in machine code |
US666083 | 1991-03-07 | ||
EP92908065A EP0528019B1 (en) | 1991-03-07 | 1992-03-04 | Method and apparatus for computer code processing in a code translator |
Related Parent Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
EP92908065.3 Division | 1992-03-04 | ||
EP92908065A Division EP0528019B1 (en) | 1991-03-07 | 1992-03-04 | Method and apparatus for computer code processing in a code translator |
Publications (2)
Publication Number | Publication Date |
---|---|
EP0731409A1 EP0731409A1 (en) | 1996-09-11 |
EP0731409B1 true EP0731409B1 (en) | 1998-06-17 |
Family
ID=27505328
Family Applications (4)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
EP96200921A Expired - Lifetime EP0731409B1 (en) | 1991-03-07 | 1992-03-04 | Method and apparatus for computer code processing in a code translator |
EP96200922A Expired - Lifetime EP0731410B1 (en) | 1991-03-07 | 1992-03-04 | Method and processing for computer code processing in a code translator |
EP96200923A Expired - Lifetime EP0735464B1 (en) | 1991-03-07 | 1992-03-04 | Method and apparatus for computer code processing in a code translator |
EP92908065A Expired - Lifetime EP0528019B1 (en) | 1991-03-07 | 1992-03-04 | Method and apparatus for computer code processing in a code translator |
Family Applications After (3)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
EP96200922A Expired - Lifetime EP0731410B1 (en) | 1991-03-07 | 1992-03-04 | Method and processing for computer code processing in a code translator |
EP96200923A Expired - Lifetime EP0735464B1 (en) | 1991-03-07 | 1992-03-04 | Method and apparatus for computer code processing in a code translator |
EP92908065A Expired - Lifetime EP0528019B1 (en) | 1991-03-07 | 1992-03-04 | Method and apparatus for computer code processing in a code translator |
Country Status (7)
Country | Link |
---|---|
EP (4) | EP0731409B1 (en) |
JP (1) | JPH0738159B2 (en) |
AU (1) | AU1560092A (en) |
CA (1) | CA2082067A1 (en) |
DE (4) | DE69226094T2 (en) |
IE (1) | IE920743A1 (en) |
WO (1) | WO1992015939A1 (en) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE69524170T2 (en) * | 1994-09-22 | 2002-05-29 | Sun Microsystems, Inc. | Embedded program flow information for the purpose of target code manipulation |
GB2308470B (en) * | 1995-12-22 | 2000-02-16 | Nokia Mobile Phones Ltd | Program memory scheme for processors |
DE19617842A1 (en) * | 1996-05-03 | 1997-11-13 | Siemens Nixdorf Inf Syst | Code transformation method |
DE19647628C2 (en) * | 1996-11-18 | 2000-03-23 | Siemens Nixdorf Inf Syst | Simulation of a condition code for code transformations |
GB2377288A (en) * | 2001-07-06 | 2003-01-08 | Digital Comm Technologies Ltd | Executing branch instructions of a stack based program on a register based processor |
GB0202728D0 (en) * | 2002-02-06 | 2002-03-27 | Transitive Technologies Ltd | Condition code flag emulation for program code conversion |
GB2401217B (en) * | 2003-05-02 | 2005-11-09 | Transitive Ltd | Improved architecture for generating intermediate representations for program code conversion |
GB0315165D0 (en) * | 2003-05-02 | 2003-08-06 | Transitive Ltd | Improved architecture for generating intermediate representations for program code conversion |
CN110262793A (en) * | 2019-05-20 | 2019-09-20 | 苏州乐鼎电子科技有限公司 | A kind of logical drive method of talking pen system |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0428560A4 (en) * | 1988-07-29 | 1992-04-01 | Hunter Systems Software, Inc. | Machine process for translating programs in binary machine language into another binary machine language |
US5313614A (en) * | 1988-12-06 | 1994-05-17 | At&T Bell Laboratories | Method and apparatus for direct conversion of programs in object code form between different hardware architecture computer systems |
JPH0731617B2 (en) * | 1989-05-19 | 1995-04-10 | 株式会社ピーエフユー | Program runaway detection method |
-
1992
- 1992-03-04 DE DE1992626094 patent/DE69226094T2/en not_active Expired - Fee Related
- 1992-03-04 DE DE1992625982 patent/DE69225982T2/en not_active Expired - Fee Related
- 1992-03-04 DE DE69219420T patent/DE69219420T2/en not_active Expired - Fee Related
- 1992-03-04 JP JP4507579A patent/JPH0738159B2/en not_active Expired - Lifetime
- 1992-03-04 AU AU15600/92A patent/AU1560092A/en not_active Abandoned
- 1992-03-04 EP EP96200921A patent/EP0731409B1/en not_active Expired - Lifetime
- 1992-03-04 DE DE1992626093 patent/DE69226093T2/en not_active Expired - Fee Related
- 1992-03-04 EP EP96200922A patent/EP0731410B1/en not_active Expired - Lifetime
- 1992-03-04 EP EP96200923A patent/EP0735464B1/en not_active Expired - Lifetime
- 1992-03-04 WO PCT/US1992/001841 patent/WO1992015939A1/en active IP Right Grant
- 1992-03-04 EP EP92908065A patent/EP0528019B1/en not_active Expired - Lifetime
- 1992-03-04 CA CA 2082067 patent/CA2082067A1/en not_active Abandoned
- 1992-03-06 IE IE920743A patent/IE920743A1/en not_active Application Discontinuation
Also Published As
Publication number | Publication date |
---|---|
IE920743A1 (en) | 1992-09-09 |
CA2082067A1 (en) | 1992-09-08 |
WO1992015939A1 (en) | 1992-09-17 |
DE69226094D1 (en) | 1998-08-06 |
AU1560092A (en) | 1992-10-06 |
DE69225982T2 (en) | 1999-02-18 |
EP0735464B1 (en) | 1998-07-01 |
EP0735464A1 (en) | 1996-10-02 |
JPH05505273A (en) | 1993-08-05 |
DE69226093T2 (en) | 1999-02-25 |
DE69226093D1 (en) | 1998-08-06 |
DE69225982D1 (en) | 1998-07-23 |
DE69226094T2 (en) | 1999-02-25 |
DE69219420D1 (en) | 1997-06-05 |
DE69219420T2 (en) | 1997-12-11 |
EP0528019B1 (en) | 1997-05-02 |
EP0528019A1 (en) | 1993-02-24 |
JPH0738159B2 (en) | 1995-04-26 |
EP0731409A1 (en) | 1996-09-11 |
EP0731410B1 (en) | 1998-07-01 |
EP0731410A1 (en) | 1996-09-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5598560A (en) | Tracking condition codes in translation code for different machine architectures | |
US5339238A (en) | Register usage tracking in translating code for different machine architectures by forward and reverse tracing through the program flow graph | |
US5307492A (en) | Mapping assembly language argument list references in translating code for different machine architectures | |
US5301325A (en) | Use of stack depth to identify architechture and calling standard dependencies in machine code | |
US5450575A (en) | Use of stack depth to identify machine code mistakes | |
EP0528028B1 (en) | Automatic flowgraph generation for program analysis and translation | |
EP0529059B1 (en) | Branch resolution via backward symbolic execution | |
US5287490A (en) | Identifying plausible variable length machine code of selecting address in numerical sequence, decoding code strings, and following execution transfer paths | |
US5317740A (en) | Alternate and iterative analysis of computer programs for locating translatable code by resolving callbacks and other conflicting mutual dependencies | |
Matz et al. | System v application binary interface | |
US5381547A (en) | Method for dynamically linking definable program elements of an interactive data processing system | |
US6738967B1 (en) | Compiling for multiple virtual machines targeting different processor architectures | |
US8423976B2 (en) | Extreme pipeline and optimized reordering technology | |
US5577253A (en) | Analyzing inductive expressions in a multilanguage optimizing compiler | |
FI102219B (en) | Improved error reporting when translating code execution | |
KR101150003B1 (en) | Software development infrastructure | |
JPH06501583A (en) | How to configure the folding mechanism within a multilingual optimizing compiler | |
Lu et al. | System V application binary interface | |
EP0731409B1 (en) | Method and apparatus for computer code processing in a code translator | |
Markstedter | Blue Fox: Arm Assembly Internals and Reverse Engineering | |
Gough | Multi-language, multi-target compiler development: Evolution of the Gardens Point compiler project | |
Hubicka et al. | System V application binary interface |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PUAI | Public reference made under article 153(3) epc to a published international application that has entered the european phase |
Free format text: ORIGINAL CODE: 0009012 |
|
17P | Request for examination filed |
Effective date: 19960425 |
|
AC | Divisional application: reference to earlier application |
Ref document number: 528019 Country of ref document: EP |
|
AK | Designated contracting states |
Kind code of ref document: A1 Designated state(s): DE FR GB IT |
|
GRAG | Despatch of communication of intention to grant |
Free format text: ORIGINAL CODE: EPIDOS AGRA |
|
17Q | First examination report despatched |
Effective date: 19970912 |
|
GRAG | Despatch of communication of intention to grant |
Free format text: ORIGINAL CODE: EPIDOS AGRA |
|
GRAH | Despatch of communication of intention to grant a patent |
Free format text: ORIGINAL CODE: EPIDOS IGRA |
|
GRAH | Despatch of communication of intention to grant a patent |
Free format text: ORIGINAL CODE: EPIDOS IGRA |
|
GRAA | (expected) grant |
Free format text: ORIGINAL CODE: 0009210 |
|
AC | Divisional application: reference to earlier application |
Ref document number: 528019 Country of ref document: EP |
|
AK | Designated contracting states |
Kind code of ref document: B1 Designated state(s): DE FR GB IT |
|
REF | Corresponds to: |
Ref document number: 69225982 Country of ref document: DE Date of ref document: 19980723 |
|
ITF | It: translation for a ep patent filed | ||
ET | Fr: translation filed | ||
PGFP | Annual fee paid to national office [announced via postgrant information from national office to epo] |
Ref country code: FR Payment date: 19990218 Year of fee payment: 8 |
|
PGFP | Annual fee paid to national office [announced via postgrant information from national office to epo] |
Ref country code: GB Payment date: 19990219 Year of fee payment: 8 Ref country code: DE Payment date: 19990219 Year of fee payment: 8 |
|
PLBE | No opposition filed within time limit |
Free format text: ORIGINAL CODE: 0009261 |
|
STAA | Information on the status of an ep patent application or granted ep patent |
Free format text: STATUS: NO OPPOSITION FILED WITHIN TIME LIMIT |
|
26N | No opposition filed | ||
PG25 | Lapsed in a contracting state [announced via postgrant information from national office to epo] |
Ref country code: GB Free format text: LAPSE BECAUSE OF NON-PAYMENT OF DUE FEES Effective date: 20000304 |
|
REG | Reference to a national code |
Ref country code: GB Ref legal event code: 732E |
|
GBPC | Gb: european patent ceased through non-payment of renewal fee |
Effective date: 20000304 |
|
PG25 | Lapsed in a contracting state [announced via postgrant information from national office to epo] |
Ref country code: FR Free format text: LAPSE BECAUSE OF NON-PAYMENT OF DUE FEES Effective date: 20001130 |
|
REG | Reference to a national code |
Ref country code: FR Ref legal event code: ST |
|
PG25 | Lapsed in a contracting state [announced via postgrant information from national office to epo] |
Ref country code: DE Free format text: LAPSE BECAUSE OF NON-PAYMENT OF DUE FEES Effective date: 20010103 |
|
PG25 | Lapsed in a contracting state [announced via postgrant information from national office to epo] |
Ref country code: IT Free format text: LAPSE BECAUSE OF NON-PAYMENT OF DUE FEES;WARNING: LAPSES OF ITALIAN PATENTS WITH EFFECTIVE DATE BEFORE 2007 MAY HAVE OCCURRED AT ANY TIME BEFORE 2007. THE CORRECT EFFECTIVE DATE MAY BE DIFFERENT FROM THE ONE RECORDED. Effective date: 20050304 |