]>
Commit | Line | Data |
---|---|---|
bebbbdbb JB |
1 | /* bc-emit.h - declare entry points for producing object files of bytecodes. */ |
2 | ||
3 | /* Internal format of symbol table for the object file. */ | |
4 | struct bc_sym | |
5 | { | |
6 | /* Private copy separately malloc'd. */ | |
7 | char *name; | |
8 | ||
9 | /* Symbol has a defined value. */ | |
10 | unsigned int defined:1; | |
11 | ||
12 | /* Symbol has been globalized. */ | |
13 | unsigned int global:1; | |
14 | ||
15 | /* Symbol is common. */ | |
16 | unsigned int common:1; | |
17 | ||
18 | /* Value if defined. */ | |
19 | unsigned long int val; | |
20 | ||
21 | /* Used in internal symbol table structure. */ | |
22 | struct bc_sym *next; | |
23 | }; | |
24 | ||
25 | ||
26 | /* List of symbols defined in a particular segment. */ | |
27 | struct bc_segsym | |
28 | { | |
29 | struct bc_sym *sym; | |
30 | struct bc_segsym *next; | |
31 | }; | |
32 | ||
33 | ||
34 | /* List of relocations needed in a particular segment. */ | |
35 | struct bc_segreloc | |
36 | { | |
37 | /* Offset of datum to be relocated. */ | |
38 | unsigned int offset; | |
39 | ||
40 | /* Symbol to be relocated by. */ | |
41 | struct bc_sym *sym; | |
42 | ||
43 | struct bc_segreloc *next; | |
44 | }; | |
45 | ||
46 | ||
47 | /* Segment of an object file. */ | |
48 | struct bc_seg | |
49 | { | |
50 | /* Size allocated to contents. */ | |
51 | unsigned int alloc; | |
52 | ||
53 | /* Pointer to base of contents. */ | |
54 | char *data; | |
55 | ||
56 | /* Actual size of contents. */ | |
57 | unsigned int size; | |
58 | ||
59 | /* List of symbols defined in this segment. */ | |
60 | struct bc_segsym *syms; | |
61 | ||
62 | /* List of relocations for this segment. */ | |
63 | struct bc_segreloc *relocs; | |
64 | }; | |
65 | ||
66 | ||
67 | /* Anonymous bytecode label within a single function. */ | |
68 | struct bc_label | |
69 | { | |
70 | /* Offset of label from start of segment. */ | |
71 | unsigned int offset; | |
72 | ||
73 | /* True when offset is valid. */ | |
74 | unsigned int defined:1; | |
75 | ||
76 | /* Unique bytecode ID, used to determine innermost | |
77 | block containment */ | |
78 | int uid; | |
79 | ||
80 | /* Next node in list */ | |
81 | struct bc_label *next; | |
82 | }; | |
83 | ||
84 | ||
85 | /* Reference to a bc_label; a list of all such references is kept for | |
86 | the function, then when it is finished they are backpatched to | |
87 | contain the correct values. */ | |
88 | ||
89 | struct bc_labelref | |
90 | { | |
91 | /* Label referenced. */ | |
92 | struct bc_label *label; | |
93 | ||
94 | /* Code offset of reference. */ | |
95 | unsigned int offset; | |
96 | ||
97 | /* Next labelref in list */ | |
98 | struct bc_labelref *next; | |
99 | }; | |
100 | ||
101 | \f | |
102 | ||
103 | extern void bc_initialize(); | |
104 | extern int bc_begin_function(); | |
105 | extern char *bc_emit_trampoline(); | |
106 | extern void bc_emit_bytecode(); | |
107 | extern void bc_emit_bytecode_const(); | |
108 | extern struct bc_label *bc_get_bytecode_label(); | |
109 | extern int bc_emit_bytecode_labeldef(); | |
110 | extern void bc_emit_bytecode_labelref(); | |
111 | extern void bc_emit_code_labelref(); | |
112 | extern char *bc_end_function(); | |
113 | extern void bc_align_const(); | |
114 | extern void bc_emit_const(); | |
115 | extern void bc_emit_const_skip(); | |
116 | extern int bc_emit_const_labeldef(); | |
117 | extern void bc_emit_const_labelref(); | |
118 | extern void bc_align_data(); | |
119 | extern void bc_emit_data(); | |
120 | extern void bc_emit_data_skip(); | |
121 | extern int bc_emit_data_labeldef(); | |
122 | extern void bc_emit_data_labelref(); | |
123 | extern int bc_define_pointer (); | |
124 | extern int bc_emit_common(); | |
125 | extern void bc_globalize_label(); | |
126 | extern void bc_text(); | |
127 | extern void bc_data(); | |
128 | extern void bc_align(); | |
129 | extern void bc_emit(); | |
130 | extern void bc_emit_skip(); | |
131 | extern int bc_emit_labeldef(); | |
132 | extern void bc_emit_labelref(); | |
133 | extern void bc_write_file(); |