summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/cc/include/bc-emit.h
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/usr.bin/cc/include/bc-emit.h')
-rw-r--r--gnu/usr.bin/cc/include/bc-emit.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/gnu/usr.bin/cc/include/bc-emit.h b/gnu/usr.bin/cc/include/bc-emit.h
new file mode 100644
index 0000000..c00da5b
--- /dev/null
+++ b/gnu/usr.bin/cc/include/bc-emit.h
@@ -0,0 +1,133 @@
+/* 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();
OpenPOWER on IntegriCloud