Annotation of src/external/gpl3/binutils.old/dist/gas/config/tc-sh.h, Revision 1.1.1.5
1.1 christos 1: /* This file is tc-sh.h
1.1.1.5 ! christos 2: Copyright (C) 1993-2020 Free Software Foundation, Inc.
1.1 christos 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
18: the Free Software Foundation, 51 Franklin Street - Fifth Floor,
19: Boston, MA 02110-1301, USA. */
20:
21: #define TC_SH
22:
23: #define TARGET_ARCH bfd_arch_sh
24:
25: /* The type fixS is defined (to struct fix) in write.h, but write.h uses
26: definitions from this file. To avoid problems with including write.h
27: after the "right" definitions, don't; just forward-declare struct fix
28: here. */
29: struct fix;
30: struct segment_info_struct;
31: struct internal_reloc;
32:
33: /* Whether -relax was used. */
34: extern int sh_relax;
35:
36: /* Whether -small was used. */
37: extern int sh_small;
38:
39: /* Don't try to break words. */
40: #define WORKING_DOT_WORD
41:
42: /* We require .long, et. al., to be aligned correctly. */
43: #define md_cons_align(nbytes) sh_cons_align (nbytes)
44: extern void sh_cons_align (int);
45:
46: /* We need to optimize expr with taking account of rs_align_test
47: frags. */
48:
49: #ifdef OBJ_ELF
50: #define md_optimize_expr(l,o,r) sh_optimize_expr (l, o, r)
51: extern int sh_optimize_expr (expressionS *, operatorT, expressionS *);
52: #endif
53:
54: /* When relaxing, we need to generate relocations for alignment
55: directives. */
56: #define HANDLE_ALIGN(frag) sh_handle_align (frag)
57: extern void sh_handle_align (fragS *);
58:
59: #define MAX_MEM_FOR_RS_ALIGN_CODE (1 + 2)
60:
61: /* We need to force out some relocations when relaxing. */
62: #define TC_FORCE_RELOCATION(fix) sh_force_relocation (fix)
63: extern int sh_force_relocation (struct fix *);
64:
65: /* This macro decides whether a particular reloc is an entry in a
66: switch table. It is used when relaxing, because the linker needs
67: to know about all such entries so that it can adjust them if
68: necessary. */
69:
70: #define SWITCH_TABLE(FIX) \
71: ((FIX)->fx_addsy != NULL \
72: && (FIX)->fx_subsy != NULL \
73: && S_GET_SEGMENT ((FIX)->fx_addsy) == text_section \
74: && S_GET_SEGMENT ((FIX)->fx_subsy) == text_section \
75: && ((FIX)->fx_r_type == BFD_RELOC_32 \
76: || (FIX)->fx_r_type == BFD_RELOC_16 \
77: || (FIX)->fx_r_type == BFD_RELOC_8))
78:
79: #define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEC) \
1.1.1.4 christos 80: (GENERIC_FORCE_RELOCATION_SUB_SAME (FIX, SEC) \
1.1 christos 81: || TC_FORCE_RELOCATION (FIX) \
82: || (sh_relax && SWITCH_TABLE (FIX)))
83:
84: /* Don't complain when we leave fx_subsy around. */
85: #define TC_VALIDATE_FIX_SUB(FIX, SEG) \
86: ((md_register_arithmetic || (SEG) != reg_section) \
87: && sh_relax && SWITCH_TABLE (FIX))
88:
89: #define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section (FIX, SEC)
90: extern long md_pcrel_from_section (struct fix *, segT);
91:
92: /* SH_COUNT relocs are allowed outside of frag.
93: The target is also buggy and sets fix size too large for other relocs. */
94: #define TC_FX_SIZE_SLACK(FIX) \
95: ((FIX)->fx_r_type == BFD_RELOC_SH_COUNT ? -1 : 2)
96:
97: #define IGNORE_NONSTANDARD_ESCAPES
98:
99: #define LISTING_HEADER \
100: (!target_big_endian \
101: ? "Renesas / SuperH SH GAS Little Endian" \
102: : "Renesas / SuperH SH GAS Big Endian")
103:
104: #define md_operand(x)
105:
106: extern const struct relax_type md_relax_table[];
107: #define TC_GENERIC_RELAX_TABLE md_relax_table
108:
109: /* We record, for each section, whether we have most recently output a
110: CODE reloc or a DATA reloc. */
111: struct sh_segment_info_type
112: {
113: int in_code : 1;
114: };
115: #define TC_SEGMENT_INFO_TYPE struct sh_segment_info_type
116:
117: /* We call a routine to emit a reloc for a label, so that the linker
118: can align loads and stores without crossing a label. */
119: extern void sh_frob_label (symbolS *);
120: #define tc_frob_label(sym) sh_frob_label (sym)
121:
122: /* We call a routine to flush pending output in order to output a DATA
123: reloc when required. */
124: extern void sh_flush_pending_output (void);
125: #define md_flush_pending_output() sh_flush_pending_output ()
126:
127: #define tc_frob_file_before_adjust sh_frob_file
128: extern void sh_frob_file (void);
129:
130:
131: #ifdef OBJ_COFF
132: /* COFF specific definitions. */
133:
134: #define COFF_MAGIC (!target_big_endian ? SH_ARCH_MAGIC_LITTLE : SH_ARCH_MAGIC_BIG)
135:
136: #define tc_coff_symbol_emit_hook(a) ; /* Not used. */
137:
138: #define TC_KEEP_FX_OFFSET 1
139:
140: #define SEG_NAME(SEG) segment_name (SEG)
141:
142: /* We align most sections to a 16 byte boundary. */
143: #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
144: (strncmp (SEG_NAME (SEG), ".stabstr", 8) == 0 \
145: ? 0 \
146: : ((strncmp (SEG_NAME (SEG), ".stab", 5) == 0 \
147: || strcmp (SEG_NAME (SEG), ".ctors") == 0 \
148: || strcmp (SEG_NAME (SEG), ".dtors") == 0) \
149: ? 2 \
150: : (sh_small ? 2 : 4)))
151:
152: #endif /* OBJ_COFF */
153:
154: #ifdef OBJ_ELF
155: /* ELF specific definitions. */
156:
157: /* Whether or not the target is big endian. */
158: extern int target_big_endian;
159: #ifdef TE_LINUX
160: #define TARGET_FORMAT (!target_big_endian ? "elf32-sh-linux" : "elf32-shbig-linux")
161: #elif defined(TE_NetBSD)
162: #define TARGET_FORMAT (!target_big_endian ? "elf32-shl-nbsd" : "elf32-sh-nbsd")
163: #elif defined (TE_VXWORKS)
164: #define TARGET_FORMAT (!target_big_endian ? "elf32-shl-vxworks" : "elf32-sh-vxworks")
165: #elif defined (TE_UCLINUX)
166: #define TARGET_FORMAT sh_uclinux_target_format ()
167: extern const char * sh_uclinux_target_format (void);
168: #else
169: #define TARGET_FORMAT (!target_big_endian ? "elf32-shl" : "elf32-sh")
170: #endif
171:
172: #define elf_tc_final_processing sh_elf_final_processing
173: extern void sh_elf_final_processing (void);
174:
175: #define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs. */
176:
177: #define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
178:
179: /* This is the relocation type for direct references to
180: GLOBAL_OFFSET_TABLE. It comes up in complicated expressions such
181: as _GLOBAL_OFFSET_TABLE_+[.-.L284], which cannot be expressed
182: normally with the regular expressions. The fixup specified here
183: when used at runtime implies that we should add the address of the
184: GOT to the specified location, and as a result we have simplified
185: the expression into something we can use. */
186: #define TC_RELOC_GLOBAL_OFFSET_TABLE BFD_RELOC_SH_GOTPC
187:
188: #define tc_fix_adjustable(FIX) sh_fix_adjustable(FIX)
189: extern bfd_boolean sh_fix_adjustable (struct fix *);
190:
191: /* Values passed to md_apply_fix don't include symbol values. */
192: #define MD_APPLY_SYM_VALUE(FIX) 0
193:
194: /* This expression evaluates to true if the relocation is for a local object
195: for which we still want to do the relocation at runtime. False if we
196: are willing to perform this relocation while building the .o file.
197:
198: We can't resolve references to the GOT or the PLT when creating the
199: object file, since these tables are only created by the linker.
200: Also, if the symbol is global, weak, common or not defined, the
201: assembler can't compute the appropriate reloc, since its location
202: can only be determined at link time. */
203:
204: #define TC_FORCE_RELOCATION_LOCAL(FIX) \
1.1.1.4 christos 205: (GENERIC_FORCE_RELOCATION_LOCAL (FIX) \
1.1 christos 206: || (FIX)->fx_r_type == BFD_RELOC_32_PLT_PCREL \
207: || (FIX)->fx_r_type == BFD_RELOC_32_GOT_PCREL \
1.1.1.4 christos 208: || (FIX)->fx_r_type == BFD_RELOC_SH_GOTPC)
1.1 christos 209:
210: #define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG) \
211: ((!md_register_arithmetic && (SEG) == reg_section) \
212: || (sh_relax && SWITCH_TABLE (FIX)))
213:
214: /* This keeps the subtracted symbol around, for use by PLT_PCREL
215: relocs. */
216: #define TC_FORCE_RELOCATION_SUB_ABS(FIX, SEG) \
217: ((FIX)->fx_r_type == BFD_RELOC_32_PLT_PCREL \
218: || (!md_register_arithmetic && (SEG) == reg_section))
219:
220: /* Don't complain when we leave fx_subsy around. */
221: #undef TC_VALIDATE_FIX_SUB
222: #define TC_VALIDATE_FIX_SUB(FIX, SEG) \
223: ((md_register_arithmetic || (SEG) != reg_section) \
224: && ((FIX)->fx_r_type == BFD_RELOC_32_PLT_PCREL \
225: || (sh_relax && SWITCH_TABLE (FIX))))
226:
227: #define md_parse_name(name, exprP, mode, nextcharP) \
228: sh_parse_name ((name), (exprP), (mode), (nextcharP))
229: int sh_parse_name (char const *, expressionS *,
230: enum expr_mode, char *);
231:
1.1.1.2 christos 232: #define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC) \
233: sh_cons_fix_new ((FRAG), (OFF), (LEN), (EXP), (RELOC))
234: void sh_cons_fix_new (fragS *, int, int, expressionS *,
235: bfd_reloc_code_real_type);
1.1 christos 236:
237: /* This is used to construct expressions out of @GOTOFF, @PLT and @GOT
238: symbols. The relocation type is stored in X_md. */
239: #define O_PIC_reloc O_md1
240:
241: #define TARGET_USE_CFIPOP 1
242:
243: #define tc_cfi_frame_initial_instructions sh_cfi_frame_initial_instructions
244: extern void sh_cfi_frame_initial_instructions (void);
245:
246: #define tc_regname_to_dw2regnum sh_regname_to_dw2regnum
247: extern int sh_regname_to_dw2regnum (char *);
248:
249: /* All SH instructions are multiples of 16 bits. */
250: #define DWARF2_LINE_MIN_INSN_LENGTH 2
251: #define DWARF2_DEFAULT_RETURN_COLUMN 17
252: #define DWARF2_CIE_DATA_ALIGNMENT (-4)
253:
254: #endif /* OBJ_ELF */
255:
256: #define H_TICK_HEX 1
CVSweb <webmaster@jp.NetBSD.org>