| /* bc-emit.h - declare entry points for producing object files of bytecodes. */ |
| |
| /* Internal format of symbol table for the object file. */ |
| struct bc_sym |
| { |
| /* Private copy separately malloc'd. */ |
| char *name; |
| |
| /* Symbol has a defined value. */ |
| unsigned int defined:1; |
| |
| /* Symbol has been globalized. */ |
| unsigned int global:1; |
| |
| /* Symbol is common. */ |
| unsigned int common:1; |
| |
| /* Value if defined. */ |
| unsigned long int val; |
| |
| /* Used in internal symbol table structure. */ |
| struct bc_sym *next; |
| }; |
| |
| |
| /* List of symbols defined in a particular segment. */ |
| struct bc_segsym |
| { |
| struct bc_sym *sym; |
| struct bc_segsym *next; |
| }; |
| |
| |
| /* List of relocations needed in a particular segment. */ |
| struct bc_segreloc |
| { |
| /* Offset of datum to be relocated. */ |
| unsigned int offset; |
| |
| /* Symbol to be relocated by. */ |
| struct bc_sym *sym; |
| |
| struct bc_segreloc *next; |
| }; |
| |
| |
| /* Segment of an object file. */ |
| struct bc_seg |
| { |
| /* Size allocated to contents. */ |
| unsigned int alloc; |
| |
| /* Pointer to base of contents. */ |
| char *data; |
| |
| /* Actual size of contents. */ |
| unsigned int size; |
| |
| /* List of symbols defined in this segment. */ |
| struct bc_segsym *syms; |
| |
| /* List of relocations for this segment. */ |
| struct bc_segreloc *relocs; |
| }; |
| |
| |
| /* Anonymous bytecode label within a single function. */ |
| struct bc_label |
| { |
| /* Offset of label from start of segment. */ |
| unsigned int offset; |
| |
| /* True when offset is valid. */ |
| unsigned int defined:1; |
| |
| /* Unique bytecode ID, used to determine innermost |
| block containment */ |
| int uid; |
| |
| /* Next node in list */ |
| struct bc_label *next; |
| }; |
| |
| |
| /* Reference to a bc_label; a list of all such references is kept for |
| the function, then when it is finished they are backpatched to |
| contain the correct values. */ |
| |
| struct bc_labelref |
| { |
| /* Label referenced. */ |
| struct bc_label *label; |
| |
| /* Code offset of reference. */ |
| unsigned int offset; |
| |
| /* Next labelref in list */ |
| struct bc_labelref *next; |
| }; |
| |
| |
| |
| extern void bc_initialize(); |
| extern int bc_begin_function(); |
| extern char *bc_emit_trampoline(); |
| extern void bc_emit_bytecode(); |
| extern void bc_emit_bytecode_const(); |
| extern struct bc_label *bc_get_bytecode_label(); |
| extern int bc_emit_bytecode_labeldef(); |
| extern void bc_emit_bytecode_labelref(); |
| extern void bc_emit_code_labelref(); |
| extern char *bc_end_function(); |
| extern void bc_align_const(); |
| extern void bc_emit_const(); |
| extern void bc_emit_const_skip(); |
| extern int bc_emit_const_labeldef(); |
| extern void bc_emit_const_labelref(); |
| extern void bc_align_data(); |
| extern void bc_emit_data(); |
| extern void bc_emit_data_skip(); |
| extern int bc_emit_data_labeldef(); |
| extern void bc_emit_data_labelref(); |
| extern int bc_define_pointer (); |
| extern int bc_emit_common(); |
| extern void bc_globalize_label(); |
| extern void bc_text(); |
| extern void bc_data(); |
| extern void bc_align(); |
| extern void bc_emit(); |
| extern void bc_emit_skip(); |
| extern int bc_emit_labeldef(); |
| extern void bc_emit_labelref(); |
| extern void bc_write_file(); |