Rev 5222 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5222 | serge | 1 | /* subsegs.h -> subsegs.c |
6324 | serge | 2 | Copyright (C) 1987-2015 Free Software Foundation, Inc. |
5222 | serge | 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 3, 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 the Free |
||
18 | Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
||
19 | 02110-1301, USA. */ |
||
20 | |||
21 | /* |
||
22 | * For every sub-segment the user mentions in the ASsembler program, |
||
23 | * we make one struct frchain. Each sub-segment has exactly one struct frchain |
||
24 | * and vice versa. |
||
25 | * |
||
26 | * Struct frchain's are forward chained (in ascending order of sub-segment |
||
27 | * code number). The chain runs through frch_next of each subsegment. |
||
28 | * This makes it hard to find a subsegment's frags |
||
29 | * if programmer uses a lot of them. Most programs only use text0 and |
||
30 | * data0, so they don't suffer. At least this way: |
||
31 | * (1) There are no "arbitrary" restrictions on how many subsegments |
||
32 | * can be programmed; |
||
33 | * (2) Subsegments' frchain-s are (later) chained together in the order in |
||
34 | * which they are emitted for object file viz text then data. |
||
35 | * |
||
36 | * From each struct frchain dangles a chain of struct frags. The frags |
||
37 | * represent code fragments, for that sub-segment, forward chained. |
||
38 | */ |
||
39 | |||
40 | #include "obstack.h" |
||
41 | |||
42 | struct frch_cfi_data; |
||
43 | |||
44 | struct frchain /* control building of a frag chain */ |
||
45 | { /* FRCH = FRagment CHain control */ |
||
46 | struct frag *frch_root; /* 1st struct frag in chain, or NULL */ |
||
47 | struct frag *frch_last; /* last struct frag in chain, or NULL */ |
||
48 | struct frchain *frch_next; /* next in chain of struct frchain-s */ |
||
49 | subsegT frch_subseg; /* subsegment number of this chain */ |
||
50 | fixS *fix_root; /* Root of fixups for this subsegment. */ |
||
51 | fixS *fix_tail; /* Last fixup for this subsegment. */ |
||
52 | struct obstack frch_obstack; /* for objects in this frag chain */ |
||
53 | fragS *frch_frag_now; /* frag_now for this subsegment */ |
||
54 | struct frch_cfi_data *frch_cfi_data; |
||
55 | }; |
||
56 | |||
57 | typedef struct frchain frchainS; |
||
58 | |||
59 | /* Frchain we are assembling into now. That is, the current segment's |
||
60 | frag chain, even if it contains no (complete) frags. */ |
||
61 | extern frchainS *frchain_now; |
||
62 | |||
63 | typedef struct segment_info_struct { |
||
64 | frchainS *frchainP; |
||
65 | unsigned int hadone : 1; |
||
66 | |||
67 | /* This field is set if this is a .bss section which does not really |
||
68 | have any contents. Once upon a time a .bss section did not have |
||
69 | any frags, but that is no longer true. This field prevent the |
||
70 | SEC_HAS_CONTENTS flag from being set for the section even if |
||
71 | there are frags. */ |
||
72 | unsigned int bss : 1; |
||
73 | |||
74 | int user_stuff; |
||
75 | |||
76 | /* Fixups for this segment. This is only valid after the frchains |
||
77 | are run together. */ |
||
78 | fixS *fix_root; |
||
79 | fixS *fix_tail; |
||
80 | |||
81 | symbolS *dot; |
||
82 | |||
83 | struct lineno_list *lineno_list_head; |
||
84 | struct lineno_list *lineno_list_tail; |
||
85 | |||
86 | /* Which BFD section does this gas segment correspond to? */ |
||
87 | asection *bfd_section; |
||
88 | |||
89 | /* NULL, or pointer to the gas symbol that is the section symbol for |
||
90 | this section. sym->bsym and bfd_section->symbol should be the same. */ |
||
91 | symbolS *sym; |
||
92 | |||
6324 | serge | 93 | /* Used by dwarf2dbg.c for this section's line table entries. */ |
94 | void *dwarf2_line_seg; |
||
95 | |||
5222 | serge | 96 | union { |
97 | /* Current size of section holding stabs strings. */ |
||
98 | unsigned long stab_string_size; |
||
99 | /* Initial frag for ELF. */ |
||
100 | char *p; |
||
101 | } |
||
102 | stabu; |
||
103 | |||
104 | #ifdef NEED_LITERAL_POOL |
||
105 | unsigned long literal_pool_size; |
||
106 | #endif |
||
107 | |||
108 | #ifdef TC_SEGMENT_INFO_TYPE |
||
109 | TC_SEGMENT_INFO_TYPE tc_segment_info_data; |
||
110 | #endif |
||
111 | } segment_info_type; |
||
112 | |||
113 | |||
114 | #define seg_info(sec) \ |
||
115 | ((segment_info_type *) bfd_get_section_userdata (stdoutput, sec)) |
||
116 | |||
117 | extern symbolS *section_symbol (segT); |
||
118 | |||
119 | extern void subsegs_print_statistics (FILE *); |