44 lines
1.5 KiB
OCaml
44 lines
1.5 KiB
OCaml
|
(* Generation of bytecode for .cmo files *)
|
||
|
|
||
|
open Lambda
|
||
|
open Instruct
|
||
|
|
||
|
(* Relocation information *)
|
||
|
|
||
|
type reloc_info =
|
||
|
Reloc_literal of structured_constant (* structured constant *)
|
||
|
| Reloc_getglobal of Ident.t (* reference to a global *)
|
||
|
| Reloc_setglobal of Ident.t (* definition of a global *)
|
||
|
| Reloc_primitive of string (* C primitive number *)
|
||
|
|
||
|
(* Descriptor for compilation units *)
|
||
|
|
||
|
type compilation_unit =
|
||
|
{ mutable cu_pos: int; (* Absolute position in file *)
|
||
|
cu_codesize: int; (* Size of code block *)
|
||
|
cu_reloc: (reloc_info * int) list; (* Relocation information *)
|
||
|
cu_interfaces: (string * int) list } (* Names and CRC of intfs imported *)
|
||
|
|
||
|
(* Format of a .cmo file:
|
||
|
Obj.magic number (Config.cmo_magic_number)
|
||
|
absolute offset of compilation unit descriptor
|
||
|
block of relocatable bytecode
|
||
|
compilation unit descriptor *)
|
||
|
|
||
|
val to_file: out_channel -> string -> int -> instruction list -> unit
|
||
|
(* Arguments:
|
||
|
channel on output file
|
||
|
name of compilation unit implemented
|
||
|
CRC of interface implemented
|
||
|
list of instructions to emit *)
|
||
|
val to_memory: instruction list -> instruction list ->
|
||
|
string * int * (reloc_info * int) list
|
||
|
(* Arguments:
|
||
|
initialization code (terminated by STOP)
|
||
|
function code
|
||
|
Results:
|
||
|
block of relocatable bytecode
|
||
|
size of this block
|
||
|
relocation information *)
|
||
|
|