summaryrefslogtreecommitdiff
path: root/gnu/usr.bin/gcc/bc-emit.h
blob: c00da5b35393fa20939d7f6ff0626f8d3c0344d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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();