|
|
1.1 root 1: /* frags.h - Header file for the frag concept.
2: Copyright (C) 1987 Free Software Foundation, Inc.
3:
4: This file is part of GAS, the GNU Assembler.
5:
6: GAS is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 1, or (at your option)
9: any later version.
10:
11: GAS is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GAS; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20: #import "relax.h"
21: #import "struc-symbol.h"
22:
23: /*
24: * A code fragment (frag) is some known number of chars, followed by some
25: * unknown number of chars. Typically the unknown number of chars is an
26: * instruction address whose size is yet unknown. We always know the greatest
27: * possible size the unknown number of chars may become, and reserve that
28: * much room at the end of the frag.
29: * Once created, frags do not change address during assembly.
30: * We chain the frags in (a) forward-linked list(s). The object-file address
31: * of the 1st char of a frag is generally not known until after relax().
32: * Many things at assembly time describe an address by {object-file-address
33: * of a particular frag}+offset.
34:
35: BUG: it may be smarter to have a single pointer off to various different
36: notes for different frag kinds. See how code pans out.
37:
38: */
39: struct frag /* a code fragment */
40: {
41: unsigned long fr_address; /* Object file address. */
42: struct frag *fr_next; /* Chain forward; ascending address order. */
43: /* Rooted in frch_root. */
44:
45: long fr_fix; /* (Fixed) number of chars we know we have. */
46: /* May be 0. */
47: long fr_var; /* (Variable) number of chars after above. */
48: /* May be 0. */
49: struct symbol *fr_symbol; /* For variable-length tail. */
50: long fr_offset; /* For variable-length tail. */
51: char *fr_opcode; /* ->opcode low addr byte,for relax()ation*/
52: relax_stateT fr_type; /* What state is my tail in? */
53: relax_substateT fr_subtype; /* Used to index in to md_relax_table for */
54: /* fr_type == rs_machine_dependent frags. */
55: char fr_literal[1]; /* Chars begin here. */
56: /* One day we will compile fr_literal[0]. */
57: };
58: typedef struct frag fragS;
59:
60: /* We want to say fr_literal[0] below */
61: #define SIZEOF_STRUCT_FRAG \
62: ((int)zero_address_frag.fr_literal - (int)&zero_address_frag)
63:
64: /*
65: * frag_now points at the current frag we are building. This frag is incomplete.
66: * It is, however, included in frchain_now. Frag_now->fr_fix is not the total
67: * bytes in use for the frag. For that use:
68: * frag_now->fr_fix + obstack_next_free(&frags) - frag_now->fr_literal.
69: */
70: extern fragS *frag_now;
71:
72: /*
73: * Frags ONLY live in this obstack. We use obstack_next_free() macro
74: * so please don't put any other objects on this stack!
75: */
76: extern struct obstack frags;
77:
78: /* For foreign-segment symbol fixups. */
79: extern fragS zero_address_frag;
80:
81: extern void frag_new(
82: int old_frags_var_max_size);
83: extern char * frag_more(
84: int nchars);
85: extern char *frag_var(
86: relax_stateT type,
87: int max_chars,
88: int var,
89: relax_substateT subtype,
90: symbolS *symbol,
91: long offset,
92: char *opcode);
93: extern void frag_wane(
94: fragS *fragP);
95: extern void frag_align(
96: int alignment,
97: int fill_character);
98:
99: /*
100: * A macro to speed up appending exactly 1 char
101: * to current frag.
102: */
103: /* JF changed < 1 to <= 1 to avoid a race conditon */
104: #define FRAG_APPEND_1_CHAR(datum) \
105: { \
106: if (obstack_room( &frags ) <= 1) {\
107: frag_wane (frag_now); \
108: frag_new (0); \
109: } \
110: obstack_1grow( &frags, datum ); \
111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.