Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5222 | serge | 1 | /* subsegs.h -> subsegs.c |
2 | Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2003, 2005, |
||
3 | 2006, 2007, 2009 Free Software Foundation, Inc. |
||
4 | |||
5 | This file is part of GAS, the GNU Assembler. |
||
6 | |||
7 | GAS is free software; you can redistribute it and/or modify |
||
8 | it under the terms of the GNU General Public License as published by |
||
9 | the Free Software Foundation; either version 3, or (at your option) |
||
10 | any later version. |
||
11 | |||
12 | GAS is distributed in the hope that it will be useful, |
||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
15 | GNU General Public License for more details. |
||
16 | |||
17 | You should have received a copy of the GNU General Public License |
||
18 | along with GAS; see the file COPYING. If not, write to the Free |
||
19 | Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
||
20 | 02110-1301, USA. */ |
||
21 | |||
22 | /* |
||
23 | * For every sub-segment the user mentions in the ASsembler program, |
||
24 | * we make one struct frchain. Each sub-segment has exactly one struct frchain |
||
25 | * and vice versa. |
||
26 | * |
||
27 | * Struct frchain's are forward chained (in ascending order of sub-segment |
||
28 | * code number). The chain runs through frch_next of each subsegment. |
||
29 | * This makes it hard to find a subsegment's frags |
||
30 | * if programmer uses a lot of them. Most programs only use text0 and |
||
31 | * data0, so they don't suffer. At least this way: |
||
32 | * (1) There are no "arbitrary" restrictions on how many subsegments |
||
33 | * can be programmed; |
||
34 | * (2) Subsegments' frchain-s are (later) chained together in the order in |
||
35 | * which they are emitted for object file viz text then data. |
||
36 | * |
||
37 | * From each struct frchain dangles a chain of struct frags. The frags |
||
38 | * represent code fragments, for that sub-segment, forward chained. |
||
39 | */ |
||
40 | |||
41 | #include "obstack.h" |
||
42 | |||
43 | struct frch_cfi_data; |
||
44 | |||
45 | struct frchain /* control building of a frag chain */ |
||
46 | { /* FRCH = FRagment CHain control */ |
||
47 | struct frag *frch_root; /* 1st struct frag in chain, or NULL */ |
||
48 | struct frag *frch_last; /* last struct frag in chain, or NULL */ |
||
49 | struct frchain *frch_next; /* next in chain of struct frchain-s */ |
||
50 | subsegT frch_subseg; /* subsegment number of this chain */ |
||
51 | fixS *fix_root; /* Root of fixups for this subsegment. */ |
||
52 | fixS *fix_tail; /* Last fixup for this subsegment. */ |
||
53 | struct obstack frch_obstack; /* for objects in this frag chain */ |
||
54 | fragS *frch_frag_now; /* frag_now for this subsegment */ |
||
55 | struct frch_cfi_data *frch_cfi_data; |
||
56 | }; |
||
57 | |||
58 | typedef struct frchain frchainS; |
||
59 | |||
60 | /* Frchain we are assembling into now. That is, the current segment's |
||
61 | frag chain, even if it contains no (complete) frags. */ |
||
62 | extern frchainS *frchain_now; |
||
63 | |||
64 | typedef struct segment_info_struct { |
||
65 | frchainS *frchainP; |
||
66 | unsigned int hadone : 1; |
||
67 | |||
68 | /* This field is set if this is a .bss section which does not really |
||
69 | have any contents. Once upon a time a .bss section did not have |
||
70 | any frags, but that is no longer true. This field prevent the |
||
71 | SEC_HAS_CONTENTS flag from being set for the section even if |
||
72 | there are frags. */ |
||
73 | unsigned int bss : 1; |
||
74 | |||
75 | int user_stuff; |
||
76 | |||
77 | /* Fixups for this segment. This is only valid after the frchains |
||
78 | are run together. */ |
||
79 | fixS *fix_root; |
||
80 | fixS *fix_tail; |
||
81 | |||
82 | symbolS *dot; |
||
83 | |||
84 | struct lineno_list *lineno_list_head; |
||
85 | struct lineno_list *lineno_list_tail; |
||
86 | |||
87 | /* Which BFD section does this gas segment correspond to? */ |
||
88 | asection *bfd_section; |
||
89 | |||
90 | /* NULL, or pointer to the gas symbol that is the section symbol for |
||
91 | this section. sym->bsym and bfd_section->symbol should be the same. */ |
||
92 | symbolS *sym; |
||
93 | |||
94 | union { |
||
95 | /* Current size of section holding stabs strings. */ |
||
96 | unsigned long stab_string_size; |
||
97 | /* Initial frag for ELF. */ |
||
98 | char *p; |
||
99 | } |
||
100 | stabu; |
||
101 | |||
102 | #ifdef NEED_LITERAL_POOL |
||
103 | unsigned long literal_pool_size; |
||
104 | #endif |
||
105 | |||
106 | #ifdef TC_SEGMENT_INFO_TYPE |
||
107 | TC_SEGMENT_INFO_TYPE tc_segment_info_data; |
||
108 | #endif |
||
109 | } segment_info_type; |
||
110 | |||
111 | |||
112 | #define seg_info(sec) \ |
||
113 | ((segment_info_type *) bfd_get_section_userdata (stdoutput, sec)) |
||
114 | |||
115 | extern symbolS *section_symbol (segT); |
||
116 | |||
117 | extern void subsegs_print_statistics (FILE *); |