MuckyFoot-UrbanChaos/MuckyBasic/link.h
2017-05-20 11:14:17 +10:00

140 lines
3.7 KiB
C

//
// The linker
//
#ifndef _LINK_
#define _LINK_
// ========================================================
//
// STRUCTURES IN THE OBJECT FILE.
//
// ========================================================
typedef struct
{
UWORD index; // This is the number of the global.
UBYTE export; // TRUE => This global is exported
UBYTE local; // TRUE => This global is local to the file.
SLONG name; // Index into the debug data
} LINK_Global;
typedef struct
{
SLONG name;
SLONG export; // TRUE => this function is exported.
SLONG line_start; // The first and last line of the function body
SLONG line_end;
SLONG num_args; // The number of arguments to the function
} LINK_Function;
typedef struct
{
SLONG instruction; // The first instruction generated for this line of code.
} LINK_Line;
typedef struct
{
SLONG instruction; // Index into instruction memory (SLONG *..) that contains a jump address.
} LINK_Jump;
typedef struct
{
SLONG index; // This is the number of the field.
SLONG name; // Index into the debug data.
} LINK_Field;
typedef struct
{
SLONG instruction; // Index into instruction memory that contains a global index.
} LINK_Globalref;
typedef struct
{
SLONG name; // Index into debug data for the name of the undefined function.
SLONG instruction; // Index into instruction memory that should contain the GOSUB jump to the function.
} LINK_Undefref;
typedef struct
{
SLONG instruction; // Index into the instruction memory for which field.
} LINK_Fieldref;
typedef struct
{
SLONG instruction;
} LINK_Datatableref;
typedef struct
{
SLONG version;
SLONG num_instructions; // Each instruction is a SLONG
SLONG data_table_length_in_bytes;
SLONG num_globals;
SLONG num_functions;
SLONG num_lines;
SLONG num_jumps;
SLONG num_fields;
SLONG num_global_refs;
SLONG num_undef_refs;
SLONG num_field_refs;
SLONG num_data_table_refs;
} LINK_Header;
// ========================================================
//
// THE FORMAT OF THE OBJECT FILE.
//
// ========================================================
//
// LINK_Header lh
//
// SLONG Instructions [lh.num_instructions ] Followed by MAGIC SLONG(12345678)
// CBYTE Data table [lh.data_table_length_in_bytes] Followed by MAGIC SLONG(12345678)
// LINK_Global Globals [lh.num_globals ] Followed by MAGIC SLONG(12345678)
// LINK_Function Functions [lh.num_functions ] Followed by MAGIC SLONG(12345678)
// LINK_Line Lines [lh.num_lines ] Followed by MAGIC SLONG(12345678)
// LINK_Jump Jumps [lh.num_jumps ] Followed by MAGIC SLONG(12345678)
// LINK_Field Fields [lh.num_fields ] Followed by MAGIC SLONG(12345678)
// LINK_Globalref Gobal refs [lh.num_global_refs ] Followed by MAGIC SLONG(12345678)
// LINK_Undefref Undefined function refs[lh.num_undefined_funcion_refs] Followed by MAGIC SLONG(12345678)
// LINK_Fieldref Field refs [lh.num_field_refs ] Followed by MAGIC SLONG(12345678)
// LINK_Datatableref Data table refs [lh.num_data_table_refs ] Followed by MAGIC SLONG(12345678)
//
// SLONG debug_data_length_in_bytes
// CBYTE debug data[debug_data_length_in_bytes]
//
// ========================================================
//
// THE LINKER
//
// ========================================================
//
// Links all the object files into an executable. Returns FALSE on failure.
//
SLONG LINK_do(CBYTE *object_fname[], SLONG num_object_files, CBYTE *exec_fname);
#endif