OSDN Git Service

90th Cygnus<->FSF quick merge
[pf3gnuchains/gcc-fork.git] / gcc / bc-emit.h
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();