tc-sparc.c revision 1.1.1.2 1 1.1 skrll /* tc-sparc.c -- Assemble for the SPARC
2 1.1 skrll Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1.1.1.2 christos 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 1.1 skrll Free Software Foundation, Inc.
5 1.1 skrll This file is part of GAS, the GNU Assembler.
6 1.1 skrll
7 1.1 skrll GAS is free software; you can redistribute it and/or modify
8 1.1 skrll it under the terms of the GNU General Public License as published by
9 1.1 skrll the Free Software Foundation; either version 3, or (at your option)
10 1.1 skrll any later version.
11 1.1 skrll
12 1.1 skrll GAS is distributed in the hope that it will be useful,
13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 skrll GNU General Public License for more details.
16 1.1 skrll
17 1.1 skrll You should have received a copy of the GNU General Public
18 1.1 skrll License along with GAS; see the file COPYING. If not, write
19 1.1 skrll to the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20 1.1 skrll Boston, MA 02110-1301, USA. */
21 1.1 skrll
22 1.1 skrll #include "as.h"
23 1.1 skrll #include "safe-ctype.h"
24 1.1 skrll #include "subsegs.h"
25 1.1 skrll
26 1.1 skrll #include "opcode/sparc.h"
27 1.1 skrll #include "dw2gencfi.h"
28 1.1 skrll
29 1.1 skrll #ifdef OBJ_ELF
30 1.1 skrll #include "elf/sparc.h"
31 1.1 skrll #include "dwarf2dbg.h"
32 1.1 skrll #endif
33 1.1 skrll
34 1.1 skrll /* Some ancient Sun C compilers would not take such hex constants as
35 1.1 skrll unsigned, and would end up sign-extending them to form an offsetT,
36 1.1 skrll so use these constants instead. */
37 1.1 skrll #define U0xffffffff ((((unsigned long) 1 << 16) << 16) - 1)
38 1.1 skrll #define U0x80000000 ((((unsigned long) 1 << 16) << 15))
39 1.1 skrll
40 1.1 skrll static int sparc_ip (char *, const struct sparc_opcode **);
41 1.1 skrll static int parse_keyword_arg (int (*) (const char *), char **, int *);
42 1.1 skrll static int parse_const_expr_arg (char **, int *);
43 1.1 skrll static int get_expression (char *);
44 1.1 skrll
45 1.1 skrll /* Default architecture. */
46 1.1 skrll /* ??? The default value should be V8, but sparclite support was added
47 1.1 skrll by making it the default. GCC now passes -Asparclite, so maybe sometime in
48 1.1 skrll the future we can set this to V8. */
49 1.1 skrll #ifndef DEFAULT_ARCH
50 1.1 skrll #define DEFAULT_ARCH "sparclite"
51 1.1 skrll #endif
52 1.1 skrll static char *default_arch = DEFAULT_ARCH;
53 1.1 skrll
54 1.1 skrll /* Non-zero if the initial values of `max_architecture' and `sparc_arch_size'
55 1.1 skrll have been set. */
56 1.1 skrll static int default_init_p;
57 1.1 skrll
58 1.1 skrll /* Current architecture. We don't bump up unless necessary. */
59 1.1 skrll static enum sparc_opcode_arch_val current_architecture = SPARC_OPCODE_ARCH_V6;
60 1.1 skrll
61 1.1 skrll /* The maximum architecture level we can bump up to.
62 1.1 skrll In a 32 bit environment, don't allow bumping up to v9 by default.
63 1.1 skrll The native assembler works this way. The user is required to pass
64 1.1 skrll an explicit argument before we'll create v9 object files. However, if
65 1.1 skrll we don't see any v9 insns, a v8plus object file is not created. */
66 1.1 skrll static enum sparc_opcode_arch_val max_architecture;
67 1.1 skrll
68 1.1 skrll /* Either 32 or 64, selects file format. */
69 1.1 skrll static int sparc_arch_size;
70 1.1 skrll /* Initial (default) value, recorded separately in case a user option
71 1.1 skrll changes the value before md_show_usage is called. */
72 1.1 skrll static int default_arch_size;
73 1.1 skrll
74 1.1 skrll #ifdef OBJ_ELF
75 1.1 skrll /* The currently selected v9 memory model. Currently only used for
76 1.1 skrll ELF. */
77 1.1 skrll static enum { MM_TSO, MM_PSO, MM_RMO } sparc_memory_model = MM_RMO;
78 1.1 skrll #endif
79 1.1 skrll
80 1.1 skrll static int architecture_requested;
81 1.1 skrll static int warn_on_bump;
82 1.1 skrll
83 1.1 skrll /* If warn_on_bump and the needed architecture is higher than this
84 1.1 skrll architecture, issue a warning. */
85 1.1 skrll static enum sparc_opcode_arch_val warn_after_architecture;
86 1.1 skrll
87 1.1 skrll /* Non-zero if as should generate error if an undeclared g[23] register
88 1.1 skrll has been used in -64. */
89 1.1 skrll static int no_undeclared_regs;
90 1.1 skrll
91 1.1 skrll /* Non-zero if we should try to relax jumps and calls. */
92 1.1 skrll static int sparc_relax;
93 1.1 skrll
94 1.1 skrll /* Non-zero if we are generating PIC code. */
95 1.1 skrll int sparc_pic_code;
96 1.1 skrll
97 1.1 skrll /* Non-zero if we should give an error when misaligned data is seen. */
98 1.1 skrll static int enforce_aligned_data;
99 1.1 skrll
100 1.1 skrll extern int target_big_endian;
101 1.1 skrll
102 1.1 skrll static int target_little_endian_data;
103 1.1 skrll
104 1.1 skrll /* Symbols for global registers on v9. */
105 1.1 skrll static symbolS *globals[8];
106 1.1 skrll
107 1.1 skrll /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
108 1.1 skrll int sparc_cie_data_alignment;
109 1.1 skrll
110 1.1 skrll /* V9 and 86x have big and little endian data, but instructions are always big
111 1.1 skrll endian. The sparclet has bi-endian support but both data and insns have
112 1.1 skrll the same endianness. Global `target_big_endian' is used for data.
113 1.1 skrll The following macro is used for instructions. */
114 1.1 skrll #ifndef INSN_BIG_ENDIAN
115 1.1 skrll #define INSN_BIG_ENDIAN (target_big_endian \
116 1.1 skrll || default_arch_type == sparc86x \
117 1.1 skrll || SPARC_OPCODE_ARCH_V9_P (max_architecture))
118 1.1 skrll #endif
119 1.1 skrll
120 1.1 skrll /* Handle of the OPCODE hash table. */
121 1.1 skrll static struct hash_control *op_hash;
122 1.1 skrll
123 1.1 skrll static void s_data1 (void);
124 1.1 skrll static void s_seg (int);
125 1.1 skrll static void s_proc (int);
126 1.1 skrll static void s_reserve (int);
127 1.1 skrll static void s_common (int);
128 1.1 skrll static void s_empty (int);
129 1.1 skrll static void s_uacons (int);
130 1.1 skrll static void s_ncons (int);
131 1.1 skrll #ifdef OBJ_ELF
132 1.1 skrll static void s_register (int);
133 1.1 skrll #endif
134 1.1 skrll
135 1.1 skrll const pseudo_typeS md_pseudo_table[] =
136 1.1 skrll {
137 1.1 skrll {"align", s_align_bytes, 0}, /* Defaulting is invalid (0). */
138 1.1 skrll {"common", s_common, 0},
139 1.1 skrll {"empty", s_empty, 0},
140 1.1 skrll {"global", s_globl, 0},
141 1.1 skrll {"half", cons, 2},
142 1.1 skrll {"nword", s_ncons, 0},
143 1.1 skrll {"optim", s_ignore, 0},
144 1.1 skrll {"proc", s_proc, 0},
145 1.1 skrll {"reserve", s_reserve, 0},
146 1.1 skrll {"seg", s_seg, 0},
147 1.1 skrll {"skip", s_space, 0},
148 1.1 skrll {"word", cons, 4},
149 1.1 skrll {"xword", cons, 8},
150 1.1 skrll {"uahalf", s_uacons, 2},
151 1.1 skrll {"uaword", s_uacons, 4},
152 1.1 skrll {"uaxword", s_uacons, 8},
153 1.1 skrll #ifdef OBJ_ELF
154 1.1 skrll /* These are specific to sparc/svr4. */
155 1.1 skrll {"2byte", s_uacons, 2},
156 1.1 skrll {"4byte", s_uacons, 4},
157 1.1 skrll {"8byte", s_uacons, 8},
158 1.1 skrll {"register", s_register, 0},
159 1.1 skrll #endif
160 1.1 skrll {NULL, 0, 0},
161 1.1 skrll };
162 1.1 skrll
163 1.1 skrll /* This array holds the chars that always start a comment. If the
164 1.1 skrll pre-processor is disabled, these aren't very useful. */
165 1.1 skrll const char comment_chars[] = "!"; /* JF removed '|' from
166 1.1 skrll comment_chars. */
167 1.1 skrll
168 1.1 skrll /* This array holds the chars that only start a comment at the beginning of
169 1.1 skrll a line. If the line seems to have the form '# 123 filename'
170 1.1 skrll .line and .file directives will appear in the pre-processed output. */
171 1.1 skrll /* Note that input_file.c hand checks for '#' at the beginning of the
172 1.1 skrll first line of the input file. This is because the compiler outputs
173 1.1 skrll #NO_APP at the beginning of its output. */
174 1.1 skrll /* Also note that comments started like this one will always
175 1.1 skrll work if '/' isn't otherwise defined. */
176 1.1 skrll const char line_comment_chars[] = "#";
177 1.1 skrll
178 1.1 skrll const char line_separator_chars[] = ";";
179 1.1 skrll
180 1.1 skrll /* Chars that can be used to separate mant from exp in floating point
181 1.1 skrll nums. */
182 1.1 skrll const char EXP_CHARS[] = "eE";
183 1.1 skrll
184 1.1 skrll /* Chars that mean this number is a floating point constant.
185 1.1 skrll As in 0f12.456
186 1.1 skrll or 0d1.2345e12 */
187 1.1 skrll const char FLT_CHARS[] = "rRsSfFdDxXpP";
188 1.1 skrll
189 1.1 skrll /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
190 1.1 skrll changed in read.c. Ideally it shouldn't have to know about it at all,
191 1.1 skrll but nothing is ideal around here. */
192 1.1 skrll
193 1.1 skrll #define isoctal(c) ((unsigned) ((c) - '0') < 8)
194 1.1 skrll
195 1.1 skrll struct sparc_it
196 1.1 skrll {
197 1.1 skrll char *error;
198 1.1 skrll unsigned long opcode;
199 1.1 skrll struct nlist *nlistp;
200 1.1 skrll expressionS exp;
201 1.1 skrll expressionS exp2;
202 1.1 skrll int pcrel;
203 1.1 skrll bfd_reloc_code_real_type reloc;
204 1.1 skrll };
205 1.1 skrll
206 1.1 skrll struct sparc_it the_insn, set_insn;
207 1.1 skrll
208 1.1 skrll static void output_insn (const struct sparc_opcode *, struct sparc_it *);
209 1.1 skrll
210 1.1 skrll /* Table of arguments to -A.
212 1.1 skrll The sparc_opcode_arch table in sparc-opc.c is insufficient and incorrect
213 1.1 skrll for this use. That table is for opcodes only. This table is for opcodes
214 1.1 skrll and file formats. */
215 1.1 skrll
216 1.1 skrll enum sparc_arch_types {v6, v7, v8, sparclet, sparclite, sparc86x, v8plus,
217 1.1 skrll v8plusa, v9, v9a, v9b, v9_64};
218 1.1 skrll
219 1.1 skrll static struct sparc_arch {
220 1.1 skrll char *name;
221 1.1 skrll char *opcode_arch;
222 1.1 skrll enum sparc_arch_types arch_type;
223 1.1 skrll /* Default word size, as specified during configuration.
224 1.1 skrll A value of zero means can't be used to specify default architecture. */
225 1.1 skrll int default_arch_size;
226 1.1 skrll /* Allowable arg to -A? */
227 1.1 skrll int user_option_p;
228 1.1 skrll } sparc_arch_table[] = {
229 1.1 skrll { "v6", "v6", v6, 0, 1 },
230 1.1 skrll { "v7", "v7", v7, 0, 1 },
231 1.1 skrll { "v8", "v8", v8, 32, 1 },
232 1.1 skrll { "sparclet", "sparclet", sparclet, 32, 1 },
233 1.1 skrll { "sparclite", "sparclite", sparclite, 32, 1 },
234 1.1 skrll { "sparc86x", "sparclite", sparc86x, 32, 1 },
235 1.1 skrll { "v8plus", "v9", v9, 0, 1 },
236 1.1 skrll { "v8plusa", "v9a", v9, 0, 1 },
237 1.1 skrll { "v8plusb", "v9b", v9, 0, 1 },
238 1.1 skrll { "v9", "v9", v9, 0, 1 },
239 1.1 skrll { "v9a", "v9a", v9, 0, 1 },
240 1.1 skrll { "v9b", "v9b", v9, 0, 1 },
241 1.1 skrll /* This exists to allow configure.in/Makefile.in to pass one
242 1.1 skrll value to specify both the default machine and default word size. */
243 1.1 skrll { "v9-64", "v9", v9, 64, 0 },
244 1.1 skrll { NULL, NULL, v8, 0, 0 }
245 1.1 skrll };
246 1.1 skrll
247 1.1 skrll /* Variant of default_arch */
248 1.1 skrll static enum sparc_arch_types default_arch_type;
249 1.1 skrll
250 1.1 skrll static struct sparc_arch *
251 1.1 skrll lookup_arch (char *name)
252 1.1 skrll {
253 1.1 skrll struct sparc_arch *sa;
254 1.1 skrll
255 1.1 skrll for (sa = &sparc_arch_table[0]; sa->name != NULL; sa++)
256 1.1 skrll if (strcmp (sa->name, name) == 0)
257 1.1 skrll break;
258 1.1 skrll if (sa->name == NULL)
259 1.1 skrll return NULL;
260 1.1 skrll return sa;
261 1.1 skrll }
262 1.1 skrll
263 1.1 skrll /* Initialize the default opcode arch and word size from the default
264 1.1 skrll architecture name. */
265 1.1 skrll
266 1.1 skrll static void
267 1.1 skrll init_default_arch (void)
268 1.1 skrll {
269 1.1 skrll struct sparc_arch *sa = lookup_arch (default_arch);
270 1.1 skrll
271 1.1 skrll if (sa == NULL
272 1.1 skrll || sa->default_arch_size == 0)
273 1.1 skrll as_fatal (_("Invalid default architecture, broken assembler."));
274 1.1 skrll
275 1.1 skrll max_architecture = sparc_opcode_lookup_arch (sa->opcode_arch);
276 1.1 skrll if (max_architecture == SPARC_OPCODE_ARCH_BAD)
277 1.1 skrll as_fatal (_("Bad opcode table, broken assembler."));
278 1.1 skrll default_arch_size = sparc_arch_size = sa->default_arch_size;
279 1.1 skrll default_init_p = 1;
280 1.1 skrll default_arch_type = sa->arch_type;
281 1.1 skrll }
282 1.1 skrll
283 1.1 skrll /* Called by TARGET_FORMAT. */
284 1.1 skrll
285 1.1 skrll const char *
286 1.1 skrll sparc_target_format (void)
287 1.1 skrll {
288 1.1 skrll /* We don't get a chance to initialize anything before we're called,
289 1.1 skrll so handle that now. */
290 1.1 skrll if (! default_init_p)
291 1.1 skrll init_default_arch ();
292 1.1 skrll
293 1.1 skrll #ifdef OBJ_AOUT
294 1.1 skrll #ifdef TE_NetBSD
295 1.1 skrll return "a.out-sparc-netbsd";
296 1.1 skrll #else
297 1.1 skrll #ifdef TE_SPARCAOUT
298 1.1 skrll if (target_big_endian)
299 1.1 skrll return "a.out-sunos-big";
300 1.1 skrll else if (default_arch_type == sparc86x && target_little_endian_data)
301 1.1 skrll return "a.out-sunos-big";
302 1.1 skrll else
303 1.1 skrll return "a.out-sparc-little";
304 1.1 skrll #else
305 1.1 skrll return "a.out-sunos-big";
306 1.1 skrll #endif
307 1.1 skrll #endif
308 1.1 skrll #endif
309 1.1 skrll
310 1.1 skrll #ifdef OBJ_BOUT
311 1.1 skrll return "b.out.big";
312 1.1 skrll #endif
313 1.1 skrll
314 1.1 skrll #ifdef OBJ_COFF
315 1.1 skrll #ifdef TE_LYNX
316 1.1 skrll return "coff-sparc-lynx";
317 1.1 skrll #else
318 1.1 skrll return "coff-sparc";
319 1.1 skrll #endif
320 1.1 skrll #endif
321 1.1 skrll
322 1.1 skrll #ifdef TE_VXWORKS
323 1.1 skrll return "elf32-sparc-vxworks";
324 1.1 skrll #endif
325 1.1 skrll
326 1.1 skrll #ifdef OBJ_ELF
327 1.1 skrll return sparc_arch_size == 64 ? ELF64_TARGET_FORMAT : ELF_TARGET_FORMAT;
328 1.1 skrll #endif
329 1.1 skrll
330 1.1 skrll abort ();
331 1.1 skrll }
332 1.1 skrll
333 1.1 skrll /* md_parse_option
335 1.1 skrll * Invocation line includes a switch not recognized by the base assembler.
336 1.1 skrll * See if it's a processor-specific option. These are:
337 1.1 skrll *
338 1.1 skrll * -bump
339 1.1 skrll * Warn on architecture bumps. See also -A.
340 1.1 skrll *
341 1.1 skrll * -Av6, -Av7, -Av8, -Asparclite, -Asparclet
342 1.1 skrll * Standard 32 bit architectures.
343 1.1 skrll * -Av9, -Av9a, -Av9b
344 1.1 skrll * Sparc64 in either a 32 or 64 bit world (-32/-64 says which).
345 1.1 skrll * This used to only mean 64 bits, but properly specifying it
346 1.1 skrll * complicated gcc's ASM_SPECs, so now opcode selection is
347 1.1 skrll * specified orthogonally to word size (except when specifying
348 1.1 skrll * the default, but that is an internal implementation detail).
349 1.1 skrll * -Av8plus, -Av8plusa, -Av8plusb
350 1.1 skrll * Same as -Av9{,a,b}.
351 1.1 skrll * -xarch=v8plus, -xarch=v8plusa, -xarch=v8plusb
352 1.1 skrll * Same as -Av8plus{,a,b} -32, for compatibility with Sun's
353 1.1 skrll * assembler.
354 1.1 skrll * -xarch=v9, -xarch=v9a, -xarch=v9b
355 1.1 skrll * Same as -Av9{,a,b} -64, for compatibility with Sun's
356 1.1 skrll * assembler.
357 1.1 skrll *
358 1.1 skrll * Select the architecture and possibly the file format.
359 1.1 skrll * Instructions or features not supported by the selected
360 1.1 skrll * architecture cause fatal errors.
361 1.1 skrll *
362 1.1 skrll * The default is to start at v6, and bump the architecture up
363 1.1 skrll * whenever an instruction is seen at a higher level. In 32 bit
364 1.1 skrll * environments, v9 is not bumped up to, the user must pass
365 1.1 skrll * -Av8plus{,a,b}.
366 1.1 skrll *
367 1.1 skrll * If -bump is specified, a warning is printing when bumping to
368 1.1 skrll * higher levels.
369 1.1 skrll *
370 1.1 skrll * If an architecture is specified, all instructions must match
371 1.1 skrll * that architecture. Any higher level instructions are flagged
372 1.1 skrll * as errors. Note that in the 32 bit environment specifying
373 1.1 skrll * -Av8plus does not automatically create a v8plus object file, a
374 1.1 skrll * v9 insn must be seen.
375 1.1 skrll *
376 1.1 skrll * If both an architecture and -bump are specified, the
377 1.1 skrll * architecture starts at the specified level, but bumps are
378 1.1 skrll * warnings. Note that we can't set `current_architecture' to
379 1.1 skrll * the requested level in this case: in the 32 bit environment,
380 1.1 skrll * we still must avoid creating v8plus object files unless v9
381 1.1 skrll * insns are seen.
382 1.1 skrll *
383 1.1 skrll * Note:
384 1.1 skrll * Bumping between incompatible architectures is always an
385 1.1 skrll * error. For example, from sparclite to v9.
386 1.1 skrll */
387 1.1 skrll
388 1.1 skrll #ifdef OBJ_ELF
389 1.1 skrll const char *md_shortopts = "A:K:VQ:sq";
390 1.1 skrll #else
391 1.1 skrll #ifdef OBJ_AOUT
392 1.1 skrll const char *md_shortopts = "A:k";
393 1.1 skrll #else
394 1.1 skrll const char *md_shortopts = "A:";
395 1.1 skrll #endif
396 1.1 skrll #endif
397 1.1 skrll struct option md_longopts[] = {
398 1.1 skrll #define OPTION_BUMP (OPTION_MD_BASE)
399 1.1 skrll {"bump", no_argument, NULL, OPTION_BUMP},
400 1.1 skrll #define OPTION_SPARC (OPTION_MD_BASE + 1)
401 1.1 skrll {"sparc", no_argument, NULL, OPTION_SPARC},
402 1.1 skrll #define OPTION_XARCH (OPTION_MD_BASE + 2)
403 1.1 skrll {"xarch", required_argument, NULL, OPTION_XARCH},
404 1.1 skrll #ifdef OBJ_ELF
405 1.1 skrll #define OPTION_32 (OPTION_MD_BASE + 3)
406 1.1 skrll {"32", no_argument, NULL, OPTION_32},
407 1.1 skrll #define OPTION_64 (OPTION_MD_BASE + 4)
408 1.1 skrll {"64", no_argument, NULL, OPTION_64},
409 1.1 skrll #define OPTION_TSO (OPTION_MD_BASE + 5)
410 1.1 skrll {"TSO", no_argument, NULL, OPTION_TSO},
411 1.1 skrll #define OPTION_PSO (OPTION_MD_BASE + 6)
412 1.1 skrll {"PSO", no_argument, NULL, OPTION_PSO},
413 1.1 skrll #define OPTION_RMO (OPTION_MD_BASE + 7)
414 1.1 skrll {"RMO", no_argument, NULL, OPTION_RMO},
415 1.1 skrll #endif
416 1.1 skrll #ifdef SPARC_BIENDIAN
417 1.1 skrll #define OPTION_LITTLE_ENDIAN (OPTION_MD_BASE + 8)
418 1.1 skrll {"EL", no_argument, NULL, OPTION_LITTLE_ENDIAN},
419 1.1 skrll #define OPTION_BIG_ENDIAN (OPTION_MD_BASE + 9)
420 1.1 skrll {"EB", no_argument, NULL, OPTION_BIG_ENDIAN},
421 1.1 skrll #endif
422 1.1 skrll #define OPTION_ENFORCE_ALIGNED_DATA (OPTION_MD_BASE + 10)
423 1.1 skrll {"enforce-aligned-data", no_argument, NULL, OPTION_ENFORCE_ALIGNED_DATA},
424 1.1 skrll #define OPTION_LITTLE_ENDIAN_DATA (OPTION_MD_BASE + 11)
425 1.1 skrll {"little-endian-data", no_argument, NULL, OPTION_LITTLE_ENDIAN_DATA},
426 1.1 skrll #ifdef OBJ_ELF
427 1.1 skrll #define OPTION_NO_UNDECLARED_REGS (OPTION_MD_BASE + 12)
428 1.1 skrll {"no-undeclared-regs", no_argument, NULL, OPTION_NO_UNDECLARED_REGS},
429 1.1 skrll #define OPTION_UNDECLARED_REGS (OPTION_MD_BASE + 13)
430 1.1 skrll {"undeclared-regs", no_argument, NULL, OPTION_UNDECLARED_REGS},
431 1.1 skrll #endif
432 1.1 skrll #define OPTION_RELAX (OPTION_MD_BASE + 14)
433 1.1 skrll {"relax", no_argument, NULL, OPTION_RELAX},
434 1.1 skrll #define OPTION_NO_RELAX (OPTION_MD_BASE + 15)
435 1.1 skrll {"no-relax", no_argument, NULL, OPTION_NO_RELAX},
436 1.1 skrll {NULL, no_argument, NULL, 0}
437 1.1 skrll };
438 1.1 skrll
439 1.1 skrll size_t md_longopts_size = sizeof (md_longopts);
440 1.1 skrll
441 1.1 skrll int
442 1.1 skrll md_parse_option (int c, char *arg)
443 1.1 skrll {
444 1.1 skrll /* We don't get a chance to initialize anything before we're called,
445 1.1 skrll so handle that now. */
446 1.1 skrll if (! default_init_p)
447 1.1 skrll init_default_arch ();
448 1.1 skrll
449 1.1 skrll switch (c)
450 1.1 skrll {
451 1.1 skrll case OPTION_BUMP:
452 1.1 skrll warn_on_bump = 1;
453 1.1 skrll warn_after_architecture = SPARC_OPCODE_ARCH_V6;
454 1.1 skrll break;
455 1.1 skrll
456 1.1 skrll case OPTION_XARCH:
457 1.1 skrll #ifdef OBJ_ELF
458 1.1 skrll if (strncmp (arg, "v9", 2) != 0)
459 1.1 skrll md_parse_option (OPTION_32, NULL);
460 1.1 skrll else
461 1.1 skrll md_parse_option (OPTION_64, NULL);
462 1.1 skrll #endif
463 1.1 skrll /* Fall through. */
464 1.1 skrll
465 1.1 skrll case 'A':
466 1.1 skrll {
467 1.1 skrll struct sparc_arch *sa;
468 1.1 skrll enum sparc_opcode_arch_val opcode_arch;
469 1.1 skrll
470 1.1 skrll sa = lookup_arch (arg);
471 1.1 skrll if (sa == NULL
472 1.1 skrll || ! sa->user_option_p)
473 1.1 skrll {
474 1.1 skrll if (c == OPTION_XARCH)
475 1.1 skrll as_bad (_("invalid architecture -xarch=%s"), arg);
476 1.1 skrll else
477 1.1 skrll as_bad (_("invalid architecture -A%s"), arg);
478 1.1 skrll return 0;
479 1.1 skrll }
480 1.1 skrll
481 1.1 skrll opcode_arch = sparc_opcode_lookup_arch (sa->opcode_arch);
482 1.1 skrll if (opcode_arch == SPARC_OPCODE_ARCH_BAD)
483 1.1 skrll as_fatal (_("Bad opcode table, broken assembler."));
484 1.1 skrll
485 1.1 skrll max_architecture = opcode_arch;
486 1.1 skrll architecture_requested = 1;
487 1.1 skrll }
488 1.1 skrll break;
489 1.1 skrll
490 1.1 skrll case OPTION_SPARC:
491 1.1 skrll /* Ignore -sparc, used by SunOS make default .s.o rule. */
492 1.1 skrll break;
493 1.1 skrll
494 1.1 skrll case OPTION_ENFORCE_ALIGNED_DATA:
495 1.1 skrll enforce_aligned_data = 1;
496 1.1 skrll break;
497 1.1 skrll
498 1.1 skrll #ifdef SPARC_BIENDIAN
499 1.1 skrll case OPTION_LITTLE_ENDIAN:
500 1.1 skrll target_big_endian = 0;
501 1.1 skrll if (default_arch_type != sparclet)
502 1.1 skrll as_fatal ("This target does not support -EL");
503 1.1 skrll break;
504 1.1 skrll case OPTION_LITTLE_ENDIAN_DATA:
505 1.1 skrll target_little_endian_data = 1;
506 1.1 skrll target_big_endian = 0;
507 1.1 skrll if (default_arch_type != sparc86x
508 1.1 skrll && default_arch_type != v9)
509 1.1 skrll as_fatal ("This target does not support --little-endian-data");
510 1.1 skrll break;
511 1.1 skrll case OPTION_BIG_ENDIAN:
512 1.1 skrll target_big_endian = 1;
513 1.1 skrll break;
514 1.1 skrll #endif
515 1.1 skrll
516 1.1 skrll #ifdef OBJ_AOUT
517 1.1 skrll case 'k':
518 1.1 skrll sparc_pic_code = 1;
519 1.1 skrll break;
520 1.1 skrll #endif
521 1.1 skrll
522 1.1 skrll #ifdef OBJ_ELF
523 1.1 skrll case OPTION_32:
524 1.1 skrll case OPTION_64:
525 1.1 skrll {
526 1.1 skrll const char **list, **l;
527 1.1 skrll
528 1.1 skrll sparc_arch_size = c == OPTION_32 ? 32 : 64;
529 1.1 skrll list = bfd_target_list ();
530 1.1 skrll for (l = list; *l != NULL; l++)
531 1.1 skrll {
532 1.1 skrll if (sparc_arch_size == 32)
533 1.1 skrll {
534 1.1 skrll if (CONST_STRNEQ (*l, "elf32-sparc"))
535 1.1 skrll break;
536 1.1 skrll }
537 1.1 skrll else
538 1.1 skrll {
539 1.1 skrll if (CONST_STRNEQ (*l, "elf64-sparc"))
540 1.1 skrll break;
541 1.1 skrll }
542 1.1 skrll }
543 1.1 skrll if (*l == NULL)
544 1.1 skrll as_fatal (_("No compiled in support for %d bit object file format"),
545 1.1.1.2 christos sparc_arch_size);
546 1.1.1.2 christos free (list);
547 1.1.1.2 christos
548 1.1.1.2 christos if (sparc_arch_size == 64
549 1.1 skrll && max_architecture < SPARC_OPCODE_ARCH_V9)
550 1.1 skrll max_architecture = SPARC_OPCODE_ARCH_V9;
551 1.1 skrll }
552 1.1 skrll break;
553 1.1 skrll
554 1.1 skrll case OPTION_TSO:
555 1.1 skrll sparc_memory_model = MM_TSO;
556 1.1 skrll break;
557 1.1 skrll
558 1.1 skrll case OPTION_PSO:
559 1.1 skrll sparc_memory_model = MM_PSO;
560 1.1 skrll break;
561 1.1 skrll
562 1.1 skrll case OPTION_RMO:
563 1.1 skrll sparc_memory_model = MM_RMO;
564 1.1 skrll break;
565 1.1 skrll
566 1.1 skrll case 'V':
567 1.1 skrll print_version_id ();
568 1.1 skrll break;
569 1.1 skrll
570 1.1 skrll case 'Q':
571 1.1 skrll /* Qy - do emit .comment
572 1.1 skrll Qn - do not emit .comment. */
573 1.1 skrll break;
574 1.1 skrll
575 1.1 skrll case 's':
576 1.1 skrll /* Use .stab instead of .stab.excl. */
577 1.1 skrll break;
578 1.1 skrll
579 1.1 skrll case 'q':
580 1.1 skrll /* quick -- Native assembler does fewer checks. */
581 1.1 skrll break;
582 1.1 skrll
583 1.1 skrll case 'K':
584 1.1 skrll if (strcmp (arg, "PIC") != 0)
585 1.1 skrll as_warn (_("Unrecognized option following -K"));
586 1.1 skrll else
587 1.1 skrll sparc_pic_code = 1;
588 1.1 skrll break;
589 1.1 skrll
590 1.1 skrll case OPTION_NO_UNDECLARED_REGS:
591 1.1 skrll no_undeclared_regs = 1;
592 1.1 skrll break;
593 1.1 skrll
594 1.1 skrll case OPTION_UNDECLARED_REGS:
595 1.1 skrll no_undeclared_regs = 0;
596 1.1 skrll break;
597 1.1 skrll #endif
598 1.1 skrll
599 1.1 skrll case OPTION_RELAX:
600 1.1 skrll sparc_relax = 1;
601 1.1 skrll break;
602 1.1 skrll
603 1.1 skrll case OPTION_NO_RELAX:
604 1.1 skrll sparc_relax = 0;
605 1.1 skrll break;
606 1.1 skrll
607 1.1 skrll default:
608 1.1 skrll return 0;
609 1.1 skrll }
610 1.1 skrll
611 1.1 skrll return 1;
612 1.1 skrll }
613 1.1 skrll
614 1.1 skrll void
615 1.1 skrll md_show_usage (FILE *stream)
616 1.1 skrll {
617 1.1 skrll const struct sparc_arch *arch;
618 1.1 skrll int column;
619 1.1 skrll
620 1.1 skrll /* We don't get a chance to initialize anything before we're called,
621 1.1 skrll so handle that now. */
622 1.1 skrll if (! default_init_p)
623 1.1 skrll init_default_arch ();
624 1.1 skrll
625 1.1 skrll fprintf (stream, _("SPARC options:\n"));
626 1.1 skrll column = 0;
627 1.1 skrll for (arch = &sparc_arch_table[0]; arch->name; arch++)
628 1.1 skrll {
629 1.1 skrll if (!arch->user_option_p)
630 1.1 skrll continue;
631 1.1 skrll if (arch != &sparc_arch_table[0])
632 1.1 skrll fprintf (stream, " | ");
633 1.1 skrll if (column + strlen (arch->name) > 70)
634 1.1 skrll {
635 1.1 skrll column = 0;
636 1.1 skrll fputc ('\n', stream);
637 1.1 skrll }
638 1.1 skrll column += 5 + 2 + strlen (arch->name);
639 1.1 skrll fprintf (stream, "-A%s", arch->name);
640 1.1 skrll }
641 1.1 skrll for (arch = &sparc_arch_table[0]; arch->name; arch++)
642 1.1 skrll {
643 1.1 skrll if (!arch->user_option_p)
644 1.1 skrll continue;
645 1.1 skrll fprintf (stream, " | ");
646 1.1 skrll if (column + strlen (arch->name) > 65)
647 1.1 skrll {
648 1.1 skrll column = 0;
649 1.1 skrll fputc ('\n', stream);
650 1.1 skrll }
651 1.1 skrll column += 5 + 7 + strlen (arch->name);
652 1.1 skrll fprintf (stream, "-xarch=%s", arch->name);
653 1.1 skrll }
654 1.1 skrll fprintf (stream, _("\n\
655 1.1 skrll specify variant of SPARC architecture\n\
656 1.1 skrll -bump warn when assembler switches architectures\n\
657 1.1 skrll -sparc ignored\n\
658 1.1 skrll --enforce-aligned-data force .long, etc., to be aligned correctly\n\
659 1.1 skrll -relax relax jumps and branches (default)\n\
660 1.1 skrll -no-relax avoid changing any jumps and branches\n"));
661 1.1 skrll #ifdef OBJ_AOUT
662 1.1 skrll fprintf (stream, _("\
663 1.1 skrll -k generate PIC\n"));
664 1.1 skrll #endif
665 1.1 skrll #ifdef OBJ_ELF
666 1.1 skrll fprintf (stream, _("\
667 1.1 skrll -32 create 32 bit object file\n\
668 1.1 skrll -64 create 64 bit object file\n"));
669 1.1 skrll fprintf (stream, _("\
670 1.1 skrll [default is %d]\n"), default_arch_size);
671 1.1 skrll fprintf (stream, _("\
672 1.1 skrll -TSO use Total Store Ordering\n\
673 1.1 skrll -PSO use Partial Store Ordering\n\
674 1.1 skrll -RMO use Relaxed Memory Ordering\n"));
675 1.1 skrll fprintf (stream, _("\
676 1.1 skrll [default is %s]\n"), (default_arch_size == 64) ? "RMO" : "TSO");
677 1.1 skrll fprintf (stream, _("\
678 1.1 skrll -KPIC generate PIC\n\
679 1.1 skrll -V print assembler version number\n\
680 1.1 skrll -undeclared-regs ignore application global register usage without\n\
681 1.1 skrll appropriate .register directive (default)\n\
682 1.1 skrll -no-undeclared-regs force error on application global register usage\n\
683 1.1 skrll without appropriate .register directive\n\
684 1.1 skrll -q ignored\n\
685 1.1 skrll -Qy, -Qn ignored\n\
686 1.1 skrll -s ignored\n"));
687 1.1 skrll #endif
688 1.1 skrll #ifdef SPARC_BIENDIAN
689 1.1 skrll fprintf (stream, _("\
690 1.1 skrll -EL generate code for a little endian machine\n\
691 1.1 skrll -EB generate code for a big endian machine\n\
692 1.1 skrll --little-endian-data generate code for a machine having big endian\n\
693 1.1 skrll instructions and little endian data.\n"));
694 1.1 skrll #endif
695 1.1 skrll }
696 1.1 skrll
697 1.1 skrll /* Native operand size opcode translation. */
699 1.1 skrll struct
700 1.1 skrll {
701 1.1 skrll char *name;
702 1.1 skrll char *name32;
703 1.1 skrll char *name64;
704 1.1 skrll } native_op_table[] =
705 1.1 skrll {
706 1.1 skrll {"ldn", "ld", "ldx"},
707 1.1 skrll {"ldna", "lda", "ldxa"},
708 1.1 skrll {"stn", "st", "stx"},
709 1.1 skrll {"stna", "sta", "stxa"},
710 1.1 skrll {"slln", "sll", "sllx"},
711 1.1 skrll {"srln", "srl", "srlx"},
712 1.1 skrll {"sran", "sra", "srax"},
713 1.1 skrll {"casn", "cas", "casx"},
714 1.1 skrll {"casna", "casa", "casxa"},
715 1.1 skrll {"clrn", "clr", "clrx"},
716 1.1 skrll {NULL, NULL, NULL},
717 1.1 skrll };
718 1.1 skrll
719 1.1 skrll /* sparc64 privileged and hyperprivileged registers. */
721 1.1 skrll
722 1.1 skrll struct priv_reg_entry
723 1.1 skrll {
724 1.1 skrll char *name;
725 1.1 skrll int regnum;
726 1.1 skrll };
727 1.1 skrll
728 1.1 skrll struct priv_reg_entry priv_reg_table[] =
729 1.1 skrll {
730 1.1 skrll {"tpc", 0},
731 1.1 skrll {"tnpc", 1},
732 1.1 skrll {"tstate", 2},
733 1.1 skrll {"tt", 3},
734 1.1 skrll {"tick", 4},
735 1.1 skrll {"tba", 5},
736 1.1 skrll {"pstate", 6},
737 1.1 skrll {"tl", 7},
738 1.1 skrll {"pil", 8},
739 1.1 skrll {"cwp", 9},
740 1.1 skrll {"cansave", 10},
741 1.1 skrll {"canrestore", 11},
742 1.1 skrll {"cleanwin", 12},
743 1.1 skrll {"otherwin", 13},
744 1.1 skrll {"wstate", 14},
745 1.1 skrll {"fq", 15},
746 1.1 skrll {"gl", 16},
747 1.1 skrll {"ver", 31},
748 1.1 skrll {"", -1}, /* End marker. */
749 1.1 skrll };
750 1.1 skrll
751 1.1 skrll struct priv_reg_entry hpriv_reg_table[] =
752 1.1 skrll {
753 1.1 skrll {"hpstate", 0},
754 1.1 skrll {"htstate", 1},
755 1.1 skrll {"hintp", 3},
756 1.1 skrll {"htba", 5},
757 1.1 skrll {"hver", 6},
758 1.1 skrll {"hstick_cmpr", 31},
759 1.1 skrll {"", -1}, /* End marker. */
760 1.1 skrll };
761 1.1 skrll
762 1.1 skrll /* v9a specific asrs. This table is ordered by initial
763 1.1 skrll letter, in reverse. */
764 1.1 skrll
765 1.1 skrll struct priv_reg_entry v9a_asr_table[] =
766 1.1 skrll {
767 1.1 skrll {"tick_cmpr", 23},
768 1.1 skrll {"sys_tick_cmpr", 25},
769 1.1 skrll {"sys_tick", 24},
770 1.1 skrll {"stick_cmpr", 25},
771 1.1 skrll {"stick", 24},
772 1.1 skrll {"softint_clear", 21},
773 1.1 skrll {"softint_set", 20},
774 1.1 skrll {"softint", 22},
775 1.1 skrll {"set_softint", 20},
776 1.1 skrll {"pic", 17},
777 1.1 skrll {"pcr", 16},
778 1.1 skrll {"gsr", 19},
779 1.1 skrll {"dcr", 18},
780 1.1 skrll {"clear_softint", 21},
781 1.1 skrll {"", -1}, /* End marker. */
782 1.1 skrll };
783 1.1 skrll
784 1.1 skrll static int
785 1.1 skrll cmp_reg_entry (const void *parg, const void *qarg)
786 1.1 skrll {
787 1.1 skrll const struct priv_reg_entry *p = (const struct priv_reg_entry *) parg;
788 1.1 skrll const struct priv_reg_entry *q = (const struct priv_reg_entry *) qarg;
789 1.1 skrll
790 1.1 skrll return strcmp (q->name, p->name);
791 1.1 skrll }
792 1.1 skrll
793 1.1 skrll /* This function is called once, at assembler startup time. It should
795 1.1 skrll set up all the tables, etc. that the MD part of the assembler will
796 1.1 skrll need. */
797 1.1 skrll
798 1.1 skrll void
799 1.1 skrll md_begin (void)
800 1.1 skrll {
801 1.1 skrll register const char *retval = NULL;
802 1.1 skrll int lose = 0;
803 1.1 skrll register unsigned int i = 0;
804 1.1 skrll
805 1.1 skrll /* We don't get a chance to initialize anything before md_parse_option
806 1.1 skrll is called, and it may not be called, so handle default initialization
807 1.1 skrll now if not already done. */
808 1.1 skrll if (! default_init_p)
809 1.1 skrll init_default_arch ();
810 1.1 skrll
811 1.1 skrll sparc_cie_data_alignment = sparc_arch_size == 64 ? -8 : -4;
812 1.1 skrll op_hash = hash_new ();
813 1.1 skrll
814 1.1 skrll while (i < (unsigned int) sparc_num_opcodes)
815 1.1 skrll {
816 1.1 skrll const char *name = sparc_opcodes[i].name;
817 1.1 skrll retval = hash_insert (op_hash, name, (void *) &sparc_opcodes[i]);
818 1.1 skrll if (retval != NULL)
819 1.1 skrll {
820 1.1 skrll as_bad (_("Internal error: can't hash `%s': %s\n"),
821 1.1 skrll sparc_opcodes[i].name, retval);
822 1.1 skrll lose = 1;
823 1.1 skrll }
824 1.1 skrll do
825 1.1 skrll {
826 1.1 skrll if (sparc_opcodes[i].match & sparc_opcodes[i].lose)
827 1.1 skrll {
828 1.1 skrll as_bad (_("Internal error: losing opcode: `%s' \"%s\"\n"),
829 1.1 skrll sparc_opcodes[i].name, sparc_opcodes[i].args);
830 1.1 skrll lose = 1;
831 1.1 skrll }
832 1.1 skrll ++i;
833 1.1 skrll }
834 1.1 skrll while (i < (unsigned int) sparc_num_opcodes
835 1.1 skrll && !strcmp (sparc_opcodes[i].name, name));
836 1.1 skrll }
837 1.1 skrll
838 1.1 skrll for (i = 0; native_op_table[i].name; i++)
839 1.1 skrll {
840 1.1 skrll const struct sparc_opcode *insn;
841 1.1 skrll char *name = ((sparc_arch_size == 32)
842 1.1 skrll ? native_op_table[i].name32
843 1.1 skrll : native_op_table[i].name64);
844 1.1 skrll insn = (struct sparc_opcode *) hash_find (op_hash, name);
845 1.1 skrll if (insn == NULL)
846 1.1 skrll {
847 1.1 skrll as_bad (_("Internal error: can't find opcode `%s' for `%s'\n"),
848 1.1 skrll name, native_op_table[i].name);
849 1.1 skrll lose = 1;
850 1.1 skrll }
851 1.1 skrll else
852 1.1 skrll {
853 1.1 skrll retval = hash_insert (op_hash, native_op_table[i].name,
854 1.1 skrll (void *) insn);
855 1.1 skrll if (retval != NULL)
856 1.1 skrll {
857 1.1 skrll as_bad (_("Internal error: can't hash `%s': %s\n"),
858 1.1 skrll sparc_opcodes[i].name, retval);
859 1.1 skrll lose = 1;
860 1.1 skrll }
861 1.1 skrll }
862 1.1 skrll }
863 1.1 skrll
864 1.1 skrll if (lose)
865 1.1 skrll as_fatal (_("Broken assembler. No assembly attempted."));
866 1.1 skrll
867 1.1 skrll qsort (priv_reg_table, sizeof (priv_reg_table) / sizeof (priv_reg_table[0]),
868 1.1 skrll sizeof (priv_reg_table[0]), cmp_reg_entry);
869 1.1 skrll
870 1.1 skrll /* If -bump, record the architecture level at which we start issuing
871 1.1 skrll warnings. The behaviour is different depending upon whether an
872 1.1 skrll architecture was explicitly specified. If it wasn't, we issue warnings
873 1.1 skrll for all upwards bumps. If it was, we don't start issuing warnings until
874 1.1 skrll we need to bump beyond the requested architecture or when we bump between
875 1.1 skrll conflicting architectures. */
876 1.1 skrll
877 1.1 skrll if (warn_on_bump
878 1.1 skrll && architecture_requested)
879 1.1 skrll {
880 1.1 skrll /* `max_architecture' records the requested architecture.
881 1.1 skrll Issue warnings if we go above it. */
882 1.1 skrll warn_after_architecture = max_architecture;
883 1.1 skrll
884 1.1 skrll /* Find the highest architecture level that doesn't conflict with
885 1.1 skrll the requested one. */
886 1.1 skrll for (max_architecture = SPARC_OPCODE_ARCH_MAX;
887 1.1 skrll max_architecture > warn_after_architecture;
888 1.1 skrll --max_architecture)
889 1.1 skrll if (! SPARC_OPCODE_CONFLICT_P (max_architecture,
890 1.1 skrll warn_after_architecture))
891 1.1 skrll break;
892 1.1 skrll }
893 1.1 skrll }
894 1.1 skrll
895 1.1 skrll /* Called after all assembly has been done. */
896 1.1 skrll
897 1.1 skrll void
898 1.1 skrll sparc_md_end (void)
899 1.1 skrll {
900 1.1 skrll unsigned long mach = bfd_mach_sparc;
901 1.1 skrll
902 1.1 skrll if (sparc_arch_size == 64)
903 1.1 skrll switch (current_architecture)
904 1.1 skrll {
905 1.1 skrll case SPARC_OPCODE_ARCH_V9A: mach = bfd_mach_sparc_v9a; break;
906 1.1 skrll case SPARC_OPCODE_ARCH_V9B: mach = bfd_mach_sparc_v9b; break;
907 1.1 skrll default: mach = bfd_mach_sparc_v9; break;
908 1.1 skrll }
909 1.1 skrll else
910 1.1 skrll switch (current_architecture)
911 1.1 skrll {
912 1.1 skrll case SPARC_OPCODE_ARCH_SPARCLET: mach = bfd_mach_sparc_sparclet; break;
913 1.1 skrll case SPARC_OPCODE_ARCH_V9: mach = bfd_mach_sparc_v8plus; break;
914 1.1 skrll case SPARC_OPCODE_ARCH_V9A: mach = bfd_mach_sparc_v8plusa; break;
915 1.1 skrll case SPARC_OPCODE_ARCH_V9B: mach = bfd_mach_sparc_v8plusb; break;
916 1.1 skrll /* The sparclite is treated like a normal sparc. Perhaps it shouldn't
917 1.1 skrll be but for now it is (since that's the way it's always been
918 1.1 skrll treated). */
919 1.1 skrll default: break;
920 1.1 skrll }
921 1.1 skrll bfd_set_arch_mach (stdoutput, bfd_arch_sparc, mach);
922 1.1 skrll }
923 1.1 skrll
924 1.1 skrll /* Return non-zero if VAL is in the range -(MAX+1) to MAX. */
926 1.1 skrll
927 1.1 skrll static inline int
928 1.1 skrll in_signed_range (bfd_signed_vma val, bfd_signed_vma max)
929 1.1 skrll {
930 1.1 skrll if (max <= 0)
931 1.1 skrll abort ();
932 1.1 skrll /* Sign-extend the value from the architecture word size, so that
933 1.1 skrll 0xffffffff is always considered -1 on sparc32. */
934 1.1 skrll if (sparc_arch_size == 32)
935 1.1 skrll {
936 1.1 skrll bfd_signed_vma sign = (bfd_signed_vma) 1 << 31;
937 1.1 skrll val = ((val & U0xffffffff) ^ sign) - sign;
938 1.1 skrll }
939 1.1 skrll if (val > max)
940 1.1 skrll return 0;
941 1.1 skrll if (val < ~max)
942 1.1 skrll return 0;
943 1.1 skrll return 1;
944 1.1 skrll }
945 1.1 skrll
946 1.1 skrll /* Return non-zero if VAL is in the range 0 to MAX. */
947 1.1 skrll
948 1.1 skrll static inline int
949 1.1 skrll in_unsigned_range (bfd_vma val, bfd_vma max)
950 1.1 skrll {
951 1.1 skrll if (val > max)
952 1.1 skrll return 0;
953 1.1 skrll return 1;
954 1.1 skrll }
955 1.1 skrll
956 1.1 skrll /* Return non-zero if VAL is in the range -(MAX/2+1) to MAX.
957 1.1 skrll (e.g. -15 to +31). */
958 1.1 skrll
959 1.1 skrll static inline int
960 1.1 skrll in_bitfield_range (bfd_signed_vma val, bfd_signed_vma max)
961 1.1 skrll {
962 1.1 skrll if (max <= 0)
963 1.1 skrll abort ();
964 1.1 skrll if (val > max)
965 1.1 skrll return 0;
966 1.1 skrll if (val < ~(max >> 1))
967 1.1 skrll return 0;
968 1.1 skrll return 1;
969 1.1 skrll }
970 1.1 skrll
971 1.1 skrll static int
972 1.1 skrll sparc_ffs (unsigned int mask)
973 1.1 skrll {
974 1.1 skrll int i;
975 1.1 skrll
976 1.1 skrll if (mask == 0)
977 1.1 skrll return -1;
978 1.1 skrll
979 1.1 skrll for (i = 0; (mask & 1) == 0; ++i)
980 1.1 skrll mask >>= 1;
981 1.1 skrll return i;
982 1.1 skrll }
983 1.1 skrll
984 1.1 skrll /* Implement big shift right. */
985 1.1 skrll static bfd_vma
986 1.1 skrll BSR (bfd_vma val, int amount)
987 1.1 skrll {
988 1.1 skrll if (sizeof (bfd_vma) <= 4 && amount >= 32)
989 1.1 skrll as_fatal (_("Support for 64-bit arithmetic not compiled in."));
990 1.1 skrll return val >> amount;
991 1.1 skrll }
992 1.1 skrll
993 1.1 skrll /* For communication between sparc_ip and get_expression. */
995 1.1 skrll static char *expr_end;
996 1.1 skrll
997 1.1 skrll /* Values for `special_case'.
998 1.1 skrll Instructions that require wierd handling because they're longer than
999 1.1 skrll 4 bytes. */
1000 1.1 skrll #define SPECIAL_CASE_NONE 0
1001 1.1 skrll #define SPECIAL_CASE_SET 1
1002 1.1 skrll #define SPECIAL_CASE_SETSW 2
1003 1.1 skrll #define SPECIAL_CASE_SETX 3
1004 1.1 skrll /* FIXME: sparc-opc.c doesn't have necessary "S" trigger to enable this. */
1005 1.1 skrll #define SPECIAL_CASE_FDIV 4
1006 1.1 skrll
1007 1.1 skrll /* Bit masks of various insns. */
1008 1.1 skrll #define NOP_INSN 0x01000000
1009 1.1 skrll #define OR_INSN 0x80100000
1010 1.1 skrll #define XOR_INSN 0x80180000
1011 1.1 skrll #define FMOVS_INSN 0x81A00020
1012 1.1 skrll #define SETHI_INSN 0x01000000
1013 1.1 skrll #define SLLX_INSN 0x81281000
1014 1.1 skrll #define SRA_INSN 0x81380000
1015 1.1 skrll
1016 1.1 skrll /* The last instruction to be assembled. */
1017 1.1 skrll static const struct sparc_opcode *last_insn;
1018 1.1 skrll /* The assembled opcode of `last_insn'. */
1019 1.1 skrll static unsigned long last_opcode;
1020 1.1 skrll
1021 1.1 skrll /* Handle the set and setuw synthetic instructions. */
1023 1.1 skrll
1024 1.1 skrll static void
1025 1.1 skrll synthetize_setuw (const struct sparc_opcode *insn)
1026 1.1 skrll {
1027 1.1 skrll int need_hi22_p = 0;
1028 1.1 skrll int rd = (the_insn.opcode & RD (~0)) >> 25;
1029 1.1 skrll
1030 1.1 skrll if (the_insn.exp.X_op == O_constant)
1031 1.1 skrll {
1032 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
1033 1.1 skrll {
1034 1.1 skrll if (sizeof (offsetT) > 4
1035 1.1 skrll && (the_insn.exp.X_add_number < 0
1036 1.1 skrll || the_insn.exp.X_add_number > (offsetT) U0xffffffff))
1037 1.1 skrll as_warn (_("set: number not in 0..4294967295 range"));
1038 1.1 skrll }
1039 1.1 skrll else
1040 1.1 skrll {
1041 1.1 skrll if (sizeof (offsetT) > 4
1042 1.1 skrll && (the_insn.exp.X_add_number < -(offsetT) U0x80000000
1043 1.1 skrll || the_insn.exp.X_add_number > (offsetT) U0xffffffff))
1044 1.1 skrll as_warn (_("set: number not in -2147483648..4294967295 range"));
1045 1.1 skrll the_insn.exp.X_add_number = (int) the_insn.exp.X_add_number;
1046 1.1 skrll }
1047 1.1 skrll }
1048 1.1 skrll
1049 1.1 skrll /* See if operand is absolute and small; skip sethi if so. */
1050 1.1 skrll if (the_insn.exp.X_op != O_constant
1051 1.1 skrll || the_insn.exp.X_add_number >= (1 << 12)
1052 1.1 skrll || the_insn.exp.X_add_number < -(1 << 12))
1053 1.1 skrll {
1054 1.1 skrll the_insn.opcode = (SETHI_INSN | RD (rd)
1055 1.1 skrll | ((the_insn.exp.X_add_number >> 10)
1056 1.1 skrll & (the_insn.exp.X_op == O_constant
1057 1.1 skrll ? 0x3fffff : 0)));
1058 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant
1059 1.1 skrll ? BFD_RELOC_HI22 : BFD_RELOC_NONE);
1060 1.1 skrll output_insn (insn, &the_insn);
1061 1.1 skrll need_hi22_p = 1;
1062 1.1 skrll }
1063 1.1 skrll
1064 1.1 skrll /* See if operand has no low-order bits; skip OR if so. */
1065 1.1 skrll if (the_insn.exp.X_op != O_constant
1066 1.1 skrll || (need_hi22_p && (the_insn.exp.X_add_number & 0x3FF) != 0)
1067 1.1 skrll || ! need_hi22_p)
1068 1.1 skrll {
1069 1.1 skrll the_insn.opcode = (OR_INSN | (need_hi22_p ? RS1 (rd) : 0)
1070 1.1 skrll | RD (rd) | IMMED
1071 1.1 skrll | (the_insn.exp.X_add_number
1072 1.1 skrll & (the_insn.exp.X_op != O_constant
1073 1.1 skrll ? 0 : need_hi22_p ? 0x3ff : 0x1fff)));
1074 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant
1075 1.1 skrll ? BFD_RELOC_LO10 : BFD_RELOC_NONE);
1076 1.1 skrll output_insn (insn, &the_insn);
1077 1.1 skrll }
1078 1.1 skrll }
1079 1.1 skrll
1080 1.1 skrll /* Handle the setsw synthetic instruction. */
1081 1.1 skrll
1082 1.1 skrll static void
1083 1.1 skrll synthetize_setsw (const struct sparc_opcode *insn)
1084 1.1 skrll {
1085 1.1 skrll int low32, rd, opc;
1086 1.1 skrll
1087 1.1 skrll rd = (the_insn.opcode & RD (~0)) >> 25;
1088 1.1 skrll
1089 1.1 skrll if (the_insn.exp.X_op != O_constant)
1090 1.1 skrll {
1091 1.1 skrll synthetize_setuw (insn);
1092 1.1 skrll
1093 1.1 skrll /* Need to sign extend it. */
1094 1.1 skrll the_insn.opcode = (SRA_INSN | RS1 (rd) | RD (rd));
1095 1.1 skrll the_insn.reloc = BFD_RELOC_NONE;
1096 1.1 skrll output_insn (insn, &the_insn);
1097 1.1 skrll return;
1098 1.1 skrll }
1099 1.1 skrll
1100 1.1 skrll if (sizeof (offsetT) > 4
1101 1.1 skrll && (the_insn.exp.X_add_number < -(offsetT) U0x80000000
1102 1.1 skrll || the_insn.exp.X_add_number > (offsetT) U0xffffffff))
1103 1.1 skrll as_warn (_("setsw: number not in -2147483648..4294967295 range"));
1104 1.1 skrll
1105 1.1 skrll low32 = the_insn.exp.X_add_number;
1106 1.1 skrll
1107 1.1 skrll if (low32 >= 0)
1108 1.1 skrll {
1109 1.1 skrll synthetize_setuw (insn);
1110 1.1 skrll return;
1111 1.1 skrll }
1112 1.1 skrll
1113 1.1 skrll opc = OR_INSN;
1114 1.1 skrll
1115 1.1 skrll the_insn.reloc = BFD_RELOC_NONE;
1116 1.1 skrll /* See if operand is absolute and small; skip sethi if so. */
1117 1.1 skrll if (low32 < -(1 << 12))
1118 1.1 skrll {
1119 1.1 skrll the_insn.opcode = (SETHI_INSN | RD (rd)
1120 1.1 skrll | (((~the_insn.exp.X_add_number) >> 10) & 0x3fffff));
1121 1.1 skrll output_insn (insn, &the_insn);
1122 1.1 skrll low32 = 0x1c00 | (low32 & 0x3ff);
1123 1.1 skrll opc = RS1 (rd) | XOR_INSN;
1124 1.1 skrll }
1125 1.1 skrll
1126 1.1 skrll the_insn.opcode = (opc | RD (rd) | IMMED
1127 1.1 skrll | (low32 & 0x1fff));
1128 1.1 skrll output_insn (insn, &the_insn);
1129 1.1 skrll }
1130 1.1 skrll
1131 1.1 skrll /* Handle the setsw synthetic instruction. */
1132 1.1 skrll
1133 1.1 skrll static void
1134 1.1 skrll synthetize_setx (const struct sparc_opcode *insn)
1135 1.1 skrll {
1136 1.1 skrll int upper32, lower32;
1137 1.1 skrll int tmpreg = (the_insn.opcode & RS1 (~0)) >> 14;
1138 1.1 skrll int dstreg = (the_insn.opcode & RD (~0)) >> 25;
1139 1.1 skrll int upper_dstreg;
1140 1.1 skrll int need_hh22_p = 0, need_hm10_p = 0, need_hi22_p = 0, need_lo10_p = 0;
1141 1.1 skrll int need_xor10_p = 0;
1142 1.1 skrll
1143 1.1 skrll #define SIGNEXT32(x) ((((x) & U0xffffffff) ^ U0x80000000) - U0x80000000)
1144 1.1 skrll lower32 = SIGNEXT32 (the_insn.exp.X_add_number);
1145 1.1 skrll upper32 = SIGNEXT32 (BSR (the_insn.exp.X_add_number, 32));
1146 1.1 skrll #undef SIGNEXT32
1147 1.1 skrll
1148 1.1 skrll upper_dstreg = tmpreg;
1149 1.1 skrll /* The tmp reg should not be the dst reg. */
1150 1.1 skrll if (tmpreg == dstreg)
1151 1.1 skrll as_warn (_("setx: temporary register same as destination register"));
1152 1.1 skrll
1153 1.1 skrll /* ??? Obviously there are other optimizations we can do
1154 1.1 skrll (e.g. sethi+shift for 0x1f0000000) and perhaps we shouldn't be
1155 1.1 skrll doing some of these. Later. If you do change things, try to
1156 1.1 skrll change all of this to be table driven as well. */
1157 1.1 skrll /* What to output depends on the number if it's constant.
1158 1.1 skrll Compute that first, then output what we've decided upon. */
1159 1.1 skrll if (the_insn.exp.X_op != O_constant)
1160 1.1 skrll {
1161 1.1 skrll if (sparc_arch_size == 32)
1162 1.1 skrll {
1163 1.1 skrll /* When arch size is 32, we want setx to be equivalent
1164 1.1 skrll to setuw for anything but constants. */
1165 1.1 skrll the_insn.exp.X_add_number &= 0xffffffff;
1166 1.1 skrll synthetize_setuw (insn);
1167 1.1 skrll return;
1168 1.1 skrll }
1169 1.1 skrll need_hh22_p = need_hm10_p = need_hi22_p = need_lo10_p = 1;
1170 1.1 skrll lower32 = 0;
1171 1.1 skrll upper32 = 0;
1172 1.1 skrll }
1173 1.1 skrll else
1174 1.1 skrll {
1175 1.1 skrll /* Reset X_add_number, we've extracted it as upper32/lower32.
1176 1.1 skrll Otherwise fixup_segment will complain about not being able to
1177 1.1 skrll write an 8 byte number in a 4 byte field. */
1178 1.1 skrll the_insn.exp.X_add_number = 0;
1179 1.1 skrll
1180 1.1 skrll /* Only need hh22 if `or' insn can't handle constant. */
1181 1.1 skrll if (upper32 < -(1 << 12) || upper32 >= (1 << 12))
1182 1.1 skrll need_hh22_p = 1;
1183 1.1 skrll
1184 1.1 skrll /* Does bottom part (after sethi) have bits? */
1185 1.1 skrll if ((need_hh22_p && (upper32 & 0x3ff) != 0)
1186 1.1 skrll /* No hh22, but does upper32 still have bits we can't set
1187 1.1 skrll from lower32? */
1188 1.1 skrll || (! need_hh22_p && upper32 != 0 && upper32 != -1))
1189 1.1 skrll need_hm10_p = 1;
1190 1.1 skrll
1191 1.1 skrll /* If the lower half is all zero, we build the upper half directly
1192 1.1 skrll into the dst reg. */
1193 1.1 skrll if (lower32 != 0
1194 1.1 skrll /* Need lower half if number is zero or 0xffffffff00000000. */
1195 1.1 skrll || (! need_hh22_p && ! need_hm10_p))
1196 1.1 skrll {
1197 1.1 skrll /* No need for sethi if `or' insn can handle constant. */
1198 1.1 skrll if (lower32 < -(1 << 12) || lower32 >= (1 << 12)
1199 1.1 skrll /* Note that we can't use a negative constant in the `or'
1200 1.1 skrll insn unless the upper 32 bits are all ones. */
1201 1.1 skrll || (lower32 < 0 && upper32 != -1)
1202 1.1 skrll || (lower32 >= 0 && upper32 == -1))
1203 1.1 skrll need_hi22_p = 1;
1204 1.1 skrll
1205 1.1 skrll if (need_hi22_p && upper32 == -1)
1206 1.1 skrll need_xor10_p = 1;
1207 1.1 skrll
1208 1.1 skrll /* Does bottom part (after sethi) have bits? */
1209 1.1 skrll else if ((need_hi22_p && (lower32 & 0x3ff) != 0)
1210 1.1 skrll /* No sethi. */
1211 1.1 skrll || (! need_hi22_p && (lower32 & 0x1fff) != 0)
1212 1.1 skrll /* Need `or' if we didn't set anything else. */
1213 1.1 skrll || (! need_hi22_p && ! need_hh22_p && ! need_hm10_p))
1214 1.1 skrll need_lo10_p = 1;
1215 1.1 skrll }
1216 1.1 skrll else
1217 1.1 skrll /* Output directly to dst reg if lower 32 bits are all zero. */
1218 1.1 skrll upper_dstreg = dstreg;
1219 1.1 skrll }
1220 1.1 skrll
1221 1.1 skrll if (!upper_dstreg && dstreg)
1222 1.1 skrll as_warn (_("setx: illegal temporary register g0"));
1223 1.1 skrll
1224 1.1 skrll if (need_hh22_p)
1225 1.1 skrll {
1226 1.1 skrll the_insn.opcode = (SETHI_INSN | RD (upper_dstreg)
1227 1.1 skrll | ((upper32 >> 10) & 0x3fffff));
1228 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant
1229 1.1 skrll ? BFD_RELOC_SPARC_HH22 : BFD_RELOC_NONE);
1230 1.1 skrll output_insn (insn, &the_insn);
1231 1.1 skrll }
1232 1.1 skrll
1233 1.1 skrll if (need_hi22_p)
1234 1.1 skrll {
1235 1.1 skrll the_insn.opcode = (SETHI_INSN | RD (dstreg)
1236 1.1 skrll | (((need_xor10_p ? ~lower32 : lower32)
1237 1.1 skrll >> 10) & 0x3fffff));
1238 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant
1239 1.1 skrll ? BFD_RELOC_SPARC_LM22 : BFD_RELOC_NONE);
1240 1.1 skrll output_insn (insn, &the_insn);
1241 1.1 skrll }
1242 1.1 skrll
1243 1.1 skrll if (need_hm10_p)
1244 1.1 skrll {
1245 1.1 skrll the_insn.opcode = (OR_INSN
1246 1.1 skrll | (need_hh22_p ? RS1 (upper_dstreg) : 0)
1247 1.1 skrll | RD (upper_dstreg)
1248 1.1 skrll | IMMED
1249 1.1 skrll | (upper32 & (need_hh22_p ? 0x3ff : 0x1fff)));
1250 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant
1251 1.1 skrll ? BFD_RELOC_SPARC_HM10 : BFD_RELOC_NONE);
1252 1.1 skrll output_insn (insn, &the_insn);
1253 1.1 skrll }
1254 1.1 skrll
1255 1.1 skrll if (need_lo10_p)
1256 1.1 skrll {
1257 1.1 skrll /* FIXME: One nice optimization to do here is to OR the low part
1258 1.1 skrll with the highpart if hi22 isn't needed and the low part is
1259 1.1 skrll positive. */
1260 1.1 skrll the_insn.opcode = (OR_INSN | (need_hi22_p ? RS1 (dstreg) : 0)
1261 1.1 skrll | RD (dstreg)
1262 1.1 skrll | IMMED
1263 1.1 skrll | (lower32 & (need_hi22_p ? 0x3ff : 0x1fff)));
1264 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant
1265 1.1 skrll ? BFD_RELOC_LO10 : BFD_RELOC_NONE);
1266 1.1 skrll output_insn (insn, &the_insn);
1267 1.1 skrll }
1268 1.1 skrll
1269 1.1 skrll /* If we needed to build the upper part, shift it into place. */
1270 1.1 skrll if (need_hh22_p || need_hm10_p)
1271 1.1 skrll {
1272 1.1 skrll the_insn.opcode = (SLLX_INSN | RS1 (upper_dstreg) | RD (upper_dstreg)
1273 1.1 skrll | IMMED | 32);
1274 1.1 skrll the_insn.reloc = BFD_RELOC_NONE;
1275 1.1 skrll output_insn (insn, &the_insn);
1276 1.1 skrll }
1277 1.1 skrll
1278 1.1 skrll /* To get -1 in upper32, we do sethi %hi(~x), r; xor r, -0x400 | x, r. */
1279 1.1 skrll if (need_xor10_p)
1280 1.1 skrll {
1281 1.1 skrll the_insn.opcode = (XOR_INSN | RS1 (dstreg) | RD (dstreg) | IMMED
1282 1.1 skrll | 0x1c00 | (lower32 & 0x3ff));
1283 1.1 skrll the_insn.reloc = BFD_RELOC_NONE;
1284 1.1 skrll output_insn (insn, &the_insn);
1285 1.1 skrll }
1286 1.1 skrll
1287 1.1 skrll /* If we needed to build both upper and lower parts, OR them together. */
1288 1.1 skrll else if ((need_hh22_p || need_hm10_p) && (need_hi22_p || need_lo10_p))
1289 1.1 skrll {
1290 1.1 skrll the_insn.opcode = (OR_INSN | RS1 (dstreg) | RS2 (upper_dstreg)
1291 1.1 skrll | RD (dstreg));
1292 1.1 skrll the_insn.reloc = BFD_RELOC_NONE;
1293 1.1 skrll output_insn (insn, &the_insn);
1294 1.1 skrll }
1295 1.1 skrll }
1296 1.1 skrll
1297 1.1 skrll /* Main entry point to assemble one instruction. */
1299 1.1 skrll
1300 1.1 skrll void
1301 1.1 skrll md_assemble (char *str)
1302 1.1 skrll {
1303 1.1 skrll const struct sparc_opcode *insn;
1304 1.1 skrll int special_case;
1305 1.1 skrll
1306 1.1 skrll know (str);
1307 1.1 skrll special_case = sparc_ip (str, &insn);
1308 1.1 skrll if (insn == NULL)
1309 1.1 skrll return;
1310 1.1 skrll
1311 1.1 skrll /* We warn about attempts to put a floating point branch in a delay slot,
1312 1.1 skrll unless the delay slot has been annulled. */
1313 1.1 skrll if (last_insn != NULL
1314 1.1 skrll && (insn->flags & F_FBR) != 0
1315 1.1 skrll && (last_insn->flags & F_DELAYED) != 0
1316 1.1 skrll /* ??? This test isn't completely accurate. We assume anything with
1317 1.1 skrll F_{UNBR,CONDBR,FBR} set is annullable. */
1318 1.1 skrll && ((last_insn->flags & (F_UNBR | F_CONDBR | F_FBR)) == 0
1319 1.1 skrll || (last_opcode & ANNUL) == 0))
1320 1.1 skrll as_warn (_("FP branch in delay slot"));
1321 1.1 skrll
1322 1.1 skrll /* SPARC before v9 requires a nop instruction between a floating
1323 1.1 skrll point instruction and a floating point branch. We insert one
1324 1.1 skrll automatically, with a warning. */
1325 1.1 skrll if (max_architecture < SPARC_OPCODE_ARCH_V9
1326 1.1 skrll && last_insn != NULL
1327 1.1 skrll && (insn->flags & F_FBR) != 0
1328 1.1 skrll && (last_insn->flags & F_FLOAT) != 0)
1329 1.1 skrll {
1330 1.1 skrll struct sparc_it nop_insn;
1331 1.1 skrll
1332 1.1 skrll nop_insn.opcode = NOP_INSN;
1333 1.1 skrll nop_insn.reloc = BFD_RELOC_NONE;
1334 1.1 skrll output_insn (insn, &nop_insn);
1335 1.1 skrll as_warn (_("FP branch preceded by FP instruction; NOP inserted"));
1336 1.1 skrll }
1337 1.1 skrll
1338 1.1 skrll switch (special_case)
1339 1.1 skrll {
1340 1.1 skrll case SPECIAL_CASE_NONE:
1341 1.1 skrll /* Normal insn. */
1342 1.1 skrll output_insn (insn, &the_insn);
1343 1.1 skrll break;
1344 1.1 skrll
1345 1.1 skrll case SPECIAL_CASE_SETSW:
1346 1.1 skrll synthetize_setsw (insn);
1347 1.1 skrll break;
1348 1.1 skrll
1349 1.1 skrll case SPECIAL_CASE_SET:
1350 1.1 skrll synthetize_setuw (insn);
1351 1.1 skrll break;
1352 1.1 skrll
1353 1.1 skrll case SPECIAL_CASE_SETX:
1354 1.1 skrll synthetize_setx (insn);
1355 1.1 skrll break;
1356 1.1 skrll
1357 1.1 skrll case SPECIAL_CASE_FDIV:
1358 1.1 skrll {
1359 1.1.1.2 christos int rd = (the_insn.opcode >> 25) & 0x1f;
1360 1.1 skrll
1361 1.1 skrll output_insn (insn, &the_insn);
1362 1.1 skrll
1363 1.1 skrll /* According to information leaked from Sun, the "fdiv" instructions
1364 1.1 skrll on early SPARC machines would produce incorrect results sometimes.
1365 1.1 skrll The workaround is to add an fmovs of the destination register to
1366 1.1 skrll itself just after the instruction. This was true on machines
1367 1.1 skrll with Weitek 1165 float chips, such as the Sun-4/260 and /280. */
1368 1.1 skrll gas_assert (the_insn.reloc == BFD_RELOC_NONE);
1369 1.1 skrll the_insn.opcode = FMOVS_INSN | rd | RD (rd);
1370 1.1 skrll output_insn (insn, &the_insn);
1371 1.1 skrll return;
1372 1.1 skrll }
1373 1.1 skrll
1374 1.1 skrll default:
1375 1.1 skrll as_fatal (_("failed special case insn sanity check"));
1376 1.1 skrll }
1377 1.1 skrll }
1378 1.1 skrll
1379 1.1 skrll /* Subroutine of md_assemble to do the actual parsing. */
1380 1.1 skrll
1381 1.1 skrll static int
1382 1.1 skrll sparc_ip (char *str, const struct sparc_opcode **pinsn)
1383 1.1 skrll {
1384 1.1 skrll char *error_message = "";
1385 1.1 skrll char *s;
1386 1.1 skrll const char *args;
1387 1.1 skrll char c;
1388 1.1 skrll const struct sparc_opcode *insn;
1389 1.1 skrll char *argsStart;
1390 1.1 skrll unsigned long opcode;
1391 1.1 skrll unsigned int mask = 0;
1392 1.1 skrll int match = 0;
1393 1.1 skrll int comma = 0;
1394 1.1 skrll int v9_arg_p;
1395 1.1 skrll int special_case = SPECIAL_CASE_NONE;
1396 1.1 skrll
1397 1.1 skrll s = str;
1398 1.1 skrll if (ISLOWER (*s))
1399 1.1 skrll {
1400 1.1 skrll do
1401 1.1 skrll ++s;
1402 1.1 skrll while (ISLOWER (*s) || ISDIGIT (*s));
1403 1.1 skrll }
1404 1.1 skrll
1405 1.1 skrll switch (*s)
1406 1.1 skrll {
1407 1.1 skrll case '\0':
1408 1.1 skrll break;
1409 1.1 skrll
1410 1.1 skrll case ',':
1411 1.1 skrll comma = 1;
1412 1.1 skrll /* Fall through. */
1413 1.1 skrll
1414 1.1 skrll case ' ':
1415 1.1 skrll *s++ = '\0';
1416 1.1 skrll break;
1417 1.1 skrll
1418 1.1 skrll default:
1419 1.1 skrll as_bad (_("Unknown opcode: `%s'"), str);
1420 1.1 skrll *pinsn = NULL;
1421 1.1 skrll return special_case;
1422 1.1 skrll }
1423 1.1 skrll insn = (struct sparc_opcode *) hash_find (op_hash, str);
1424 1.1 skrll *pinsn = insn;
1425 1.1 skrll if (insn == NULL)
1426 1.1 skrll {
1427 1.1 skrll as_bad (_("Unknown opcode: `%s'"), str);
1428 1.1 skrll return special_case;
1429 1.1 skrll }
1430 1.1 skrll if (comma)
1431 1.1 skrll {
1432 1.1 skrll *--s = ',';
1433 1.1 skrll }
1434 1.1 skrll
1435 1.1 skrll argsStart = s;
1436 1.1 skrll for (;;)
1437 1.1 skrll {
1438 1.1 skrll opcode = insn->match;
1439 1.1 skrll memset (&the_insn, '\0', sizeof (the_insn));
1440 1.1 skrll the_insn.reloc = BFD_RELOC_NONE;
1441 1.1 skrll v9_arg_p = 0;
1442 1.1 skrll
1443 1.1 skrll /* Build the opcode, checking as we go to make sure that the
1444 1.1 skrll operands match. */
1445 1.1 skrll for (args = insn->args;; ++args)
1446 1.1 skrll {
1447 1.1 skrll switch (*args)
1448 1.1 skrll {
1449 1.1.1.2 christos case 'K':
1450 1.1 skrll {
1451 1.1 skrll int kmask = 0;
1452 1.1.1.2 christos
1453 1.1 skrll /* Parse a series of masks. */
1454 1.1 skrll if (*s == '#')
1455 1.1 skrll {
1456 1.1 skrll while (*s == '#')
1457 1.1.1.2 christos {
1458 1.1 skrll int jmask;
1459 1.1 skrll
1460 1.1 skrll if (! parse_keyword_arg (sparc_encode_membar, &s,
1461 1.1 skrll &jmask))
1462 1.1 skrll {
1463 1.1 skrll error_message = _(": invalid membar mask name");
1464 1.1 skrll goto error;
1465 1.1 skrll }
1466 1.1 skrll kmask |= jmask;
1467 1.1 skrll while (*s == ' ')
1468 1.1 skrll ++s;
1469 1.1 skrll if (*s == '|' || *s == '+')
1470 1.1 skrll ++s;
1471 1.1 skrll while (*s == ' ')
1472 1.1 skrll ++s;
1473 1.1 skrll }
1474 1.1 skrll }
1475 1.1 skrll else
1476 1.1 skrll {
1477 1.1 skrll if (! parse_const_expr_arg (&s, &kmask))
1478 1.1 skrll {
1479 1.1 skrll error_message = _(": invalid membar mask expression");
1480 1.1 skrll goto error;
1481 1.1 skrll }
1482 1.1 skrll if (kmask < 0 || kmask > 127)
1483 1.1 skrll {
1484 1.1 skrll error_message = _(": invalid membar mask number");
1485 1.1 skrll goto error;
1486 1.1 skrll }
1487 1.1 skrll }
1488 1.1 skrll
1489 1.1 skrll opcode |= MEMBAR (kmask);
1490 1.1 skrll continue;
1491 1.1 skrll }
1492 1.1 skrll
1493 1.1 skrll case '3':
1494 1.1 skrll {
1495 1.1 skrll int smask = 0;
1496 1.1 skrll
1497 1.1 skrll if (! parse_const_expr_arg (&s, &smask))
1498 1.1 skrll {
1499 1.1 skrll error_message = _(": invalid siam mode expression");
1500 1.1 skrll goto error;
1501 1.1 skrll }
1502 1.1 skrll if (smask < 0 || smask > 7)
1503 1.1 skrll {
1504 1.1 skrll error_message = _(": invalid siam mode number");
1505 1.1 skrll goto error;
1506 1.1 skrll }
1507 1.1 skrll opcode |= smask;
1508 1.1 skrll continue;
1509 1.1 skrll }
1510 1.1 skrll
1511 1.1 skrll case '*':
1512 1.1 skrll {
1513 1.1 skrll int fcn = 0;
1514 1.1 skrll
1515 1.1 skrll /* Parse a prefetch function. */
1516 1.1 skrll if (*s == '#')
1517 1.1 skrll {
1518 1.1 skrll if (! parse_keyword_arg (sparc_encode_prefetch, &s, &fcn))
1519 1.1 skrll {
1520 1.1 skrll error_message = _(": invalid prefetch function name");
1521 1.1 skrll goto error;
1522 1.1 skrll }
1523 1.1 skrll }
1524 1.1 skrll else
1525 1.1 skrll {
1526 1.1 skrll if (! parse_const_expr_arg (&s, &fcn))
1527 1.1 skrll {
1528 1.1 skrll error_message = _(": invalid prefetch function expression");
1529 1.1 skrll goto error;
1530 1.1 skrll }
1531 1.1 skrll if (fcn < 0 || fcn > 31)
1532 1.1 skrll {
1533 1.1 skrll error_message = _(": invalid prefetch function number");
1534 1.1 skrll goto error;
1535 1.1 skrll }
1536 1.1 skrll }
1537 1.1 skrll opcode |= RD (fcn);
1538 1.1 skrll continue;
1539 1.1 skrll }
1540 1.1 skrll
1541 1.1 skrll case '!':
1542 1.1 skrll case '?':
1543 1.1 skrll /* Parse a sparc64 privileged register. */
1544 1.1 skrll if (*s == '%')
1545 1.1 skrll {
1546 1.1 skrll struct priv_reg_entry *p = priv_reg_table;
1547 1.1 skrll unsigned int len = 9999999; /* Init to make gcc happy. */
1548 1.1 skrll
1549 1.1 skrll s += 1;
1550 1.1 skrll while (p->name[0] > s[0])
1551 1.1 skrll p++;
1552 1.1 skrll while (p->name[0] == s[0])
1553 1.1 skrll {
1554 1.1 skrll len = strlen (p->name);
1555 1.1 skrll if (strncmp (p->name, s, len) == 0)
1556 1.1 skrll break;
1557 1.1 skrll p++;
1558 1.1 skrll }
1559 1.1 skrll if (p->name[0] != s[0])
1560 1.1 skrll {
1561 1.1 skrll error_message = _(": unrecognizable privileged register");
1562 1.1 skrll goto error;
1563 1.1 skrll }
1564 1.1 skrll if (*args == '?')
1565 1.1 skrll opcode |= (p->regnum << 14);
1566 1.1 skrll else
1567 1.1 skrll opcode |= (p->regnum << 25);
1568 1.1 skrll s += len;
1569 1.1 skrll continue;
1570 1.1 skrll }
1571 1.1 skrll else
1572 1.1 skrll {
1573 1.1 skrll error_message = _(": unrecognizable privileged register");
1574 1.1 skrll goto error;
1575 1.1 skrll }
1576 1.1 skrll
1577 1.1 skrll case '$':
1578 1.1 skrll case '%':
1579 1.1 skrll /* Parse a sparc64 hyperprivileged register. */
1580 1.1 skrll if (*s == '%')
1581 1.1 skrll {
1582 1.1 skrll struct priv_reg_entry *p = hpriv_reg_table;
1583 1.1 skrll unsigned int len = 9999999; /* Init to make gcc happy. */
1584 1.1 skrll
1585 1.1 skrll s += 1;
1586 1.1 skrll while (p->name[0] > s[0])
1587 1.1 skrll p++;
1588 1.1 skrll while (p->name[0] == s[0])
1589 1.1 skrll {
1590 1.1 skrll len = strlen (p->name);
1591 1.1 skrll if (strncmp (p->name, s, len) == 0)
1592 1.1 skrll break;
1593 1.1 skrll p++;
1594 1.1 skrll }
1595 1.1 skrll if (p->name[0] != s[0])
1596 1.1 skrll {
1597 1.1 skrll error_message = _(": unrecognizable hyperprivileged register");
1598 1.1 skrll goto error;
1599 1.1 skrll }
1600 1.1 skrll if (*args == '$')
1601 1.1 skrll opcode |= (p->regnum << 14);
1602 1.1 skrll else
1603 1.1 skrll opcode |= (p->regnum << 25);
1604 1.1 skrll s += len;
1605 1.1 skrll continue;
1606 1.1 skrll }
1607 1.1 skrll else
1608 1.1 skrll {
1609 1.1 skrll error_message = _(": unrecognizable hyperprivileged register");
1610 1.1 skrll goto error;
1611 1.1 skrll }
1612 1.1 skrll
1613 1.1 skrll case '_':
1614 1.1 skrll case '/':
1615 1.1 skrll /* Parse a v9a/v9b ancillary state register. */
1616 1.1 skrll if (*s == '%')
1617 1.1 skrll {
1618 1.1 skrll struct priv_reg_entry *p = v9a_asr_table;
1619 1.1 skrll unsigned int len = 9999999; /* Init to make gcc happy. */
1620 1.1 skrll
1621 1.1 skrll s += 1;
1622 1.1 skrll while (p->name[0] > s[0])
1623 1.1 skrll p++;
1624 1.1 skrll while (p->name[0] == s[0])
1625 1.1 skrll {
1626 1.1 skrll len = strlen (p->name);
1627 1.1 skrll if (strncmp (p->name, s, len) == 0)
1628 1.1 skrll break;
1629 1.1 skrll p++;
1630 1.1 skrll }
1631 1.1 skrll if (p->name[0] != s[0])
1632 1.1 skrll {
1633 1.1 skrll error_message = _(": unrecognizable v9a or v9b ancillary state register");
1634 1.1 skrll goto error;
1635 1.1 skrll }
1636 1.1 skrll if (*args == '/' && (p->regnum == 20 || p->regnum == 21))
1637 1.1 skrll {
1638 1.1 skrll error_message = _(": rd on write only ancillary state register");
1639 1.1 skrll goto error;
1640 1.1 skrll }
1641 1.1 skrll if (p->regnum >= 24
1642 1.1 skrll && (insn->architecture
1643 1.1 skrll & SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A)))
1644 1.1 skrll {
1645 1.1 skrll /* %sys_tick and %sys_tick_cmpr are v9bnotv9a */
1646 1.1 skrll error_message = _(": unrecognizable v9a ancillary state register");
1647 1.1 skrll goto error;
1648 1.1 skrll }
1649 1.1 skrll if (*args == '/')
1650 1.1 skrll opcode |= (p->regnum << 14);
1651 1.1 skrll else
1652 1.1 skrll opcode |= (p->regnum << 25);
1653 1.1 skrll s += len;
1654 1.1 skrll continue;
1655 1.1 skrll }
1656 1.1 skrll else
1657 1.1 skrll {
1658 1.1 skrll error_message = _(": unrecognizable v9a or v9b ancillary state register");
1659 1.1 skrll goto error;
1660 1.1 skrll }
1661 1.1 skrll
1662 1.1 skrll case 'M':
1663 1.1 skrll case 'm':
1664 1.1 skrll if (strncmp (s, "%asr", 4) == 0)
1665 1.1 skrll {
1666 1.1 skrll s += 4;
1667 1.1 skrll
1668 1.1 skrll if (ISDIGIT (*s))
1669 1.1 skrll {
1670 1.1 skrll long num = 0;
1671 1.1 skrll
1672 1.1 skrll while (ISDIGIT (*s))
1673 1.1 skrll {
1674 1.1 skrll num = num * 10 + *s - '0';
1675 1.1 skrll ++s;
1676 1.1 skrll }
1677 1.1 skrll
1678 1.1 skrll if (current_architecture >= SPARC_OPCODE_ARCH_V9)
1679 1.1 skrll {
1680 1.1 skrll if (num < 16 || 31 < num)
1681 1.1 skrll {
1682 1.1 skrll error_message = _(": asr number must be between 16 and 31");
1683 1.1 skrll goto error;
1684 1.1 skrll }
1685 1.1 skrll }
1686 1.1 skrll else
1687 1.1 skrll {
1688 1.1 skrll if (num < 0 || 31 < num)
1689 1.1 skrll {
1690 1.1 skrll error_message = _(": asr number must be between 0 and 31");
1691 1.1 skrll goto error;
1692 1.1 skrll }
1693 1.1 skrll }
1694 1.1 skrll
1695 1.1 skrll opcode |= (*args == 'M' ? RS1 (num) : RD (num));
1696 1.1 skrll continue;
1697 1.1 skrll }
1698 1.1 skrll else
1699 1.1 skrll {
1700 1.1 skrll error_message = _(": expecting %asrN");
1701 1.1 skrll goto error;
1702 1.1 skrll }
1703 1.1 skrll } /* if %asr */
1704 1.1 skrll break;
1705 1.1 skrll
1706 1.1 skrll case 'I':
1707 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_11;
1708 1.1 skrll goto immediate;
1709 1.1 skrll
1710 1.1 skrll case 'j':
1711 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_10;
1712 1.1 skrll goto immediate;
1713 1.1 skrll
1714 1.1 skrll case 'X':
1715 1.1 skrll /* V8 systems don't understand BFD_RELOC_SPARC_5. */
1716 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
1717 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_5;
1718 1.1 skrll else
1719 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC13;
1720 1.1 skrll /* These fields are unsigned, but for upward compatibility,
1721 1.1 skrll allow negative values as well. */
1722 1.1 skrll goto immediate;
1723 1.1 skrll
1724 1.1 skrll case 'Y':
1725 1.1 skrll /* V8 systems don't understand BFD_RELOC_SPARC_6. */
1726 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
1727 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_6;
1728 1.1 skrll else
1729 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC13;
1730 1.1 skrll /* These fields are unsigned, but for upward compatibility,
1731 1.1 skrll allow negative values as well. */
1732 1.1 skrll goto immediate;
1733 1.1 skrll
1734 1.1 skrll case 'k':
1735 1.1 skrll the_insn.reloc = /* RELOC_WDISP2_14 */ BFD_RELOC_SPARC_WDISP16;
1736 1.1 skrll the_insn.pcrel = 1;
1737 1.1 skrll goto immediate;
1738 1.1 skrll
1739 1.1 skrll case 'G':
1740 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_WDISP19;
1741 1.1 skrll the_insn.pcrel = 1;
1742 1.1 skrll goto immediate;
1743 1.1 skrll
1744 1.1 skrll case 'N':
1745 1.1 skrll if (*s == 'p' && s[1] == 'n')
1746 1.1 skrll {
1747 1.1 skrll s += 2;
1748 1.1 skrll continue;
1749 1.1 skrll }
1750 1.1 skrll break;
1751 1.1 skrll
1752 1.1 skrll case 'T':
1753 1.1 skrll if (*s == 'p' && s[1] == 't')
1754 1.1 skrll {
1755 1.1 skrll s += 2;
1756 1.1 skrll continue;
1757 1.1 skrll }
1758 1.1 skrll break;
1759 1.1 skrll
1760 1.1 skrll case 'z':
1761 1.1 skrll if (*s == ' ')
1762 1.1 skrll {
1763 1.1 skrll ++s;
1764 1.1 skrll }
1765 1.1 skrll if (strncmp (s, "%icc", 4) == 0)
1766 1.1 skrll {
1767 1.1 skrll s += 4;
1768 1.1 skrll continue;
1769 1.1 skrll }
1770 1.1 skrll break;
1771 1.1 skrll
1772 1.1 skrll case 'Z':
1773 1.1 skrll if (*s == ' ')
1774 1.1 skrll {
1775 1.1 skrll ++s;
1776 1.1 skrll }
1777 1.1 skrll if (strncmp (s, "%xcc", 4) == 0)
1778 1.1 skrll {
1779 1.1 skrll s += 4;
1780 1.1 skrll continue;
1781 1.1 skrll }
1782 1.1 skrll break;
1783 1.1 skrll
1784 1.1 skrll case '6':
1785 1.1 skrll if (*s == ' ')
1786 1.1 skrll {
1787 1.1 skrll ++s;
1788 1.1 skrll }
1789 1.1 skrll if (strncmp (s, "%fcc0", 5) == 0)
1790 1.1 skrll {
1791 1.1 skrll s += 5;
1792 1.1 skrll continue;
1793 1.1 skrll }
1794 1.1 skrll break;
1795 1.1 skrll
1796 1.1 skrll case '7':
1797 1.1 skrll if (*s == ' ')
1798 1.1 skrll {
1799 1.1 skrll ++s;
1800 1.1 skrll }
1801 1.1 skrll if (strncmp (s, "%fcc1", 5) == 0)
1802 1.1 skrll {
1803 1.1 skrll s += 5;
1804 1.1 skrll continue;
1805 1.1 skrll }
1806 1.1 skrll break;
1807 1.1 skrll
1808 1.1 skrll case '8':
1809 1.1 skrll if (*s == ' ')
1810 1.1 skrll {
1811 1.1 skrll ++s;
1812 1.1 skrll }
1813 1.1 skrll if (strncmp (s, "%fcc2", 5) == 0)
1814 1.1 skrll {
1815 1.1 skrll s += 5;
1816 1.1 skrll continue;
1817 1.1 skrll }
1818 1.1 skrll break;
1819 1.1 skrll
1820 1.1 skrll case '9':
1821 1.1 skrll if (*s == ' ')
1822 1.1 skrll {
1823 1.1 skrll ++s;
1824 1.1 skrll }
1825 1.1 skrll if (strncmp (s, "%fcc3", 5) == 0)
1826 1.1 skrll {
1827 1.1 skrll s += 5;
1828 1.1 skrll continue;
1829 1.1 skrll }
1830 1.1 skrll break;
1831 1.1 skrll
1832 1.1 skrll case 'P':
1833 1.1 skrll if (strncmp (s, "%pc", 3) == 0)
1834 1.1 skrll {
1835 1.1 skrll s += 3;
1836 1.1 skrll continue;
1837 1.1 skrll }
1838 1.1 skrll break;
1839 1.1 skrll
1840 1.1 skrll case 'W':
1841 1.1 skrll if (strncmp (s, "%tick", 5) == 0)
1842 1.1 skrll {
1843 1.1 skrll s += 5;
1844 1.1 skrll continue;
1845 1.1 skrll }
1846 1.1 skrll break;
1847 1.1 skrll
1848 1.1 skrll case '\0': /* End of args. */
1849 1.1 skrll if (s[0] == ',' && s[1] == '%')
1850 1.1 skrll {
1851 1.1 skrll static const struct ops
1852 1.1 skrll {
1853 1.1 skrll /* The name as it appears in assembler. */
1854 1.1 skrll char *name;
1855 1.1 skrll /* strlen (name), precomputed for speed */
1856 1.1 skrll int len;
1857 1.1 skrll /* The reloc this pseudo-op translates to. */
1858 1.1 skrll int reloc;
1859 1.1 skrll /* 1 if tls call. */
1860 1.1 skrll int tls_call;
1861 1.1 skrll }
1862 1.1 skrll ops[] =
1863 1.1 skrll {
1864 1.1 skrll { "tgd_add", 7, BFD_RELOC_SPARC_TLS_GD_ADD, 0 },
1865 1.1 skrll { "tgd_call", 8, BFD_RELOC_SPARC_TLS_GD_CALL, 1 },
1866 1.1 skrll { "tldm_add", 8, BFD_RELOC_SPARC_TLS_LDM_ADD, 0 },
1867 1.1 skrll { "tldm_call", 9, BFD_RELOC_SPARC_TLS_LDM_CALL, 1 },
1868 1.1 skrll { "tldo_add", 8, BFD_RELOC_SPARC_TLS_LDO_ADD, 0 },
1869 1.1 skrll { "tie_ldx", 7, BFD_RELOC_SPARC_TLS_IE_LDX, 0 },
1870 1.1 skrll { "tie_ld", 6, BFD_RELOC_SPARC_TLS_IE_LD, 0 },
1871 1.1 skrll { "tie_add", 7, BFD_RELOC_SPARC_TLS_IE_ADD, 0 },
1872 1.1 skrll { "gdop", 4, BFD_RELOC_SPARC_GOTDATA_OP, 0 },
1873 1.1 skrll { NULL, 0, 0, 0 }
1874 1.1 skrll };
1875 1.1 skrll const struct ops *o;
1876 1.1 skrll char *s1;
1877 1.1 skrll int npar = 0;
1878 1.1 skrll
1879 1.1 skrll for (o = ops; o->name; o++)
1880 1.1 skrll if (strncmp (s + 2, o->name, o->len) == 0)
1881 1.1 skrll break;
1882 1.1 skrll if (o->name == NULL)
1883 1.1 skrll break;
1884 1.1 skrll
1885 1.1 skrll if (s[o->len + 2] != '(')
1886 1.1 skrll {
1887 1.1 skrll as_bad (_("Illegal operands: %%%s requires arguments in ()"), o->name);
1888 1.1 skrll return special_case;
1889 1.1 skrll }
1890 1.1 skrll
1891 1.1 skrll if (! o->tls_call && the_insn.reloc != BFD_RELOC_NONE)
1892 1.1 skrll {
1893 1.1 skrll as_bad (_("Illegal operands: %%%s cannot be used together with other relocs in the insn ()"),
1894 1.1 skrll o->name);
1895 1.1 skrll return special_case;
1896 1.1 skrll }
1897 1.1 skrll
1898 1.1 skrll if (o->tls_call
1899 1.1 skrll && (the_insn.reloc != BFD_RELOC_32_PCREL_S2
1900 1.1 skrll || the_insn.exp.X_add_number != 0
1901 1.1 skrll || the_insn.exp.X_add_symbol
1902 1.1 skrll != symbol_find_or_make ("__tls_get_addr")))
1903 1.1 skrll {
1904 1.1 skrll as_bad (_("Illegal operands: %%%s can be only used with call __tls_get_addr"),
1905 1.1 skrll o->name);
1906 1.1 skrll return special_case;
1907 1.1 skrll }
1908 1.1 skrll
1909 1.1 skrll the_insn.reloc = o->reloc;
1910 1.1 skrll memset (&the_insn.exp, 0, sizeof (the_insn.exp));
1911 1.1 skrll s += o->len + 3;
1912 1.1 skrll
1913 1.1 skrll for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++)
1914 1.1 skrll if (*s1 == '(')
1915 1.1 skrll npar++;
1916 1.1 skrll else if (*s1 == ')')
1917 1.1 skrll {
1918 1.1 skrll if (!npar)
1919 1.1 skrll break;
1920 1.1 skrll npar--;
1921 1.1 skrll }
1922 1.1 skrll
1923 1.1 skrll if (*s1 != ')')
1924 1.1 skrll {
1925 1.1 skrll as_bad (_("Illegal operands: %%%s requires arguments in ()"), o->name);
1926 1.1 skrll return special_case;
1927 1.1 skrll }
1928 1.1 skrll
1929 1.1 skrll *s1 = '\0';
1930 1.1 skrll (void) get_expression (s);
1931 1.1 skrll *s1 = ')';
1932 1.1 skrll s = s1 + 1;
1933 1.1 skrll }
1934 1.1 skrll if (*s == '\0')
1935 1.1 skrll match = 1;
1936 1.1 skrll break;
1937 1.1 skrll
1938 1.1 skrll case '+':
1939 1.1 skrll if (*s == '+')
1940 1.1 skrll {
1941 1.1 skrll ++s;
1942 1.1 skrll continue;
1943 1.1 skrll }
1944 1.1 skrll if (*s == '-')
1945 1.1 skrll {
1946 1.1 skrll continue;
1947 1.1 skrll }
1948 1.1 skrll break;
1949 1.1 skrll
1950 1.1 skrll case '[': /* These must match exactly. */
1951 1.1 skrll case ']':
1952 1.1 skrll case ',':
1953 1.1 skrll case ' ':
1954 1.1 skrll if (*s++ == *args)
1955 1.1 skrll continue;
1956 1.1 skrll break;
1957 1.1 skrll
1958 1.1 skrll case '#': /* Must be at least one digit. */
1959 1.1 skrll if (ISDIGIT (*s++))
1960 1.1 skrll {
1961 1.1 skrll while (ISDIGIT (*s))
1962 1.1 skrll {
1963 1.1 skrll ++s;
1964 1.1 skrll }
1965 1.1 skrll continue;
1966 1.1 skrll }
1967 1.1 skrll break;
1968 1.1 skrll
1969 1.1 skrll case 'C': /* Coprocessor state register. */
1970 1.1 skrll if (strncmp (s, "%csr", 4) == 0)
1971 1.1 skrll {
1972 1.1 skrll s += 4;
1973 1.1 skrll continue;
1974 1.1 skrll }
1975 1.1 skrll break;
1976 1.1 skrll
1977 1.1 skrll case 'b': /* Next operand is a coprocessor register. */
1978 1.1 skrll case 'c':
1979 1.1 skrll case 'D':
1980 1.1 skrll if (*s++ == '%' && *s++ == 'c' && ISDIGIT (*s))
1981 1.1 skrll {
1982 1.1 skrll mask = *s++;
1983 1.1 skrll if (ISDIGIT (*s))
1984 1.1 skrll {
1985 1.1 skrll mask = 10 * (mask - '0') + (*s++ - '0');
1986 1.1 skrll if (mask >= 32)
1987 1.1 skrll {
1988 1.1 skrll break;
1989 1.1 skrll }
1990 1.1 skrll }
1991 1.1 skrll else
1992 1.1 skrll {
1993 1.1 skrll mask -= '0';
1994 1.1 skrll }
1995 1.1 skrll switch (*args)
1996 1.1 skrll {
1997 1.1 skrll
1998 1.1 skrll case 'b':
1999 1.1 skrll opcode |= mask << 14;
2000 1.1 skrll continue;
2001 1.1 skrll
2002 1.1 skrll case 'c':
2003 1.1 skrll opcode |= mask;
2004 1.1 skrll continue;
2005 1.1 skrll
2006 1.1 skrll case 'D':
2007 1.1 skrll opcode |= mask << 25;
2008 1.1 skrll continue;
2009 1.1 skrll }
2010 1.1 skrll }
2011 1.1 skrll break;
2012 1.1 skrll
2013 1.1 skrll case 'r': /* next operand must be a register */
2014 1.1 skrll case 'O':
2015 1.1 skrll case '1':
2016 1.1 skrll case '2':
2017 1.1 skrll case 'd':
2018 1.1 skrll if (*s++ == '%')
2019 1.1 skrll {
2020 1.1 skrll switch (c = *s++)
2021 1.1 skrll {
2022 1.1 skrll
2023 1.1 skrll case 'f': /* frame pointer */
2024 1.1 skrll if (*s++ == 'p')
2025 1.1 skrll {
2026 1.1 skrll mask = 0x1e;
2027 1.1 skrll break;
2028 1.1 skrll }
2029 1.1 skrll goto error;
2030 1.1 skrll
2031 1.1 skrll case 'g': /* global register */
2032 1.1 skrll c = *s++;
2033 1.1 skrll if (isoctal (c))
2034 1.1 skrll {
2035 1.1 skrll mask = c - '0';
2036 1.1 skrll break;
2037 1.1 skrll }
2038 1.1 skrll goto error;
2039 1.1 skrll
2040 1.1 skrll case 'i': /* in register */
2041 1.1 skrll c = *s++;
2042 1.1 skrll if (isoctal (c))
2043 1.1 skrll {
2044 1.1 skrll mask = c - '0' + 24;
2045 1.1 skrll break;
2046 1.1 skrll }
2047 1.1 skrll goto error;
2048 1.1 skrll
2049 1.1 skrll case 'l': /* local register */
2050 1.1 skrll c = *s++;
2051 1.1 skrll if (isoctal (c))
2052 1.1 skrll {
2053 1.1 skrll mask = (c - '0' + 16);
2054 1.1 skrll break;
2055 1.1 skrll }
2056 1.1 skrll goto error;
2057 1.1 skrll
2058 1.1 skrll case 'o': /* out register */
2059 1.1 skrll c = *s++;
2060 1.1 skrll if (isoctal (c))
2061 1.1 skrll {
2062 1.1 skrll mask = (c - '0' + 8);
2063 1.1 skrll break;
2064 1.1 skrll }
2065 1.1 skrll goto error;
2066 1.1 skrll
2067 1.1 skrll case 's': /* stack pointer */
2068 1.1 skrll if (*s++ == 'p')
2069 1.1 skrll {
2070 1.1 skrll mask = 0xe;
2071 1.1 skrll break;
2072 1.1 skrll }
2073 1.1 skrll goto error;
2074 1.1 skrll
2075 1.1 skrll case 'r': /* any register */
2076 1.1 skrll if (!ISDIGIT ((c = *s++)))
2077 1.1 skrll {
2078 1.1 skrll goto error;
2079 1.1 skrll }
2080 1.1 skrll /* FALLTHROUGH */
2081 1.1 skrll case '0':
2082 1.1 skrll case '1':
2083 1.1 skrll case '2':
2084 1.1 skrll case '3':
2085 1.1 skrll case '4':
2086 1.1 skrll case '5':
2087 1.1 skrll case '6':
2088 1.1 skrll case '7':
2089 1.1 skrll case '8':
2090 1.1 skrll case '9':
2091 1.1 skrll if (ISDIGIT (*s))
2092 1.1 skrll {
2093 1.1 skrll if ((c = 10 * (c - '0') + (*s++ - '0')) >= 32)
2094 1.1 skrll {
2095 1.1 skrll goto error;
2096 1.1 skrll }
2097 1.1 skrll }
2098 1.1 skrll else
2099 1.1 skrll {
2100 1.1 skrll c -= '0';
2101 1.1 skrll }
2102 1.1 skrll mask = c;
2103 1.1 skrll break;
2104 1.1 skrll
2105 1.1 skrll default:
2106 1.1 skrll goto error;
2107 1.1 skrll }
2108 1.1 skrll
2109 1.1 skrll if ((mask & ~1) == 2 && sparc_arch_size == 64
2110 1.1 skrll && no_undeclared_regs && ! globals[mask])
2111 1.1 skrll as_bad (_("detected global register use not covered by .register pseudo-op"));
2112 1.1 skrll
2113 1.1 skrll /* Got the register, now figure out where
2114 1.1 skrll it goes in the opcode. */
2115 1.1 skrll switch (*args)
2116 1.1 skrll {
2117 1.1 skrll case '1':
2118 1.1 skrll opcode |= mask << 14;
2119 1.1 skrll continue;
2120 1.1 skrll
2121 1.1 skrll case '2':
2122 1.1 skrll opcode |= mask;
2123 1.1 skrll continue;
2124 1.1 skrll
2125 1.1 skrll case 'd':
2126 1.1 skrll opcode |= mask << 25;
2127 1.1 skrll continue;
2128 1.1 skrll
2129 1.1 skrll case 'r':
2130 1.1 skrll opcode |= (mask << 25) | (mask << 14);
2131 1.1 skrll continue;
2132 1.1 skrll
2133 1.1 skrll case 'O':
2134 1.1 skrll opcode |= (mask << 25) | (mask << 0);
2135 1.1 skrll continue;
2136 1.1 skrll }
2137 1.1 skrll }
2138 1.1 skrll break;
2139 1.1 skrll
2140 1.1 skrll case 'e': /* next operand is a floating point register */
2141 1.1 skrll case 'v':
2142 1.1 skrll case 'V':
2143 1.1 skrll
2144 1.1 skrll case 'f':
2145 1.1 skrll case 'B':
2146 1.1 skrll case 'R':
2147 1.1 skrll
2148 1.1 skrll case 'g':
2149 1.1 skrll case 'H':
2150 1.1 skrll case 'J':
2151 1.1 skrll {
2152 1.1 skrll char format;
2153 1.1 skrll
2154 1.1 skrll if (*s++ == '%'
2155 1.1 skrll && ((format = *s) == 'f')
2156 1.1 skrll && ISDIGIT (*++s))
2157 1.1 skrll {
2158 1.1 skrll for (mask = 0; ISDIGIT (*s); ++s)
2159 1.1 skrll {
2160 1.1 skrll mask = 10 * mask + (*s - '0');
2161 1.1 skrll } /* read the number */
2162 1.1 skrll
2163 1.1 skrll if ((*args == 'v'
2164 1.1 skrll || *args == 'B'
2165 1.1 skrll || *args == 'H')
2166 1.1 skrll && (mask & 1))
2167 1.1 skrll {
2168 1.1 skrll break;
2169 1.1 skrll } /* register must be even numbered */
2170 1.1 skrll
2171 1.1 skrll if ((*args == 'V'
2172 1.1 skrll || *args == 'R'
2173 1.1 skrll || *args == 'J')
2174 1.1 skrll && (mask & 3))
2175 1.1 skrll {
2176 1.1 skrll break;
2177 1.1 skrll } /* register must be multiple of 4 */
2178 1.1 skrll
2179 1.1 skrll if (mask >= 64)
2180 1.1 skrll {
2181 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
2182 1.1 skrll error_message = _(": There are only 64 f registers; [0-63]");
2183 1.1 skrll else
2184 1.1 skrll error_message = _(": There are only 32 f registers; [0-31]");
2185 1.1 skrll goto error;
2186 1.1 skrll } /* on error */
2187 1.1 skrll else if (mask >= 32)
2188 1.1 skrll {
2189 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
2190 1.1 skrll {
2191 1.1 skrll if (*args == 'e' || *args == 'f' || *args == 'g')
2192 1.1 skrll {
2193 1.1 skrll error_message
2194 1.1 skrll = _(": There are only 32 single precision f registers; [0-31]");
2195 1.1 skrll goto error;
2196 1.1 skrll }
2197 1.1 skrll v9_arg_p = 1;
2198 1.1 skrll mask -= 31; /* wrap high bit */
2199 1.1 skrll }
2200 1.1 skrll else
2201 1.1 skrll {
2202 1.1 skrll error_message = _(": There are only 32 f registers; [0-31]");
2203 1.1 skrll goto error;
2204 1.1 skrll }
2205 1.1 skrll }
2206 1.1 skrll }
2207 1.1 skrll else
2208 1.1 skrll {
2209 1.1 skrll break;
2210 1.1 skrll } /* if not an 'f' register. */
2211 1.1 skrll
2212 1.1 skrll switch (*args)
2213 1.1 skrll {
2214 1.1 skrll case 'v':
2215 1.1 skrll case 'V':
2216 1.1 skrll case 'e':
2217 1.1 skrll opcode |= RS1 (mask);
2218 1.1 skrll continue;
2219 1.1 skrll
2220 1.1 skrll case 'f':
2221 1.1 skrll case 'B':
2222 1.1 skrll case 'R':
2223 1.1 skrll opcode |= RS2 (mask);
2224 1.1 skrll continue;
2225 1.1 skrll
2226 1.1 skrll case 'g':
2227 1.1 skrll case 'H':
2228 1.1 skrll case 'J':
2229 1.1 skrll opcode |= RD (mask);
2230 1.1 skrll continue;
2231 1.1 skrll } /* Pack it in. */
2232 1.1 skrll
2233 1.1 skrll know (0);
2234 1.1 skrll break;
2235 1.1 skrll } /* float arg */
2236 1.1 skrll
2237 1.1 skrll case 'F':
2238 1.1 skrll if (strncmp (s, "%fsr", 4) == 0)
2239 1.1 skrll {
2240 1.1 skrll s += 4;
2241 1.1 skrll continue;
2242 1.1 skrll }
2243 1.1 skrll break;
2244 1.1 skrll
2245 1.1 skrll case '0': /* 64 bit immediate (set, setsw, setx insn) */
2246 1.1 skrll the_insn.reloc = BFD_RELOC_NONE; /* reloc handled elsewhere */
2247 1.1 skrll goto immediate;
2248 1.1 skrll
2249 1.1 skrll case 'l': /* 22 bit PC relative immediate */
2250 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_WDISP22;
2251 1.1 skrll the_insn.pcrel = 1;
2252 1.1 skrll goto immediate;
2253 1.1 skrll
2254 1.1 skrll case 'L': /* 30 bit immediate */
2255 1.1 skrll the_insn.reloc = BFD_RELOC_32_PCREL_S2;
2256 1.1 skrll the_insn.pcrel = 1;
2257 1.1 skrll goto immediate;
2258 1.1 skrll
2259 1.1 skrll case 'h':
2260 1.1 skrll case 'n': /* 22 bit immediate */
2261 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC22;
2262 1.1 skrll goto immediate;
2263 1.1 skrll
2264 1.1 skrll case 'i': /* 13 bit immediate */
2265 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC13;
2266 1.1 skrll
2267 1.1 skrll /* fallthrough */
2268 1.1 skrll
2269 1.1 skrll immediate:
2270 1.1 skrll if (*s == ' ')
2271 1.1 skrll s++;
2272 1.1 skrll
2273 1.1 skrll {
2274 1.1 skrll char *s1;
2275 1.1 skrll char *op_arg = NULL;
2276 1.1 skrll static expressionS op_exp;
2277 1.1 skrll bfd_reloc_code_real_type old_reloc = the_insn.reloc;
2278 1.1 skrll
2279 1.1 skrll /* Check for %hi, etc. */
2280 1.1 skrll if (*s == '%')
2281 1.1 skrll {
2282 1.1 skrll static const struct ops {
2283 1.1 skrll /* The name as it appears in assembler. */
2284 1.1 skrll char *name;
2285 1.1 skrll /* strlen (name), precomputed for speed */
2286 1.1 skrll int len;
2287 1.1 skrll /* The reloc this pseudo-op translates to. */
2288 1.1 skrll int reloc;
2289 1.1 skrll /* Non-zero if for v9 only. */
2290 1.1 skrll int v9_p;
2291 1.1 skrll /* Non-zero if can be used in pc-relative contexts. */
2292 1.1 skrll int pcrel_p;/*FIXME:wip*/
2293 1.1 skrll } ops[] = {
2294 1.1 skrll /* hix/lox must appear before hi/lo so %hix won't be
2295 1.1 skrll mistaken for %hi. */
2296 1.1 skrll { "hix", 3, BFD_RELOC_SPARC_HIX22, 1, 0 },
2297 1.1 skrll { "lox", 3, BFD_RELOC_SPARC_LOX10, 1, 0 },
2298 1.1 skrll { "hi", 2, BFD_RELOC_HI22, 0, 1 },
2299 1.1 skrll { "lo", 2, BFD_RELOC_LO10, 0, 1 },
2300 1.1 skrll { "pc22", 4, BFD_RELOC_SPARC_PC22, 0, 1 },
2301 1.1 skrll { "pc10", 4, BFD_RELOC_SPARC_PC10, 0, 1 },
2302 1.1 skrll { "hh", 2, BFD_RELOC_SPARC_HH22, 1, 1 },
2303 1.1 skrll { "hm", 2, BFD_RELOC_SPARC_HM10, 1, 1 },
2304 1.1 skrll { "lm", 2, BFD_RELOC_SPARC_LM22, 1, 1 },
2305 1.1 skrll { "h44", 3, BFD_RELOC_SPARC_H44, 1, 0 },
2306 1.1 skrll { "m44", 3, BFD_RELOC_SPARC_M44, 1, 0 },
2307 1.1 skrll { "l44", 3, BFD_RELOC_SPARC_L44, 1, 0 },
2308 1.1 skrll { "uhi", 3, BFD_RELOC_SPARC_HH22, 1, 0 },
2309 1.1 skrll { "ulo", 3, BFD_RELOC_SPARC_HM10, 1, 0 },
2310 1.1 skrll { "tgd_hi22", 8, BFD_RELOC_SPARC_TLS_GD_HI22, 0, 0 },
2311 1.1 skrll { "tgd_lo10", 8, BFD_RELOC_SPARC_TLS_GD_LO10, 0, 0 },
2312 1.1 skrll { "tldm_hi22", 9, BFD_RELOC_SPARC_TLS_LDM_HI22, 0, 0 },
2313 1.1 skrll { "tldm_lo10", 9, BFD_RELOC_SPARC_TLS_LDM_LO10, 0, 0 },
2314 1.1 skrll { "tldo_hix22", 10, BFD_RELOC_SPARC_TLS_LDO_HIX22, 0,
2315 1.1 skrll 0 },
2316 1.1 skrll { "tldo_lox10", 10, BFD_RELOC_SPARC_TLS_LDO_LOX10, 0,
2317 1.1 skrll 0 },
2318 1.1 skrll { "tie_hi22", 8, BFD_RELOC_SPARC_TLS_IE_HI22, 0, 0 },
2319 1.1 skrll { "tie_lo10", 8, BFD_RELOC_SPARC_TLS_IE_LO10, 0, 0 },
2320 1.1 skrll { "tle_hix22", 9, BFD_RELOC_SPARC_TLS_LE_HIX22, 0, 0 },
2321 1.1 skrll { "tle_lox10", 9, BFD_RELOC_SPARC_TLS_LE_LOX10, 0, 0 },
2322 1.1 skrll { "gdop_hix22", 10, BFD_RELOC_SPARC_GOTDATA_OP_HIX22,
2323 1.1 skrll 0, 0 },
2324 1.1 skrll { "gdop_lox10", 10, BFD_RELOC_SPARC_GOTDATA_OP_LOX10,
2325 1.1 skrll 0, 0 },
2326 1.1 skrll { NULL, 0, 0, 0, 0 }
2327 1.1 skrll };
2328 1.1 skrll const struct ops *o;
2329 1.1 skrll
2330 1.1 skrll for (o = ops; o->name; o++)
2331 1.1 skrll if (strncmp (s + 1, o->name, o->len) == 0)
2332 1.1 skrll break;
2333 1.1 skrll if (o->name == NULL)
2334 1.1 skrll break;
2335 1.1 skrll
2336 1.1 skrll if (s[o->len + 1] != '(')
2337 1.1 skrll {
2338 1.1 skrll as_bad (_("Illegal operands: %%%s requires arguments in ()"), o->name);
2339 1.1 skrll return special_case;
2340 1.1 skrll }
2341 1.1 skrll
2342 1.1 skrll op_arg = o->name;
2343 1.1 skrll the_insn.reloc = o->reloc;
2344 1.1 skrll s += o->len + 2;
2345 1.1 skrll v9_arg_p = o->v9_p;
2346 1.1 skrll }
2347 1.1 skrll
2348 1.1 skrll /* Note that if the get_expression() fails, we will still
2349 1.1 skrll have created U entries in the symbol table for the
2350 1.1 skrll 'symbols' in the input string. Try not to create U
2351 1.1 skrll symbols for registers, etc. */
2352 1.1 skrll
2353 1.1 skrll /* This stuff checks to see if the expression ends in
2354 1.1 skrll +%reg. If it does, it removes the register from
2355 1.1 skrll the expression, and re-sets 's' to point to the
2356 1.1 skrll right place. */
2357 1.1 skrll
2358 1.1 skrll if (op_arg)
2359 1.1 skrll {
2360 1.1 skrll int npar = 0;
2361 1.1 skrll
2362 1.1 skrll for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++)
2363 1.1 skrll if (*s1 == '(')
2364 1.1 skrll npar++;
2365 1.1 skrll else if (*s1 == ')')
2366 1.1 skrll {
2367 1.1 skrll if (!npar)
2368 1.1 skrll break;
2369 1.1 skrll npar--;
2370 1.1 skrll }
2371 1.1 skrll
2372 1.1 skrll if (*s1 != ')')
2373 1.1 skrll {
2374 1.1 skrll as_bad (_("Illegal operands: %%%s requires arguments in ()"), op_arg);
2375 1.1 skrll return special_case;
2376 1.1 skrll }
2377 1.1 skrll
2378 1.1 skrll *s1 = '\0';
2379 1.1 skrll (void) get_expression (s);
2380 1.1 skrll *s1 = ')';
2381 1.1 skrll s = s1 + 1;
2382 1.1 skrll if (*s == ',' || *s == ']' || !*s)
2383 1.1 skrll continue;
2384 1.1 skrll if (*s != '+' && *s != '-')
2385 1.1 skrll {
2386 1.1 skrll as_bad (_("Illegal operands: Can't do arithmetics other than + and - involving %%%s()"), op_arg);
2387 1.1 skrll return special_case;
2388 1.1 skrll }
2389 1.1 skrll *s1 = '0';
2390 1.1 skrll s = s1;
2391 1.1 skrll op_exp = the_insn.exp;
2392 1.1 skrll memset (&the_insn.exp, 0, sizeof (the_insn.exp));
2393 1.1 skrll }
2394 1.1 skrll
2395 1.1 skrll for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++)
2396 1.1 skrll ;
2397 1.1 skrll
2398 1.1 skrll if (s1 != s && ISDIGIT (s1[-1]))
2399 1.1 skrll {
2400 1.1 skrll if (s1[-2] == '%' && s1[-3] == '+')
2401 1.1 skrll s1 -= 3;
2402 1.1 skrll else if (strchr ("goli0123456789", s1[-2]) && s1[-3] == '%' && s1[-4] == '+')
2403 1.1 skrll s1 -= 4;
2404 1.1 skrll else
2405 1.1 skrll s1 = NULL;
2406 1.1 skrll if (s1)
2407 1.1 skrll {
2408 1.1 skrll *s1 = '\0';
2409 1.1 skrll if (op_arg && s1 == s + 1)
2410 1.1 skrll the_insn.exp.X_op = O_absent;
2411 1.1 skrll else
2412 1.1 skrll (void) get_expression (s);
2413 1.1 skrll *s1 = '+';
2414 1.1 skrll if (op_arg)
2415 1.1 skrll *s = ')';
2416 1.1 skrll s = s1;
2417 1.1 skrll }
2418 1.1 skrll }
2419 1.1 skrll else
2420 1.1 skrll s1 = NULL;
2421 1.1 skrll
2422 1.1 skrll if (!s1)
2423 1.1 skrll {
2424 1.1 skrll (void) get_expression (s);
2425 1.1 skrll if (op_arg)
2426 1.1 skrll *s = ')';
2427 1.1 skrll s = expr_end;
2428 1.1 skrll }
2429 1.1 skrll
2430 1.1 skrll if (op_arg)
2431 1.1 skrll {
2432 1.1 skrll the_insn.exp2 = the_insn.exp;
2433 1.1 skrll the_insn.exp = op_exp;
2434 1.1 skrll if (the_insn.exp2.X_op == O_absent)
2435 1.1 skrll the_insn.exp2.X_op = O_illegal;
2436 1.1 skrll else if (the_insn.exp.X_op == O_absent)
2437 1.1 skrll {
2438 1.1 skrll the_insn.exp = the_insn.exp2;
2439 1.1 skrll the_insn.exp2.X_op = O_illegal;
2440 1.1 skrll }
2441 1.1 skrll else if (the_insn.exp.X_op == O_constant)
2442 1.1 skrll {
2443 1.1 skrll valueT val = the_insn.exp.X_add_number;
2444 1.1 skrll switch (the_insn.reloc)
2445 1.1 skrll {
2446 1.1 skrll default:
2447 1.1 skrll break;
2448 1.1 skrll
2449 1.1 skrll case BFD_RELOC_SPARC_HH22:
2450 1.1 skrll val = BSR (val, 32);
2451 1.1 skrll /* Fall through. */
2452 1.1 skrll
2453 1.1 skrll case BFD_RELOC_SPARC_LM22:
2454 1.1 skrll case BFD_RELOC_HI22:
2455 1.1 skrll val = (val >> 10) & 0x3fffff;
2456 1.1 skrll break;
2457 1.1 skrll
2458 1.1 skrll case BFD_RELOC_SPARC_HM10:
2459 1.1 skrll val = BSR (val, 32);
2460 1.1 skrll /* Fall through. */
2461 1.1 skrll
2462 1.1 skrll case BFD_RELOC_LO10:
2463 1.1 skrll val &= 0x3ff;
2464 1.1 skrll break;
2465 1.1 skrll
2466 1.1 skrll case BFD_RELOC_SPARC_H44:
2467 1.1 skrll val >>= 22;
2468 1.1 skrll val &= 0x3fffff;
2469 1.1 skrll break;
2470 1.1 skrll
2471 1.1 skrll case BFD_RELOC_SPARC_M44:
2472 1.1 skrll val >>= 12;
2473 1.1 skrll val &= 0x3ff;
2474 1.1 skrll break;
2475 1.1 skrll
2476 1.1 skrll case BFD_RELOC_SPARC_L44:
2477 1.1 skrll val &= 0xfff;
2478 1.1 skrll break;
2479 1.1 skrll
2480 1.1 skrll case BFD_RELOC_SPARC_HIX22:
2481 1.1 skrll val = ~val;
2482 1.1 skrll val = (val >> 10) & 0x3fffff;
2483 1.1 skrll break;
2484 1.1 skrll
2485 1.1 skrll case BFD_RELOC_SPARC_LOX10:
2486 1.1 skrll val = (val & 0x3ff) | 0x1c00;
2487 1.1 skrll break;
2488 1.1 skrll }
2489 1.1 skrll the_insn.exp = the_insn.exp2;
2490 1.1 skrll the_insn.exp.X_add_number += val;
2491 1.1 skrll the_insn.exp2.X_op = O_illegal;
2492 1.1 skrll the_insn.reloc = old_reloc;
2493 1.1 skrll }
2494 1.1 skrll else if (the_insn.exp2.X_op != O_constant)
2495 1.1 skrll {
2496 1.1 skrll as_bad (_("Illegal operands: Can't add non-constant expression to %%%s()"), op_arg);
2497 1.1 skrll return special_case;
2498 1.1 skrll }
2499 1.1 skrll else
2500 1.1 skrll {
2501 1.1 skrll if (old_reloc != BFD_RELOC_SPARC13
2502 1.1 skrll || the_insn.reloc != BFD_RELOC_LO10
2503 1.1 skrll || sparc_arch_size != 64
2504 1.1 skrll || sparc_pic_code)
2505 1.1 skrll {
2506 1.1 skrll as_bad (_("Illegal operands: Can't do arithmetics involving %%%s() of a relocatable symbol"), op_arg);
2507 1.1 skrll return special_case;
2508 1.1 skrll }
2509 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_OLO10;
2510 1.1 skrll }
2511 1.1 skrll }
2512 1.1 skrll }
2513 1.1 skrll /* Check for constants that don't require emitting a reloc. */
2514 1.1 skrll if (the_insn.exp.X_op == O_constant
2515 1.1 skrll && the_insn.exp.X_add_symbol == 0
2516 1.1 skrll && the_insn.exp.X_op_symbol == 0)
2517 1.1 skrll {
2518 1.1 skrll /* For pc-relative call instructions, we reject
2519 1.1 skrll constants to get better code. */
2520 1.1 skrll if (the_insn.pcrel
2521 1.1 skrll && the_insn.reloc == BFD_RELOC_32_PCREL_S2
2522 1.1 skrll && in_signed_range (the_insn.exp.X_add_number, 0x3fff))
2523 1.1 skrll {
2524 1.1 skrll error_message = _(": PC-relative operand can't be a constant");
2525 1.1 skrll goto error;
2526 1.1 skrll }
2527 1.1 skrll
2528 1.1 skrll if (the_insn.reloc >= BFD_RELOC_SPARC_TLS_GD_HI22
2529 1.1 skrll && the_insn.reloc <= BFD_RELOC_SPARC_TLS_TPOFF64)
2530 1.1 skrll {
2531 1.1 skrll error_message = _(": TLS operand can't be a constant");
2532 1.1 skrll goto error;
2533 1.1 skrll }
2534 1.1 skrll
2535 1.1 skrll /* Constants that won't fit are checked in md_apply_fix
2536 1.1 skrll and bfd_install_relocation.
2537 1.1 skrll ??? It would be preferable to install the constants
2538 1.1 skrll into the insn here and save having to create a fixS
2539 1.1 skrll for each one. There already exists code to handle
2540 1.1 skrll all the various cases (e.g. in md_apply_fix and
2541 1.1 skrll bfd_install_relocation) so duplicating all that code
2542 1.1 skrll here isn't right. */
2543 1.1 skrll }
2544 1.1 skrll
2545 1.1 skrll continue;
2546 1.1 skrll
2547 1.1 skrll case 'a':
2548 1.1 skrll if (*s++ == 'a')
2549 1.1 skrll {
2550 1.1 skrll opcode |= ANNUL;
2551 1.1 skrll continue;
2552 1.1 skrll }
2553 1.1 skrll break;
2554 1.1 skrll
2555 1.1 skrll case 'A':
2556 1.1 skrll {
2557 1.1 skrll int asi = 0;
2558 1.1 skrll
2559 1.1 skrll /* Parse an asi. */
2560 1.1 skrll if (*s == '#')
2561 1.1 skrll {
2562 1.1 skrll if (! parse_keyword_arg (sparc_encode_asi, &s, &asi))
2563 1.1 skrll {
2564 1.1 skrll error_message = _(": invalid ASI name");
2565 1.1 skrll goto error;
2566 1.1 skrll }
2567 1.1 skrll }
2568 1.1 skrll else
2569 1.1 skrll {
2570 1.1 skrll if (! parse_const_expr_arg (&s, &asi))
2571 1.1 skrll {
2572 1.1 skrll error_message = _(": invalid ASI expression");
2573 1.1 skrll goto error;
2574 1.1 skrll }
2575 1.1 skrll if (asi < 0 || asi > 255)
2576 1.1 skrll {
2577 1.1 skrll error_message = _(": invalid ASI number");
2578 1.1 skrll goto error;
2579 1.1 skrll }
2580 1.1 skrll }
2581 1.1 skrll opcode |= ASI (asi);
2582 1.1 skrll continue;
2583 1.1 skrll } /* Alternate space. */
2584 1.1 skrll
2585 1.1 skrll case 'p':
2586 1.1 skrll if (strncmp (s, "%psr", 4) == 0)
2587 1.1 skrll {
2588 1.1 skrll s += 4;
2589 1.1 skrll continue;
2590 1.1 skrll }
2591 1.1 skrll break;
2592 1.1 skrll
2593 1.1 skrll case 'q': /* Floating point queue. */
2594 1.1 skrll if (strncmp (s, "%fq", 3) == 0)
2595 1.1 skrll {
2596 1.1 skrll s += 3;
2597 1.1 skrll continue;
2598 1.1 skrll }
2599 1.1 skrll break;
2600 1.1 skrll
2601 1.1 skrll case 'Q': /* Coprocessor queue. */
2602 1.1 skrll if (strncmp (s, "%cq", 3) == 0)
2603 1.1 skrll {
2604 1.1 skrll s += 3;
2605 1.1 skrll continue;
2606 1.1 skrll }
2607 1.1 skrll break;
2608 1.1 skrll
2609 1.1 skrll case 'S':
2610 1.1 skrll if (strcmp (str, "set") == 0
2611 1.1 skrll || strcmp (str, "setuw") == 0)
2612 1.1 skrll {
2613 1.1 skrll special_case = SPECIAL_CASE_SET;
2614 1.1 skrll continue;
2615 1.1 skrll }
2616 1.1 skrll else if (strcmp (str, "setsw") == 0)
2617 1.1 skrll {
2618 1.1 skrll special_case = SPECIAL_CASE_SETSW;
2619 1.1 skrll continue;
2620 1.1 skrll }
2621 1.1 skrll else if (strcmp (str, "setx") == 0)
2622 1.1 skrll {
2623 1.1 skrll special_case = SPECIAL_CASE_SETX;
2624 1.1 skrll continue;
2625 1.1 skrll }
2626 1.1 skrll else if (strncmp (str, "fdiv", 4) == 0)
2627 1.1 skrll {
2628 1.1 skrll special_case = SPECIAL_CASE_FDIV;
2629 1.1 skrll continue;
2630 1.1 skrll }
2631 1.1 skrll break;
2632 1.1 skrll
2633 1.1 skrll case 'o':
2634 1.1 skrll if (strncmp (s, "%asi", 4) != 0)
2635 1.1 skrll break;
2636 1.1 skrll s += 4;
2637 1.1 skrll continue;
2638 1.1 skrll
2639 1.1 skrll case 's':
2640 1.1 skrll if (strncmp (s, "%fprs", 5) != 0)
2641 1.1 skrll break;
2642 1.1 skrll s += 5;
2643 1.1 skrll continue;
2644 1.1 skrll
2645 1.1 skrll case 'E':
2646 1.1 skrll if (strncmp (s, "%ccr", 4) != 0)
2647 1.1 skrll break;
2648 1.1 skrll s += 4;
2649 1.1 skrll continue;
2650 1.1 skrll
2651 1.1 skrll case 't':
2652 1.1 skrll if (strncmp (s, "%tbr", 4) != 0)
2653 1.1 skrll break;
2654 1.1 skrll s += 4;
2655 1.1 skrll continue;
2656 1.1 skrll
2657 1.1 skrll case 'w':
2658 1.1 skrll if (strncmp (s, "%wim", 4) != 0)
2659 1.1 skrll break;
2660 1.1 skrll s += 4;
2661 1.1 skrll continue;
2662 1.1 skrll
2663 1.1 skrll case 'x':
2664 1.1 skrll {
2665 1.1 skrll char *push = input_line_pointer;
2666 1.1 skrll expressionS e;
2667 1.1 skrll
2668 1.1 skrll input_line_pointer = s;
2669 1.1 skrll expression (&e);
2670 1.1 skrll if (e.X_op == O_constant)
2671 1.1 skrll {
2672 1.1 skrll int n = e.X_add_number;
2673 1.1 skrll if (n != e.X_add_number || (n & ~0x1ff) != 0)
2674 1.1 skrll as_bad (_("OPF immediate operand out of range (0-0x1ff)"));
2675 1.1 skrll else
2676 1.1 skrll opcode |= e.X_add_number << 5;
2677 1.1 skrll }
2678 1.1 skrll else
2679 1.1 skrll as_bad (_("non-immediate OPF operand, ignored"));
2680 1.1 skrll s = input_line_pointer;
2681 1.1 skrll input_line_pointer = push;
2682 1.1 skrll continue;
2683 1.1 skrll }
2684 1.1 skrll
2685 1.1 skrll case 'y':
2686 1.1 skrll if (strncmp (s, "%y", 2) != 0)
2687 1.1 skrll break;
2688 1.1 skrll s += 2;
2689 1.1 skrll continue;
2690 1.1 skrll
2691 1.1 skrll case 'u':
2692 1.1 skrll case 'U':
2693 1.1 skrll {
2694 1.1 skrll /* Parse a sparclet cpreg. */
2695 1.1 skrll int cpreg;
2696 1.1 skrll if (! parse_keyword_arg (sparc_encode_sparclet_cpreg, &s, &cpreg))
2697 1.1 skrll {
2698 1.1 skrll error_message = _(": invalid cpreg name");
2699 1.1 skrll goto error;
2700 1.1 skrll }
2701 1.1 skrll opcode |= (*args == 'U' ? RS1 (cpreg) : RD (cpreg));
2702 1.1 skrll continue;
2703 1.1 skrll }
2704 1.1 skrll
2705 1.1 skrll default:
2706 1.1 skrll as_fatal (_("failed sanity check."));
2707 1.1 skrll } /* switch on arg code. */
2708 1.1 skrll
2709 1.1 skrll /* Break out of for() loop. */
2710 1.1 skrll break;
2711 1.1 skrll } /* For each arg that we expect. */
2712 1.1 skrll
2713 1.1 skrll error:
2714 1.1 skrll if (match == 0)
2715 1.1 skrll {
2716 1.1 skrll /* Args don't match. */
2717 1.1 skrll if (&insn[1] - sparc_opcodes < sparc_num_opcodes
2718 1.1 skrll && (insn->name == insn[1].name
2719 1.1 skrll || !strcmp (insn->name, insn[1].name)))
2720 1.1 skrll {
2721 1.1 skrll ++insn;
2722 1.1 skrll s = argsStart;
2723 1.1 skrll continue;
2724 1.1 skrll }
2725 1.1 skrll else
2726 1.1 skrll {
2727 1.1 skrll as_bad (_("Illegal operands%s"), error_message);
2728 1.1 skrll return special_case;
2729 1.1 skrll }
2730 1.1 skrll }
2731 1.1 skrll else
2732 1.1 skrll {
2733 1.1 skrll /* We have a match. Now see if the architecture is OK. */
2734 1.1 skrll int needed_arch_mask = insn->architecture;
2735 1.1 skrll
2736 1.1 skrll if (v9_arg_p)
2737 1.1 skrll {
2738 1.1 skrll needed_arch_mask &=
2739 1.1 skrll ~(SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9) - 1);
2740 1.1 skrll if (! needed_arch_mask)
2741 1.1 skrll needed_arch_mask =
2742 1.1 skrll SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9);
2743 1.1 skrll }
2744 1.1 skrll
2745 1.1 skrll if (needed_arch_mask
2746 1.1 skrll & SPARC_OPCODE_SUPPORTED (current_architecture))
2747 1.1 skrll /* OK. */
2748 1.1.1.2 christos ;
2749 1.1 skrll /* Can we bump up the architecture? */
2750 1.1 skrll else if (needed_arch_mask
2751 1.1 skrll & SPARC_OPCODE_SUPPORTED (max_architecture))
2752 1.1 skrll {
2753 1.1 skrll enum sparc_opcode_arch_val needed_architecture =
2754 1.1 skrll sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture)
2755 1.1 skrll & needed_arch_mask);
2756 1.1 skrll
2757 1.1 skrll gas_assert (needed_architecture <= SPARC_OPCODE_ARCH_MAX);
2758 1.1 skrll if (warn_on_bump
2759 1.1 skrll && needed_architecture > warn_after_architecture)
2760 1.1 skrll {
2761 1.1 skrll as_warn (_("architecture bumped from \"%s\" to \"%s\" on \"%s\""),
2762 1.1 skrll sparc_opcode_archs[current_architecture].name,
2763 1.1 skrll sparc_opcode_archs[needed_architecture].name,
2764 1.1 skrll str);
2765 1.1 skrll warn_after_architecture = needed_architecture;
2766 1.1 skrll }
2767 1.1 skrll current_architecture = needed_architecture;
2768 1.1 skrll }
2769 1.1 skrll /* Conflict. */
2770 1.1 skrll /* ??? This seems to be a bit fragile. What if the next entry in
2771 1.1 skrll the opcode table is the one we want and it is supported?
2772 1.1 skrll It is possible to arrange the table today so that this can't
2773 1.1 skrll happen but what about tomorrow? */
2774 1.1 skrll else
2775 1.1 skrll {
2776 1.1 skrll int arch, printed_one_p = 0;
2777 1.1 skrll char *p;
2778 1.1 skrll char required_archs[SPARC_OPCODE_ARCH_MAX * 16];
2779 1.1 skrll
2780 1.1 skrll /* Create a list of the architectures that support the insn. */
2781 1.1 skrll needed_arch_mask &= ~SPARC_OPCODE_SUPPORTED (max_architecture);
2782 1.1 skrll p = required_archs;
2783 1.1 skrll arch = sparc_ffs (needed_arch_mask);
2784 1.1 skrll while ((1 << arch) <= needed_arch_mask)
2785 1.1 skrll {
2786 1.1 skrll if ((1 << arch) & needed_arch_mask)
2787 1.1 skrll {
2788 1.1 skrll if (printed_one_p)
2789 1.1 skrll *p++ = '|';
2790 1.1 skrll strcpy (p, sparc_opcode_archs[arch].name);
2791 1.1 skrll p += strlen (p);
2792 1.1 skrll printed_one_p = 1;
2793 1.1 skrll }
2794 1.1 skrll ++arch;
2795 1.1 skrll }
2796 1.1 skrll
2797 1.1 skrll as_bad (_("Architecture mismatch on \"%s\"."), str);
2798 1.1 skrll as_tsktsk (_(" (Requires %s; requested architecture is %s.)"),
2799 1.1 skrll required_archs,
2800 1.1 skrll sparc_opcode_archs[max_architecture].name);
2801 1.1 skrll return special_case;
2802 1.1 skrll }
2803 1.1 skrll } /* If no match. */
2804 1.1 skrll
2805 1.1 skrll break;
2806 1.1 skrll } /* Forever looking for a match. */
2807 1.1 skrll
2808 1.1 skrll the_insn.opcode = opcode;
2809 1.1 skrll return special_case;
2810 1.1 skrll }
2811 1.1 skrll
2812 1.1 skrll /* Parse an argument that can be expressed as a keyword.
2813 1.1 skrll (eg: #StoreStore or %ccfr).
2814 1.1 skrll The result is a boolean indicating success.
2815 1.1 skrll If successful, INPUT_POINTER is updated. */
2816 1.1 skrll
2817 1.1 skrll static int
2818 1.1 skrll parse_keyword_arg (int (*lookup_fn) (const char *),
2819 1.1 skrll char **input_pointerP,
2820 1.1 skrll int *valueP)
2821 1.1 skrll {
2822 1.1 skrll int value;
2823 1.1 skrll char c, *p, *q;
2824 1.1 skrll
2825 1.1 skrll p = *input_pointerP;
2826 1.1 skrll for (q = p + (*p == '#' || *p == '%');
2827 1.1 skrll ISALNUM (*q) || *q == '_';
2828 1.1 skrll ++q)
2829 1.1 skrll continue;
2830 1.1 skrll c = *q;
2831 1.1 skrll *q = 0;
2832 1.1 skrll value = (*lookup_fn) (p);
2833 1.1 skrll *q = c;
2834 1.1 skrll if (value == -1)
2835 1.1 skrll return 0;
2836 1.1 skrll *valueP = value;
2837 1.1 skrll *input_pointerP = q;
2838 1.1 skrll return 1;
2839 1.1 skrll }
2840 1.1 skrll
2841 1.1 skrll /* Parse an argument that is a constant expression.
2842 1.1 skrll The result is a boolean indicating success. */
2843 1.1 skrll
2844 1.1 skrll static int
2845 1.1 skrll parse_const_expr_arg (char **input_pointerP, int *valueP)
2846 1.1 skrll {
2847 1.1 skrll char *save = input_line_pointer;
2848 1.1 skrll expressionS exp;
2849 1.1 skrll
2850 1.1 skrll input_line_pointer = *input_pointerP;
2851 1.1 skrll /* The next expression may be something other than a constant
2852 1.1 skrll (say if we're not processing the right variant of the insn).
2853 1.1 skrll Don't call expression unless we're sure it will succeed as it will
2854 1.1 skrll signal an error (which we want to defer until later). */
2855 1.1 skrll /* FIXME: It might be better to define md_operand and have it recognize
2856 1.1 skrll things like %asi, etc. but continuing that route through to the end
2857 1.1 skrll is a lot of work. */
2858 1.1 skrll if (*input_line_pointer == '%')
2859 1.1 skrll {
2860 1.1 skrll input_line_pointer = save;
2861 1.1 skrll return 0;
2862 1.1 skrll }
2863 1.1 skrll expression (&exp);
2864 1.1 skrll *input_pointerP = input_line_pointer;
2865 1.1 skrll input_line_pointer = save;
2866 1.1 skrll if (exp.X_op != O_constant)
2867 1.1 skrll return 0;
2868 1.1 skrll *valueP = exp.X_add_number;
2869 1.1 skrll return 1;
2870 1.1 skrll }
2871 1.1 skrll
2872 1.1 skrll /* Subroutine of sparc_ip to parse an expression. */
2873 1.1 skrll
2874 1.1 skrll static int
2875 1.1 skrll get_expression (char *str)
2876 1.1 skrll {
2877 1.1 skrll char *save_in;
2878 1.1 skrll segT seg;
2879 1.1 skrll
2880 1.1 skrll save_in = input_line_pointer;
2881 1.1 skrll input_line_pointer = str;
2882 1.1 skrll seg = expression (&the_insn.exp);
2883 1.1 skrll if (seg != absolute_section
2884 1.1 skrll && seg != text_section
2885 1.1 skrll && seg != data_section
2886 1.1 skrll && seg != bss_section
2887 1.1 skrll && seg != undefined_section)
2888 1.1 skrll {
2889 1.1 skrll the_insn.error = _("bad segment");
2890 1.1 skrll expr_end = input_line_pointer;
2891 1.1 skrll input_line_pointer = save_in;
2892 1.1 skrll return 1;
2893 1.1.1.2 christos }
2894 1.1 skrll expr_end = input_line_pointer;
2895 1.1 skrll input_line_pointer = save_in;
2896 1.1 skrll return 0;
2897 1.1 skrll }
2898 1.1 skrll
2899 1.1.1.2 christos /* Subroutine of md_assemble to output one insn. */
2900 1.1 skrll
2901 1.1.1.2 christos static void
2902 1.1 skrll output_insn (const struct sparc_opcode *insn, struct sparc_it *theinsn)
2903 1.1 skrll {
2904 1.1.1.2 christos char *toP = frag_more (4);
2905 1.1 skrll
2906 1.1 skrll /* Put out the opcode. */
2907 1.1 skrll if (INSN_BIG_ENDIAN)
2908 1.1 skrll number_to_chars_bigendian (toP, (valueT) theinsn->opcode, 4);
2909 1.1.1.2 christos else
2910 1.1.1.2 christos number_to_chars_littleendian (toP, (valueT) theinsn->opcode, 4);
2911 1.1.1.2 christos
2912 1.1 skrll /* Put out the symbol-dependent stuff. */
2913 1.1 skrll if (theinsn->reloc != BFD_RELOC_NONE)
2914 1.1 skrll {
2915 1.1 skrll fixS *fixP = fix_new_exp (frag_now, /* Which frag. */
2916 1.1 skrll (toP - frag_now->fr_literal), /* Where. */
2917 1.1.1.2 christos 4, /* Size. */
2918 1.1.1.2 christos &theinsn->exp,
2919 1.1 skrll theinsn->pcrel,
2920 1.1 skrll theinsn->reloc);
2921 1.1 skrll /* Turn off overflow checking in fixup_segment. We'll do our
2922 1.1.1.2 christos own overflow checking in md_apply_fix. This is necessary because
2923 1.1 skrll the insn size is 4 and fixup_segment will signal an overflow for
2924 1.1 skrll large 8 byte quantities. */
2925 1.1 skrll fixP->fx_no_overflow = 1;
2926 1.1 skrll if (theinsn->reloc == BFD_RELOC_SPARC_OLO10)
2927 1.1 skrll fixP->tc_fix_data = theinsn->exp2.X_add_number;
2928 1.1 skrll }
2929 1.1 skrll
2930 1.1 skrll last_insn = insn;
2931 1.1 skrll last_opcode = theinsn->opcode;
2932 1.1 skrll
2933 1.1 skrll #ifdef OBJ_ELF
2934 1.1 skrll dwarf2_emit_insn (4);
2935 1.1 skrll #endif
2936 1.1 skrll }
2937 1.1 skrll
2938 1.1 skrll char *
2940 1.1 skrll md_atof (int type, char *litP, int *sizeP)
2941 1.1 skrll {
2942 1.1 skrll return ieee_md_atof (type, litP, sizeP, target_big_endian);
2943 1.1 skrll }
2944 1.1 skrll
2945 1.1 skrll /* Write a value out to the object file, using the appropriate
2946 1.1 skrll endianness. */
2947 1.1 skrll
2948 1.1 skrll void
2949 1.1 skrll md_number_to_chars (char *buf, valueT val, int n)
2950 1.1 skrll {
2951 1.1 skrll if (target_big_endian)
2952 1.1 skrll number_to_chars_bigendian (buf, val, n);
2953 1.1 skrll else if (target_little_endian_data
2954 1.1 skrll && ((n == 4 || n == 2) && ~now_seg->flags & SEC_ALLOC))
2955 1.1 skrll /* Output debug words, which are not in allocated sections, as big
2956 1.1 skrll endian. */
2957 1.1 skrll number_to_chars_bigendian (buf, val, n);
2958 1.1 skrll else if (target_little_endian_data || ! target_big_endian)
2959 1.1 skrll number_to_chars_littleendian (buf, val, n);
2960 1.1 skrll }
2961 1.1 skrll
2962 1.1.1.2 christos /* Apply a fixS to the frags, now that we know the value it ought to
2964 1.1 skrll hold. */
2965 1.1 skrll
2966 1.1 skrll void
2967 1.1 skrll md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
2968 1.1 skrll {
2969 1.1 skrll char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2970 1.1 skrll offsetT val = * (offsetT *) valP;
2971 1.1 skrll long insn;
2972 1.1 skrll
2973 1.1 skrll gas_assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
2974 1.1 skrll
2975 1.1 skrll fixP->fx_addnumber = val; /* Remember value for emit_reloc. */
2976 1.1 skrll
2977 1.1 skrll #ifdef OBJ_ELF
2978 1.1 skrll /* SPARC ELF relocations don't use an addend in the data field. */
2979 1.1 skrll if (fixP->fx_addsy != NULL)
2980 1.1 skrll {
2981 1.1 skrll switch (fixP->fx_r_type)
2982 1.1 skrll {
2983 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_HI22:
2984 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_LO10:
2985 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_ADD:
2986 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_CALL:
2987 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_HI22:
2988 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_LO10:
2989 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_ADD:
2990 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_CALL:
2991 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_HIX22:
2992 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_LOX10:
2993 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_ADD:
2994 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_HI22:
2995 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LO10:
2996 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LD:
2997 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LDX:
2998 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_ADD:
2999 1.1 skrll case BFD_RELOC_SPARC_TLS_LE_HIX22:
3000 1.1 skrll case BFD_RELOC_SPARC_TLS_LE_LOX10:
3001 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPMOD32:
3002 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPMOD64:
3003 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPOFF32:
3004 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPOFF64:
3005 1.1 skrll case BFD_RELOC_SPARC_TLS_TPOFF32:
3006 1.1 skrll case BFD_RELOC_SPARC_TLS_TPOFF64:
3007 1.1 skrll S_SET_THREAD_LOCAL (fixP->fx_addsy);
3008 1.1 skrll
3009 1.1 skrll default:
3010 1.1 skrll break;
3011 1.1 skrll }
3012 1.1 skrll
3013 1.1 skrll return;
3014 1.1 skrll }
3015 1.1 skrll #endif
3016 1.1 skrll
3017 1.1 skrll /* This is a hack. There should be a better way to
3018 1.1 skrll handle this. Probably in terms of howto fields, once
3019 1.1 skrll we can look at these fixups in terms of howtos. */
3020 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_32_PCREL_S2 && fixP->fx_addsy)
3021 1.1 skrll val += fixP->fx_where + fixP->fx_frag->fr_address;
3022 1.1 skrll
3023 1.1 skrll #ifdef OBJ_AOUT
3024 1.1 skrll /* FIXME: More ridiculous gas reloc hacking. If we are going to
3025 1.1 skrll generate a reloc, then we just want to let the reloc addend set
3026 1.1 skrll the value. We do not want to also stuff the addend into the
3027 1.1 skrll object file. Including the addend in the object file works when
3028 1.1 skrll doing a static link, because the linker will ignore the object
3029 1.1 skrll file contents. However, the dynamic linker does not ignore the
3030 1.1 skrll object file contents. */
3031 1.1 skrll if (fixP->fx_addsy != NULL
3032 1.1 skrll && fixP->fx_r_type != BFD_RELOC_32_PCREL_S2)
3033 1.1 skrll val = 0;
3034 1.1 skrll
3035 1.1 skrll /* When generating PIC code, we do not want an addend for a reloc
3036 1.1 skrll against a local symbol. We adjust fx_addnumber to cancel out the
3037 1.1 skrll value already included in val, and to also cancel out the
3038 1.1 skrll adjustment which bfd_install_relocation will create. */
3039 1.1 skrll if (sparc_pic_code
3040 1.1 skrll && fixP->fx_r_type != BFD_RELOC_32_PCREL_S2
3041 1.1 skrll && fixP->fx_addsy != NULL
3042 1.1 skrll && ! S_IS_COMMON (fixP->fx_addsy)
3043 1.1 skrll && symbol_section_p (fixP->fx_addsy))
3044 1.1 skrll fixP->fx_addnumber -= 2 * S_GET_VALUE (fixP->fx_addsy);
3045 1.1 skrll
3046 1.1 skrll /* When generating PIC code, we need to fiddle to get
3047 1.1 skrll bfd_install_relocation to do the right thing for a PC relative
3048 1.1 skrll reloc against a local symbol which we are going to keep. */
3049 1.1 skrll if (sparc_pic_code
3050 1.1 skrll && fixP->fx_r_type == BFD_RELOC_32_PCREL_S2
3051 1.1 skrll && fixP->fx_addsy != NULL
3052 1.1 skrll && (S_IS_EXTERNAL (fixP->fx_addsy)
3053 1.1 skrll || S_IS_WEAK (fixP->fx_addsy))
3054 1.1 skrll && S_IS_DEFINED (fixP->fx_addsy)
3055 1.1 skrll && ! S_IS_COMMON (fixP->fx_addsy))
3056 1.1 skrll {
3057 1.1 skrll val = 0;
3058 1.1 skrll fixP->fx_addnumber -= 2 * S_GET_VALUE (fixP->fx_addsy);
3059 1.1 skrll }
3060 1.1 skrll #endif
3061 1.1 skrll
3062 1.1 skrll /* If this is a data relocation, just output VAL. */
3063 1.1 skrll
3064 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_16
3065 1.1 skrll || fixP->fx_r_type == BFD_RELOC_SPARC_UA16)
3066 1.1 skrll {
3067 1.1 skrll md_number_to_chars (buf, val, 2);
3068 1.1 skrll }
3069 1.1 skrll else if (fixP->fx_r_type == BFD_RELOC_32
3070 1.1 skrll || fixP->fx_r_type == BFD_RELOC_SPARC_UA32
3071 1.1 skrll || fixP->fx_r_type == BFD_RELOC_SPARC_REV32)
3072 1.1 skrll {
3073 1.1 skrll md_number_to_chars (buf, val, 4);
3074 1.1 skrll }
3075 1.1 skrll else if (fixP->fx_r_type == BFD_RELOC_64
3076 1.1 skrll || fixP->fx_r_type == BFD_RELOC_SPARC_UA64)
3077 1.1 skrll {
3078 1.1 skrll md_number_to_chars (buf, val, 8);
3079 1.1 skrll }
3080 1.1 skrll else if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3081 1.1 skrll || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3082 1.1 skrll {
3083 1.1 skrll fixP->fx_done = 0;
3084 1.1 skrll return;
3085 1.1 skrll }
3086 1.1 skrll else
3087 1.1 skrll {
3088 1.1 skrll /* It's a relocation against an instruction. */
3089 1.1 skrll
3090 1.1 skrll if (INSN_BIG_ENDIAN)
3091 1.1 skrll insn = bfd_getb32 ((unsigned char *) buf);
3092 1.1 skrll else
3093 1.1 skrll insn = bfd_getl32 ((unsigned char *) buf);
3094 1.1 skrll
3095 1.1 skrll switch (fixP->fx_r_type)
3096 1.1 skrll {
3097 1.1 skrll case BFD_RELOC_32_PCREL_S2:
3098 1.1 skrll val = val >> 2;
3099 1.1 skrll /* FIXME: This increment-by-one deserves a comment of why it's
3100 1.1 skrll being done! */
3101 1.1 skrll if (! sparc_pic_code
3102 1.1 skrll || fixP->fx_addsy == NULL
3103 1.1 skrll || symbol_section_p (fixP->fx_addsy))
3104 1.1 skrll ++val;
3105 1.1 skrll
3106 1.1 skrll insn |= val & 0x3fffffff;
3107 1.1 skrll
3108 1.1 skrll /* See if we have a delay slot. */
3109 1.1 skrll if (sparc_relax && fixP->fx_where + 8 <= fixP->fx_frag->fr_fix)
3110 1.1 skrll {
3111 1.1 skrll #define G0 0
3112 1.1 skrll #define O7 15
3113 1.1 skrll #define XCC (2 << 20)
3114 1.1 skrll #define COND(x) (((x)&0xf)<<25)
3115 1.1 skrll #define CONDA COND(0x8)
3116 1.1 skrll #define INSN_BPA (F2(0,1) | CONDA | BPRED | XCC)
3117 1.1 skrll #define INSN_BA (F2(0,2) | CONDA)
3118 1.1 skrll #define INSN_OR F3(2, 0x2, 0)
3119 1.1 skrll #define INSN_NOP F2(0,4)
3120 1.1 skrll
3121 1.1 skrll long delay;
3122 1.1 skrll
3123 1.1 skrll /* If the instruction is a call with either:
3124 1.1 skrll restore
3125 1.1 skrll arithmetic instruction with rd == %o7
3126 1.1 skrll where rs1 != %o7 and rs2 if it is register != %o7
3127 1.1 skrll then we can optimize if the call destination is near
3128 1.1 skrll by changing the call into a branch always. */
3129 1.1 skrll if (INSN_BIG_ENDIAN)
3130 1.1 skrll delay = bfd_getb32 ((unsigned char *) buf + 4);
3131 1.1 skrll else
3132 1.1 skrll delay = bfd_getl32 ((unsigned char *) buf + 4);
3133 1.1 skrll if ((insn & OP (~0)) != OP (1) || (delay & OP (~0)) != OP (2))
3134 1.1 skrll break;
3135 1.1 skrll if ((delay & OP3 (~0)) != OP3 (0x3d) /* Restore. */
3136 1.1 skrll && ((delay & OP3 (0x28)) != 0 /* Arithmetic. */
3137 1.1 skrll || ((delay & RD (~0)) != RD (O7))))
3138 1.1 skrll break;
3139 1.1 skrll if ((delay & RS1 (~0)) == RS1 (O7)
3140 1.1 skrll || ((delay & F3I (~0)) == 0
3141 1.1 skrll && (delay & RS2 (~0)) == RS2 (O7)))
3142 1.1 skrll break;
3143 1.1 skrll /* Ensure the branch will fit into simm22. */
3144 1.1 skrll if ((val & 0x3fe00000)
3145 1.1 skrll && (val & 0x3fe00000) != 0x3fe00000)
3146 1.1 skrll break;
3147 1.1 skrll /* Check if the arch is v9 and branch will fit
3148 1.1 skrll into simm19. */
3149 1.1 skrll if (((val & 0x3c0000) == 0
3150 1.1 skrll || (val & 0x3c0000) == 0x3c0000)
3151 1.1 skrll && (sparc_arch_size == 64
3152 1.1 skrll || current_architecture >= SPARC_OPCODE_ARCH_V9))
3153 1.1 skrll /* ba,pt %xcc */
3154 1.1 skrll insn = INSN_BPA | (val & 0x7ffff);
3155 1.1 skrll else
3156 1.1 skrll /* ba */
3157 1.1 skrll insn = INSN_BA | (val & 0x3fffff);
3158 1.1 skrll if (fixP->fx_where >= 4
3159 1.1 skrll && ((delay & (0xffffffff ^ RS1 (~0)))
3160 1.1 skrll == (INSN_OR | RD (O7) | RS2 (G0))))
3161 1.1 skrll {
3162 1.1 skrll long setter;
3163 1.1 skrll int reg;
3164 1.1 skrll
3165 1.1 skrll if (INSN_BIG_ENDIAN)
3166 1.1 skrll setter = bfd_getb32 ((unsigned char *) buf - 4);
3167 1.1 skrll else
3168 1.1 skrll setter = bfd_getl32 ((unsigned char *) buf - 4);
3169 1.1 skrll if ((setter & (0xffffffff ^ RD (~0)))
3170 1.1 skrll != (INSN_OR | RS1 (O7) | RS2 (G0)))
3171 1.1 skrll break;
3172 1.1 skrll /* The sequence was
3173 1.1 skrll or %o7, %g0, %rN
3174 1.1 skrll call foo
3175 1.1 skrll or %rN, %g0, %o7
3176 1.1 skrll
3177 1.1 skrll If call foo was replaced with ba, replace
3178 1.1 skrll or %rN, %g0, %o7 with nop. */
3179 1.1 skrll reg = (delay & RS1 (~0)) >> 14;
3180 1.1 skrll if (reg != ((setter & RD (~0)) >> 25)
3181 1.1 skrll || reg == G0 || reg == O7)
3182 1.1 skrll break;
3183 1.1 skrll
3184 1.1 skrll if (INSN_BIG_ENDIAN)
3185 1.1 skrll bfd_putb32 (INSN_NOP, (unsigned char *) buf + 4);
3186 1.1 skrll else
3187 1.1 skrll bfd_putl32 (INSN_NOP, (unsigned char *) buf + 4);
3188 1.1 skrll }
3189 1.1 skrll }
3190 1.1 skrll break;
3191 1.1 skrll
3192 1.1 skrll case BFD_RELOC_SPARC_11:
3193 1.1 skrll if (! in_signed_range (val, 0x7ff))
3194 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3195 1.1 skrll _("relocation overflow"));
3196 1.1 skrll insn |= val & 0x7ff;
3197 1.1 skrll break;
3198 1.1 skrll
3199 1.1 skrll case BFD_RELOC_SPARC_10:
3200 1.1 skrll if (! in_signed_range (val, 0x3ff))
3201 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3202 1.1 skrll _("relocation overflow"));
3203 1.1 skrll insn |= val & 0x3ff;
3204 1.1 skrll break;
3205 1.1 skrll
3206 1.1 skrll case BFD_RELOC_SPARC_7:
3207 1.1 skrll if (! in_bitfield_range (val, 0x7f))
3208 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3209 1.1 skrll _("relocation overflow"));
3210 1.1 skrll insn |= val & 0x7f;
3211 1.1 skrll break;
3212 1.1 skrll
3213 1.1 skrll case BFD_RELOC_SPARC_6:
3214 1.1 skrll if (! in_bitfield_range (val, 0x3f))
3215 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3216 1.1 skrll _("relocation overflow"));
3217 1.1 skrll insn |= val & 0x3f;
3218 1.1 skrll break;
3219 1.1 skrll
3220 1.1 skrll case BFD_RELOC_SPARC_5:
3221 1.1 skrll if (! in_bitfield_range (val, 0x1f))
3222 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3223 1.1 skrll _("relocation overflow"));
3224 1.1 skrll insn |= val & 0x1f;
3225 1.1 skrll break;
3226 1.1 skrll
3227 1.1 skrll case BFD_RELOC_SPARC_WDISP16:
3228 1.1 skrll if ((val & 3)
3229 1.1 skrll || val >= 0x1fffc
3230 1.1 skrll || val <= -(offsetT) 0x20008)
3231 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3232 1.1 skrll _("relocation overflow"));
3233 1.1 skrll /* FIXME: The +1 deserves a comment. */
3234 1.1 skrll val = (val >> 2) + 1;
3235 1.1 skrll insn |= ((val & 0xc000) << 6) | (val & 0x3fff);
3236 1.1 skrll break;
3237 1.1 skrll
3238 1.1 skrll case BFD_RELOC_SPARC_WDISP19:
3239 1.1 skrll if ((val & 3)
3240 1.1 skrll || val >= 0xffffc
3241 1.1 skrll || val <= -(offsetT) 0x100008)
3242 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3243 1.1 skrll _("relocation overflow"));
3244 1.1 skrll /* FIXME: The +1 deserves a comment. */
3245 1.1 skrll val = (val >> 2) + 1;
3246 1.1 skrll insn |= val & 0x7ffff;
3247 1.1 skrll break;
3248 1.1 skrll
3249 1.1 skrll case BFD_RELOC_SPARC_HH22:
3250 1.1 skrll val = BSR (val, 32);
3251 1.1 skrll /* Fall through. */
3252 1.1 skrll
3253 1.1 skrll case BFD_RELOC_SPARC_LM22:
3254 1.1 skrll case BFD_RELOC_HI22:
3255 1.1 skrll if (!fixP->fx_addsy)
3256 1.1 skrll insn |= (val >> 10) & 0x3fffff;
3257 1.1 skrll else
3258 1.1 skrll /* FIXME: Need comment explaining why we do this. */
3259 1.1 skrll insn &= ~0xffff;
3260 1.1 skrll break;
3261 1.1 skrll
3262 1.1 skrll case BFD_RELOC_SPARC22:
3263 1.1 skrll if (val & ~0x003fffff)
3264 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3265 1.1 skrll _("relocation overflow"));
3266 1.1 skrll insn |= (val & 0x3fffff);
3267 1.1 skrll break;
3268 1.1 skrll
3269 1.1 skrll case BFD_RELOC_SPARC_HM10:
3270 1.1 skrll val = BSR (val, 32);
3271 1.1 skrll /* Fall through. */
3272 1.1 skrll
3273 1.1 skrll case BFD_RELOC_LO10:
3274 1.1 skrll if (!fixP->fx_addsy)
3275 1.1 skrll insn |= val & 0x3ff;
3276 1.1 skrll else
3277 1.1 skrll /* FIXME: Need comment explaining why we do this. */
3278 1.1 skrll insn &= ~0xff;
3279 1.1 skrll break;
3280 1.1 skrll
3281 1.1 skrll case BFD_RELOC_SPARC_OLO10:
3282 1.1 skrll val &= 0x3ff;
3283 1.1 skrll val += fixP->tc_fix_data;
3284 1.1 skrll /* Fall through. */
3285 1.1 skrll
3286 1.1 skrll case BFD_RELOC_SPARC13:
3287 1.1 skrll if (! in_signed_range (val, 0x1fff))
3288 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3289 1.1 skrll _("relocation overflow"));
3290 1.1 skrll insn |= val & 0x1fff;
3291 1.1 skrll break;
3292 1.1 skrll
3293 1.1 skrll case BFD_RELOC_SPARC_WDISP22:
3294 1.1 skrll val = (val >> 2) + 1;
3295 1.1 skrll /* Fall through. */
3296 1.1 skrll case BFD_RELOC_SPARC_BASE22:
3297 1.1 skrll insn |= val & 0x3fffff;
3298 1.1 skrll break;
3299 1.1 skrll
3300 1.1 skrll case BFD_RELOC_SPARC_H44:
3301 1.1 skrll if (!fixP->fx_addsy)
3302 1.1 skrll {
3303 1.1 skrll bfd_vma tval = val;
3304 1.1 skrll tval >>= 22;
3305 1.1 skrll insn |= tval & 0x3fffff;
3306 1.1 skrll }
3307 1.1 skrll break;
3308 1.1 skrll
3309 1.1 skrll case BFD_RELOC_SPARC_M44:
3310 1.1 skrll if (!fixP->fx_addsy)
3311 1.1 skrll insn |= (val >> 12) & 0x3ff;
3312 1.1 skrll break;
3313 1.1 skrll
3314 1.1 skrll case BFD_RELOC_SPARC_L44:
3315 1.1 skrll if (!fixP->fx_addsy)
3316 1.1 skrll insn |= val & 0xfff;
3317 1.1 skrll break;
3318 1.1 skrll
3319 1.1 skrll case BFD_RELOC_SPARC_HIX22:
3320 1.1 skrll if (!fixP->fx_addsy)
3321 1.1 skrll {
3322 1.1 skrll val ^= ~(offsetT) 0;
3323 1.1 skrll insn |= (val >> 10) & 0x3fffff;
3324 1.1 skrll }
3325 1.1 skrll break;
3326 1.1 skrll
3327 1.1 skrll case BFD_RELOC_SPARC_LOX10:
3328 1.1 skrll if (!fixP->fx_addsy)
3329 1.1 skrll insn |= 0x1c00 | (val & 0x3ff);
3330 1.1 skrll break;
3331 1.1 skrll
3332 1.1 skrll case BFD_RELOC_NONE:
3333 1.1 skrll default:
3334 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
3335 1.1 skrll _("bad or unhandled relocation type: 0x%02x"),
3336 1.1 skrll fixP->fx_r_type);
3337 1.1 skrll break;
3338 1.1 skrll }
3339 1.1 skrll
3340 1.1 skrll if (INSN_BIG_ENDIAN)
3341 1.1 skrll bfd_putb32 (insn, (unsigned char *) buf);
3342 1.1 skrll else
3343 1.1 skrll bfd_putl32 (insn, (unsigned char *) buf);
3344 1.1 skrll }
3345 1.1 skrll
3346 1.1 skrll /* Are we finished with this relocation now? */
3347 1.1 skrll if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
3348 1.1 skrll fixP->fx_done = 1;
3349 1.1 skrll }
3350 1.1 skrll
3351 1.1 skrll /* Translate internal representation of relocation info to BFD target
3352 1.1 skrll format. */
3353 1.1 skrll
3354 1.1 skrll arelent **
3355 1.1 skrll tc_gen_reloc (asection *section, fixS *fixp)
3356 1.1 skrll {
3357 1.1 skrll static arelent *relocs[3];
3358 1.1 skrll arelent *reloc;
3359 1.1 skrll bfd_reloc_code_real_type code;
3360 1.1 skrll
3361 1.1 skrll relocs[0] = reloc = (arelent *) xmalloc (sizeof (arelent));
3362 1.1 skrll relocs[1] = NULL;
3363 1.1 skrll
3364 1.1 skrll reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
3365 1.1 skrll *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
3366 1.1 skrll reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
3367 1.1 skrll
3368 1.1 skrll switch (fixp->fx_r_type)
3369 1.1 skrll {
3370 1.1 skrll case BFD_RELOC_16:
3371 1.1 skrll case BFD_RELOC_32:
3372 1.1 skrll case BFD_RELOC_HI22:
3373 1.1 skrll case BFD_RELOC_LO10:
3374 1.1 skrll case BFD_RELOC_32_PCREL_S2:
3375 1.1 skrll case BFD_RELOC_SPARC13:
3376 1.1 skrll case BFD_RELOC_SPARC22:
3377 1.1 skrll case BFD_RELOC_SPARC_PC22:
3378 1.1 skrll case BFD_RELOC_SPARC_PC10:
3379 1.1 skrll case BFD_RELOC_SPARC_BASE13:
3380 1.1 skrll case BFD_RELOC_SPARC_WDISP16:
3381 1.1 skrll case BFD_RELOC_SPARC_WDISP19:
3382 1.1 skrll case BFD_RELOC_SPARC_WDISP22:
3383 1.1 skrll case BFD_RELOC_64:
3384 1.1 skrll case BFD_RELOC_SPARC_5:
3385 1.1 skrll case BFD_RELOC_SPARC_6:
3386 1.1 skrll case BFD_RELOC_SPARC_7:
3387 1.1 skrll case BFD_RELOC_SPARC_10:
3388 1.1 skrll case BFD_RELOC_SPARC_11:
3389 1.1 skrll case BFD_RELOC_SPARC_HH22:
3390 1.1 skrll case BFD_RELOC_SPARC_HM10:
3391 1.1 skrll case BFD_RELOC_SPARC_LM22:
3392 1.1 skrll case BFD_RELOC_SPARC_PC_HH22:
3393 1.1 skrll case BFD_RELOC_SPARC_PC_HM10:
3394 1.1 skrll case BFD_RELOC_SPARC_PC_LM22:
3395 1.1 skrll case BFD_RELOC_SPARC_H44:
3396 1.1 skrll case BFD_RELOC_SPARC_M44:
3397 1.1 skrll case BFD_RELOC_SPARC_L44:
3398 1.1 skrll case BFD_RELOC_SPARC_HIX22:
3399 1.1 skrll case BFD_RELOC_SPARC_LOX10:
3400 1.1 skrll case BFD_RELOC_SPARC_REV32:
3401 1.1 skrll case BFD_RELOC_SPARC_OLO10:
3402 1.1 skrll case BFD_RELOC_SPARC_UA16:
3403 1.1 skrll case BFD_RELOC_SPARC_UA32:
3404 1.1 skrll case BFD_RELOC_SPARC_UA64:
3405 1.1 skrll case BFD_RELOC_8_PCREL:
3406 1.1 skrll case BFD_RELOC_16_PCREL:
3407 1.1 skrll case BFD_RELOC_32_PCREL:
3408 1.1 skrll case BFD_RELOC_64_PCREL:
3409 1.1 skrll case BFD_RELOC_SPARC_PLT32:
3410 1.1 skrll case BFD_RELOC_SPARC_PLT64:
3411 1.1 skrll case BFD_RELOC_VTABLE_ENTRY:
3412 1.1 skrll case BFD_RELOC_VTABLE_INHERIT:
3413 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_HI22:
3414 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_LO10:
3415 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_ADD:
3416 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_CALL:
3417 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_HI22:
3418 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_LO10:
3419 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_ADD:
3420 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_CALL:
3421 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_HIX22:
3422 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_LOX10:
3423 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_ADD:
3424 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_HI22:
3425 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LO10:
3426 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LD:
3427 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LDX:
3428 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_ADD:
3429 1.1 skrll case BFD_RELOC_SPARC_TLS_LE_HIX22:
3430 1.1 skrll case BFD_RELOC_SPARC_TLS_LE_LOX10:
3431 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPOFF32:
3432 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPOFF64:
3433 1.1 skrll case BFD_RELOC_SPARC_GOTDATA_OP_HIX22:
3434 1.1 skrll case BFD_RELOC_SPARC_GOTDATA_OP_LOX10:
3435 1.1 skrll case BFD_RELOC_SPARC_GOTDATA_OP:
3436 1.1 skrll code = fixp->fx_r_type;
3437 1.1 skrll break;
3438 1.1 skrll default:
3439 1.1 skrll abort ();
3440 1.1 skrll return NULL;
3441 1.1 skrll }
3442 1.1 skrll
3443 1.1 skrll #if defined (OBJ_ELF) || defined (OBJ_AOUT)
3444 1.1 skrll /* If we are generating PIC code, we need to generate a different
3445 1.1 skrll set of relocs. */
3446 1.1 skrll
3447 1.1 skrll #ifdef OBJ_ELF
3448 1.1 skrll #define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
3449 1.1 skrll #else
3450 1.1 skrll #define GOT_NAME "__GLOBAL_OFFSET_TABLE_"
3451 1.1 skrll #endif
3452 1.1 skrll #ifdef TE_VXWORKS
3453 1.1 skrll #define GOTT_BASE "__GOTT_BASE__"
3454 1.1 skrll #define GOTT_INDEX "__GOTT_INDEX__"
3455 1.1 skrll #endif
3456 1.1 skrll
3457 1.1 skrll /* This code must be parallel to the OBJ_ELF tc_fix_adjustable. */
3458 1.1 skrll
3459 1.1 skrll if (sparc_pic_code)
3460 1.1 skrll {
3461 1.1 skrll switch (code)
3462 1.1 skrll {
3463 1.1 skrll case BFD_RELOC_32_PCREL_S2:
3464 1.1 skrll if (generic_force_reloc (fixp))
3465 1.1 skrll code = BFD_RELOC_SPARC_WPLT30;
3466 1.1 skrll break;
3467 1.1 skrll case BFD_RELOC_HI22:
3468 1.1 skrll code = BFD_RELOC_SPARC_GOT22;
3469 1.1 skrll if (fixp->fx_addsy != NULL)
3470 1.1 skrll {
3471 1.1 skrll if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
3472 1.1 skrll code = BFD_RELOC_SPARC_PC22;
3473 1.1 skrll #ifdef TE_VXWORKS
3474 1.1 skrll if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0
3475 1.1 skrll || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0)
3476 1.1 skrll code = BFD_RELOC_HI22; /* Unchanged. */
3477 1.1 skrll #endif
3478 1.1 skrll }
3479 1.1 skrll break;
3480 1.1 skrll case BFD_RELOC_LO10:
3481 1.1 skrll code = BFD_RELOC_SPARC_GOT10;
3482 1.1 skrll if (fixp->fx_addsy != NULL)
3483 1.1 skrll {
3484 1.1 skrll if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
3485 1.1 skrll code = BFD_RELOC_SPARC_PC10;
3486 1.1 skrll #ifdef TE_VXWORKS
3487 1.1 skrll if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0
3488 1.1 skrll || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0)
3489 1.1 skrll code = BFD_RELOC_LO10; /* Unchanged. */
3490 1.1 skrll #endif
3491 1.1 skrll }
3492 1.1 skrll break;
3493 1.1 skrll case BFD_RELOC_SPARC13:
3494 1.1 skrll code = BFD_RELOC_SPARC_GOT13;
3495 1.1 skrll break;
3496 1.1 skrll default:
3497 1.1 skrll break;
3498 1.1 skrll }
3499 1.1 skrll }
3500 1.1 skrll #endif /* defined (OBJ_ELF) || defined (OBJ_AOUT) */
3501 1.1 skrll
3502 1.1 skrll /* Nothing is aligned in DWARF debugging sections. */
3503 1.1 skrll if (bfd_get_section_flags (stdoutput, section) & SEC_DEBUGGING)
3504 1.1 skrll switch (code)
3505 1.1 skrll {
3506 1.1 skrll case BFD_RELOC_16: code = BFD_RELOC_SPARC_UA16; break;
3507 1.1 skrll case BFD_RELOC_32: code = BFD_RELOC_SPARC_UA32; break;
3508 1.1 skrll case BFD_RELOC_64: code = BFD_RELOC_SPARC_UA64; break;
3509 1.1 skrll default: break;
3510 1.1 skrll }
3511 1.1 skrll
3512 1.1 skrll if (code == BFD_RELOC_SPARC_OLO10)
3513 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO10);
3514 1.1 skrll else
3515 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
3516 1.1 skrll if (reloc->howto == 0)
3517 1.1 skrll {
3518 1.1 skrll as_bad_where (fixp->fx_file, fixp->fx_line,
3519 1.1 skrll _("internal error: can't export reloc type %d (`%s')"),
3520 1.1 skrll fixp->fx_r_type, bfd_get_reloc_code_name (code));
3521 1.1 skrll xfree (reloc);
3522 1.1 skrll relocs[0] = NULL;
3523 1.1 skrll return relocs;
3524 1.1 skrll }
3525 1.1 skrll
3526 1.1 skrll /* @@ Why fx_addnumber sometimes and fx_offset other times? */
3527 1.1 skrll #ifdef OBJ_AOUT
3528 1.1 skrll
3529 1.1 skrll if (reloc->howto->pc_relative == 0
3530 1.1 skrll || code == BFD_RELOC_SPARC_PC10
3531 1.1 skrll || code == BFD_RELOC_SPARC_PC22)
3532 1.1 skrll reloc->addend = fixp->fx_addnumber;
3533 1.1 skrll else if (sparc_pic_code
3534 1.1 skrll && fixp->fx_r_type == BFD_RELOC_32_PCREL_S2
3535 1.1 skrll && fixp->fx_addsy != NULL
3536 1.1 skrll && (S_IS_EXTERNAL (fixp->fx_addsy)
3537 1.1 skrll || S_IS_WEAK (fixp->fx_addsy))
3538 1.1 skrll && S_IS_DEFINED (fixp->fx_addsy)
3539 1.1 skrll && ! S_IS_COMMON (fixp->fx_addsy))
3540 1.1 skrll reloc->addend = fixp->fx_addnumber;
3541 1.1 skrll else
3542 1.1 skrll reloc->addend = fixp->fx_offset - reloc->address;
3543 1.1 skrll
3544 1.1 skrll #else /* elf or coff */
3545 1.1 skrll
3546 1.1 skrll if (code != BFD_RELOC_32_PCREL_S2
3547 1.1 skrll && code != BFD_RELOC_SPARC_WDISP22
3548 1.1 skrll && code != BFD_RELOC_SPARC_WDISP16
3549 1.1 skrll && code != BFD_RELOC_SPARC_WDISP19
3550 1.1 skrll && code != BFD_RELOC_SPARC_WPLT30
3551 1.1 skrll && code != BFD_RELOC_SPARC_TLS_GD_CALL
3552 1.1 skrll && code != BFD_RELOC_SPARC_TLS_LDM_CALL)
3553 1.1 skrll reloc->addend = fixp->fx_addnumber;
3554 1.1 skrll else if (symbol_section_p (fixp->fx_addsy))
3555 1.1 skrll reloc->addend = (section->vma
3556 1.1 skrll + fixp->fx_addnumber
3557 1.1 skrll + md_pcrel_from (fixp));
3558 1.1 skrll else
3559 1.1 skrll reloc->addend = fixp->fx_offset;
3560 1.1 skrll #endif
3561 1.1 skrll
3562 1.1 skrll /* We expand R_SPARC_OLO10 to R_SPARC_LO10 and R_SPARC_13
3563 1.1 skrll on the same location. */
3564 1.1 skrll if (code == BFD_RELOC_SPARC_OLO10)
3565 1.1 skrll {
3566 1.1 skrll relocs[1] = reloc = (arelent *) xmalloc (sizeof (arelent));
3567 1.1 skrll relocs[2] = NULL;
3568 1.1 skrll
3569 1.1 skrll reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
3570 1.1 skrll *reloc->sym_ptr_ptr
3571 1.1 skrll = symbol_get_bfdsym (section_symbol (absolute_section));
3572 1.1 skrll reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
3573 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_SPARC13);
3574 1.1 skrll reloc->addend = fixp->tc_fix_data;
3575 1.1 skrll }
3576 1.1 skrll
3577 1.1 skrll return relocs;
3578 1.1 skrll }
3579 1.1 skrll
3580 1.1 skrll /* We have no need to default values of symbols. */
3582 1.1 skrll
3583 1.1 skrll symbolS *
3584 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
3585 1.1 skrll {
3586 1.1 skrll return 0;
3587 1.1 skrll }
3588 1.1 skrll
3589 1.1 skrll /* Round up a section size to the appropriate boundary. */
3590 1.1 skrll
3591 1.1 skrll valueT
3592 1.1 skrll md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
3593 1.1 skrll {
3594 1.1 skrll #ifndef OBJ_ELF
3595 1.1 skrll /* This is not right for ELF; a.out wants it, and COFF will force
3596 1.1 skrll the alignment anyways. */
3597 1.1 skrll valueT align = ((valueT) 1
3598 1.1 skrll << (valueT) bfd_get_section_alignment (stdoutput, segment));
3599 1.1 skrll valueT newsize;
3600 1.1 skrll
3601 1.1 skrll /* Turn alignment value into a mask. */
3602 1.1 skrll align--;
3603 1.1 skrll newsize = (size + align) & ~align;
3604 1.1 skrll return newsize;
3605 1.1 skrll #else
3606 1.1 skrll return size;
3607 1.1 skrll #endif
3608 1.1 skrll }
3609 1.1 skrll
3610 1.1 skrll /* Exactly what point is a PC-relative offset relative TO?
3611 1.1 skrll On the sparc, they're relative to the address of the offset, plus
3612 1.1 skrll its size. This gets us to the following instruction.
3613 1.1 skrll (??? Is this right? FIXME-SOON) */
3614 1.1 skrll long
3615 1.1 skrll md_pcrel_from (fixS *fixP)
3616 1.1 skrll {
3617 1.1 skrll long ret;
3618 1.1 skrll
3619 1.1 skrll ret = fixP->fx_where + fixP->fx_frag->fr_address;
3620 1.1 skrll if (! sparc_pic_code
3621 1.1 skrll || fixP->fx_addsy == NULL
3622 1.1 skrll || symbol_section_p (fixP->fx_addsy))
3623 1.1 skrll ret += fixP->fx_size;
3624 1.1 skrll return ret;
3625 1.1 skrll }
3626 1.1 skrll
3627 1.1 skrll /* Return log2 (VALUE), or -1 if VALUE is not an exact positive power
3629 1.1 skrll of two. */
3630 1.1 skrll
3631 1.1 skrll static int
3632 1.1 skrll mylog2 (int value)
3633 1.1 skrll {
3634 1.1 skrll int shift;
3635 1.1 skrll
3636 1.1 skrll if (value <= 0)
3637 1.1 skrll return -1;
3638 1.1 skrll
3639 1.1 skrll for (shift = 0; (value & 1) == 0; value >>= 1)
3640 1.1 skrll ++shift;
3641 1.1 skrll
3642 1.1 skrll return (value == 1) ? shift : -1;
3643 1.1 skrll }
3644 1.1 skrll
3645 1.1 skrll /* Sort of like s_lcomm. */
3646 1.1 skrll
3647 1.1 skrll #ifndef OBJ_ELF
3648 1.1 skrll static int max_alignment = 15;
3649 1.1 skrll #endif
3650 1.1 skrll
3651 1.1 skrll static void
3652 1.1 skrll s_reserve (int ignore ATTRIBUTE_UNUSED)
3653 1.1 skrll {
3654 1.1 skrll char *name;
3655 1.1 skrll char *p;
3656 1.1 skrll char c;
3657 1.1 skrll int align;
3658 1.1 skrll int size;
3659 1.1 skrll int temp;
3660 1.1 skrll symbolS *symbolP;
3661 1.1 skrll
3662 1.1 skrll name = input_line_pointer;
3663 1.1 skrll c = get_symbol_end ();
3664 1.1 skrll p = input_line_pointer;
3665 1.1 skrll *p = c;
3666 1.1 skrll SKIP_WHITESPACE ();
3667 1.1 skrll
3668 1.1 skrll if (*input_line_pointer != ',')
3669 1.1 skrll {
3670 1.1 skrll as_bad (_("Expected comma after name"));
3671 1.1 skrll ignore_rest_of_line ();
3672 1.1 skrll return;
3673 1.1 skrll }
3674 1.1 skrll
3675 1.1 skrll ++input_line_pointer;
3676 1.1 skrll
3677 1.1 skrll if ((size = get_absolute_expression ()) < 0)
3678 1.1 skrll {
3679 1.1 skrll as_bad (_("BSS length (%d.) <0! Ignored."), size);
3680 1.1 skrll ignore_rest_of_line ();
3681 1.1 skrll return;
3682 1.1 skrll } /* Bad length. */
3683 1.1 skrll
3684 1.1 skrll *p = 0;
3685 1.1 skrll symbolP = symbol_find_or_make (name);
3686 1.1 skrll *p = c;
3687 1.1 skrll
3688 1.1 skrll if (strncmp (input_line_pointer, ",\"bss\"", 6) != 0
3689 1.1 skrll && strncmp (input_line_pointer, ",\".bss\"", 7) != 0)
3690 1.1 skrll {
3691 1.1 skrll as_bad (_("bad .reserve segment -- expected BSS segment"));
3692 1.1 skrll return;
3693 1.1 skrll }
3694 1.1 skrll
3695 1.1 skrll if (input_line_pointer[2] == '.')
3696 1.1 skrll input_line_pointer += 7;
3697 1.1 skrll else
3698 1.1 skrll input_line_pointer += 6;
3699 1.1 skrll SKIP_WHITESPACE ();
3700 1.1 skrll
3701 1.1 skrll if (*input_line_pointer == ',')
3702 1.1 skrll {
3703 1.1 skrll ++input_line_pointer;
3704 1.1 skrll
3705 1.1 skrll SKIP_WHITESPACE ();
3706 1.1 skrll if (*input_line_pointer == '\n')
3707 1.1 skrll {
3708 1.1 skrll as_bad (_("missing alignment"));
3709 1.1 skrll ignore_rest_of_line ();
3710 1.1 skrll return;
3711 1.1 skrll }
3712 1.1 skrll
3713 1.1 skrll align = (int) get_absolute_expression ();
3714 1.1 skrll
3715 1.1 skrll #ifndef OBJ_ELF
3716 1.1 skrll if (align > max_alignment)
3717 1.1 skrll {
3718 1.1 skrll align = max_alignment;
3719 1.1 skrll as_warn (_("alignment too large; assuming %d"), align);
3720 1.1 skrll }
3721 1.1 skrll #endif
3722 1.1 skrll
3723 1.1 skrll if (align < 0)
3724 1.1 skrll {
3725 1.1 skrll as_bad (_("negative alignment"));
3726 1.1 skrll ignore_rest_of_line ();
3727 1.1 skrll return;
3728 1.1 skrll }
3729 1.1 skrll
3730 1.1 skrll if (align != 0)
3731 1.1 skrll {
3732 1.1 skrll temp = mylog2 (align);
3733 1.1 skrll if (temp < 0)
3734 1.1 skrll {
3735 1.1 skrll as_bad (_("alignment not a power of 2"));
3736 1.1 skrll ignore_rest_of_line ();
3737 1.1 skrll return;
3738 1.1 skrll }
3739 1.1 skrll
3740 1.1 skrll align = temp;
3741 1.1 skrll }
3742 1.1 skrll
3743 1.1 skrll record_alignment (bss_section, align);
3744 1.1 skrll }
3745 1.1 skrll else
3746 1.1 skrll align = 0;
3747 1.1 skrll
3748 1.1 skrll if (!S_IS_DEFINED (symbolP)
3749 1.1 skrll #ifdef OBJ_AOUT
3750 1.1 skrll && S_GET_OTHER (symbolP) == 0
3751 1.1 skrll && S_GET_DESC (symbolP) == 0
3752 1.1 skrll #endif
3753 1.1 skrll )
3754 1.1 skrll {
3755 1.1 skrll if (! need_pass_2)
3756 1.1 skrll {
3757 1.1 skrll char *pfrag;
3758 1.1 skrll segT current_seg = now_seg;
3759 1.1 skrll subsegT current_subseg = now_subseg;
3760 1.1 skrll
3761 1.1 skrll /* Switch to bss. */
3762 1.1 skrll subseg_set (bss_section, 1);
3763 1.1 skrll
3764 1.1 skrll if (align)
3765 1.1 skrll /* Do alignment. */
3766 1.1 skrll frag_align (align, 0, 0);
3767 1.1 skrll
3768 1.1 skrll /* Detach from old frag. */
3769 1.1 skrll if (S_GET_SEGMENT (symbolP) == bss_section)
3770 1.1 skrll symbol_get_frag (symbolP)->fr_symbol = NULL;
3771 1.1 skrll
3772 1.1 skrll symbol_set_frag (symbolP, frag_now);
3773 1.1 skrll pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
3774 1.1 skrll (offsetT) size, (char *) 0);
3775 1.1.1.2 christos *pfrag = 0;
3776 1.1 skrll
3777 1.1.1.2 christos S_SET_SEGMENT (symbolP, bss_section);
3778 1.1 skrll
3779 1.1 skrll subseg_set (current_seg, current_subseg);
3780 1.1 skrll
3781 1.1 skrll #ifdef OBJ_ELF
3782 1.1 skrll S_SET_SIZE (symbolP, size);
3783 1.1 skrll #endif
3784 1.1 skrll }
3785 1.1 skrll }
3786 1.1 skrll else
3787 1.1 skrll {
3788 1.1 skrll as_warn (_("Ignoring attempt to re-define symbol %s"),
3789 1.1 skrll S_GET_NAME (symbolP));
3790 1.1 skrll }
3791 1.1 skrll
3792 1.1 skrll demand_empty_rest_of_line ();
3793 1.1 skrll }
3794 1.1 skrll
3795 1.1 skrll static void
3796 1.1 skrll s_common (int ignore ATTRIBUTE_UNUSED)
3797 1.1 skrll {
3798 1.1 skrll char *name;
3799 1.1 skrll char c;
3800 1.1 skrll char *p;
3801 1.1 skrll offsetT temp, size;
3802 1.1 skrll symbolS *symbolP;
3803 1.1 skrll
3804 1.1 skrll name = input_line_pointer;
3805 1.1 skrll c = get_symbol_end ();
3806 1.1 skrll /* Just after name is now '\0'. */
3807 1.1 skrll p = input_line_pointer;
3808 1.1 skrll *p = c;
3809 1.1 skrll SKIP_WHITESPACE ();
3810 1.1 skrll if (*input_line_pointer != ',')
3811 1.1 skrll {
3812 1.1 skrll as_bad (_("Expected comma after symbol-name"));
3813 1.1 skrll ignore_rest_of_line ();
3814 1.1 skrll return;
3815 1.1 skrll }
3816 1.1 skrll
3817 1.1 skrll /* Skip ','. */
3818 1.1 skrll input_line_pointer++;
3819 1.1 skrll
3820 1.1 skrll if ((temp = get_absolute_expression ()) < 0)
3821 1.1 skrll {
3822 1.1 skrll as_bad (_(".COMMon length (%lu) out of range ignored"),
3823 1.1 skrll (unsigned long) temp);
3824 1.1 skrll ignore_rest_of_line ();
3825 1.1 skrll return;
3826 1.1 skrll }
3827 1.1 skrll size = temp;
3828 1.1 skrll *p = 0;
3829 1.1 skrll symbolP = symbol_find_or_make (name);
3830 1.1 skrll *p = c;
3831 1.1 skrll if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
3832 1.1 skrll {
3833 1.1 skrll as_bad (_("Ignoring attempt to re-define symbol"));
3834 1.1 skrll ignore_rest_of_line ();
3835 1.1 skrll return;
3836 1.1 skrll }
3837 1.1 skrll if (S_GET_VALUE (symbolP) != 0)
3838 1.1 skrll {
3839 1.1 skrll if (S_GET_VALUE (symbolP) != (valueT) size)
3840 1.1 skrll {
3841 1.1 skrll as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
3842 1.1 skrll S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), (long) size);
3843 1.1 skrll }
3844 1.1 skrll }
3845 1.1 skrll else
3846 1.1 skrll {
3847 1.1 skrll #ifndef OBJ_ELF
3848 1.1 skrll S_SET_VALUE (symbolP, (valueT) size);
3849 1.1 skrll S_SET_EXTERNAL (symbolP);
3850 1.1 skrll #endif
3851 1.1 skrll }
3852 1.1 skrll know (symbol_get_frag (symbolP) == &zero_address_frag);
3853 1.1 skrll if (*input_line_pointer != ',')
3854 1.1 skrll {
3855 1.1 skrll as_bad (_("Expected comma after common length"));
3856 1.1 skrll ignore_rest_of_line ();
3857 1.1 skrll return;
3858 1.1 skrll }
3859 1.1 skrll input_line_pointer++;
3860 1.1 skrll SKIP_WHITESPACE ();
3861 1.1 skrll if (*input_line_pointer != '"')
3862 1.1 skrll {
3863 1.1 skrll temp = get_absolute_expression ();
3864 1.1 skrll
3865 1.1 skrll #ifndef OBJ_ELF
3866 1.1 skrll if (temp > max_alignment)
3867 1.1 skrll {
3868 1.1 skrll temp = max_alignment;
3869 1.1 skrll as_warn (_("alignment too large; assuming %ld"), (long) temp);
3870 1.1 skrll }
3871 1.1 skrll #endif
3872 1.1 skrll
3873 1.1 skrll if (temp < 0)
3874 1.1 skrll {
3875 1.1 skrll as_bad (_("negative alignment"));
3876 1.1 skrll ignore_rest_of_line ();
3877 1.1 skrll return;
3878 1.1 skrll }
3879 1.1 skrll
3880 1.1 skrll #ifdef OBJ_ELF
3881 1.1 skrll if (symbol_get_obj (symbolP)->local)
3882 1.1 skrll {
3883 1.1 skrll segT old_sec;
3884 1.1 skrll int old_subsec;
3885 1.1 skrll int align;
3886 1.1 skrll
3887 1.1 skrll old_sec = now_seg;
3888 1.1 skrll old_subsec = now_subseg;
3889 1.1 skrll
3890 1.1 skrll if (temp == 0)
3891 1.1 skrll align = 0;
3892 1.1 skrll else
3893 1.1 skrll align = mylog2 (temp);
3894 1.1 skrll
3895 1.1 skrll if (align < 0)
3896 1.1 skrll {
3897 1.1 skrll as_bad (_("alignment not a power of 2"));
3898 1.1 skrll ignore_rest_of_line ();
3899 1.1 skrll return;
3900 1.1 skrll }
3901 1.1 skrll
3902 1.1 skrll record_alignment (bss_section, align);
3903 1.1 skrll subseg_set (bss_section, 0);
3904 1.1 skrll if (align)
3905 1.1 skrll frag_align (align, 0, 0);
3906 1.1 skrll if (S_GET_SEGMENT (symbolP) == bss_section)
3907 1.1 skrll symbol_get_frag (symbolP)->fr_symbol = 0;
3908 1.1 skrll symbol_set_frag (symbolP, frag_now);
3909 1.1 skrll p = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
3910 1.1 skrll (offsetT) size, (char *) 0);
3911 1.1 skrll *p = 0;
3912 1.1 skrll S_SET_SEGMENT (symbolP, bss_section);
3913 1.1 skrll S_CLEAR_EXTERNAL (symbolP);
3914 1.1 skrll S_SET_SIZE (symbolP, size);
3915 1.1 skrll subseg_set (old_sec, old_subsec);
3916 1.1 skrll }
3917 1.1 skrll else
3918 1.1 skrll #endif /* OBJ_ELF */
3919 1.1 skrll {
3920 1.1 skrll allocate_common:
3921 1.1 skrll S_SET_VALUE (symbolP, (valueT) size);
3922 1.1 skrll #ifdef OBJ_ELF
3923 1.1 skrll S_SET_ALIGN (symbolP, temp);
3924 1.1 skrll S_SET_SIZE (symbolP, size);
3925 1.1 skrll #endif
3926 1.1 skrll S_SET_EXTERNAL (symbolP);
3927 1.1 skrll S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
3928 1.1 skrll }
3929 1.1 skrll }
3930 1.1 skrll else
3931 1.1 skrll {
3932 1.1 skrll input_line_pointer++;
3933 1.1 skrll /* @@ Some use the dot, some don't. Can we get some consistency?? */
3934 1.1 skrll if (*input_line_pointer == '.')
3935 1.1 skrll input_line_pointer++;
3936 1.1 skrll /* @@ Some say data, some say bss. */
3937 1.1 skrll if (strncmp (input_line_pointer, "bss\"", 4)
3938 1.1 skrll && strncmp (input_line_pointer, "data\"", 5))
3939 1.1 skrll {
3940 1.1 skrll while (*--input_line_pointer != '"')
3941 1.1 skrll ;
3942 1.1 skrll input_line_pointer--;
3943 1.1 skrll goto bad_common_segment;
3944 1.1 skrll }
3945 1.1 skrll while (*input_line_pointer++ != '"')
3946 1.1 skrll ;
3947 1.1 skrll goto allocate_common;
3948 1.1 skrll }
3949 1.1 skrll
3950 1.1 skrll symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
3951 1.1 skrll
3952 1.1 skrll demand_empty_rest_of_line ();
3953 1.1 skrll return;
3954 1.1 skrll
3955 1.1 skrll {
3956 1.1 skrll bad_common_segment:
3957 1.1 skrll p = input_line_pointer;
3958 1.1 skrll while (*p && *p != '\n')
3959 1.1 skrll p++;
3960 1.1 skrll c = *p;
3961 1.1 skrll *p = '\0';
3962 1.1 skrll as_bad (_("bad .common segment %s"), input_line_pointer + 1);
3963 1.1 skrll *p = c;
3964 1.1 skrll input_line_pointer = p;
3965 1.1 skrll ignore_rest_of_line ();
3966 1.1 skrll return;
3967 1.1 skrll }
3968 1.1 skrll }
3969 1.1 skrll
3970 1.1 skrll /* Handle the .empty pseudo-op. This suppresses the warnings about
3971 1.1 skrll invalid delay slot usage. */
3972 1.1 skrll
3973 1.1 skrll static void
3974 1.1 skrll s_empty (int ignore ATTRIBUTE_UNUSED)
3975 1.1 skrll {
3976 1.1 skrll /* The easy way to implement is to just forget about the last
3977 1.1 skrll instruction. */
3978 1.1 skrll last_insn = NULL;
3979 1.1 skrll }
3980 1.1 skrll
3981 1.1 skrll static void
3982 1.1 skrll s_seg (int ignore ATTRIBUTE_UNUSED)
3983 1.1 skrll {
3984 1.1 skrll
3985 1.1 skrll if (strncmp (input_line_pointer, "\"text\"", 6) == 0)
3986 1.1 skrll {
3987 1.1 skrll input_line_pointer += 6;
3988 1.1 skrll s_text (0);
3989 1.1 skrll return;
3990 1.1 skrll }
3991 1.1 skrll if (strncmp (input_line_pointer, "\"data\"", 6) == 0)
3992 1.1 skrll {
3993 1.1 skrll input_line_pointer += 6;
3994 1.1 skrll s_data (0);
3995 1.1 skrll return;
3996 1.1 skrll }
3997 1.1 skrll if (strncmp (input_line_pointer, "\"data1\"", 7) == 0)
3998 1.1 skrll {
3999 1.1 skrll input_line_pointer += 7;
4000 1.1 skrll s_data1 ();
4001 1.1 skrll return;
4002 1.1 skrll }
4003 1.1 skrll if (strncmp (input_line_pointer, "\"bss\"", 5) == 0)
4004 1.1 skrll {
4005 1.1 skrll input_line_pointer += 5;
4006 1.1 skrll /* We only support 2 segments -- text and data -- for now, so
4007 1.1 skrll things in the "bss segment" will have to go into data for now.
4008 1.1 skrll You can still allocate SEG_BSS stuff with .lcomm or .reserve. */
4009 1.1 skrll subseg_set (data_section, 255); /* FIXME-SOMEDAY. */
4010 1.1 skrll return;
4011 1.1 skrll }
4012 1.1 skrll as_bad (_("Unknown segment type"));
4013 1.1 skrll demand_empty_rest_of_line ();
4014 1.1 skrll }
4015 1.1 skrll
4016 1.1 skrll static void
4017 1.1 skrll s_data1 (void)
4018 1.1 skrll {
4019 1.1 skrll subseg_set (data_section, 1);
4020 1.1 skrll demand_empty_rest_of_line ();
4021 1.1 skrll }
4022 1.1 skrll
4023 1.1 skrll static void
4024 1.1 skrll s_proc (int ignore ATTRIBUTE_UNUSED)
4025 1.1 skrll {
4026 1.1 skrll while (!is_end_of_line[(unsigned char) *input_line_pointer])
4027 1.1 skrll {
4028 1.1 skrll ++input_line_pointer;
4029 1.1 skrll }
4030 1.1 skrll ++input_line_pointer;
4031 1.1 skrll }
4032 1.1 skrll
4033 1.1 skrll /* This static variable is set by s_uacons to tell sparc_cons_align
4034 1.1 skrll that the expression does not need to be aligned. */
4035 1.1 skrll
4036 1.1 skrll static int sparc_no_align_cons = 0;
4037 1.1 skrll
4038 1.1 skrll /* This static variable is set by sparc_cons to emit requested types
4039 1.1 skrll of relocations in cons_fix_new_sparc. */
4040 1.1 skrll
4041 1.1 skrll static const char *sparc_cons_special_reloc;
4042 1.1 skrll
4043 1.1 skrll /* This handles the unaligned space allocation pseudo-ops, such as
4044 1.1 skrll .uaword. .uaword is just like .word, but the value does not need
4045 1.1 skrll to be aligned. */
4046 1.1 skrll
4047 1.1 skrll static void
4048 1.1 skrll s_uacons (int bytes)
4049 1.1 skrll {
4050 1.1 skrll /* Tell sparc_cons_align not to align this value. */
4051 1.1 skrll sparc_no_align_cons = 1;
4052 1.1 skrll cons (bytes);
4053 1.1 skrll sparc_no_align_cons = 0;
4054 1.1 skrll }
4055 1.1 skrll
4056 1.1 skrll /* This handles the native word allocation pseudo-op .nword.
4057 1.1 skrll For sparc_arch_size 32 it is equivalent to .word, for
4058 1.1 skrll sparc_arch_size 64 it is equivalent to .xword. */
4059 1.1 skrll
4060 1.1 skrll static void
4061 1.1 skrll s_ncons (int bytes ATTRIBUTE_UNUSED)
4062 1.1 skrll {
4063 1.1 skrll cons (sparc_arch_size == 32 ? 4 : 8);
4064 1.1 skrll }
4065 1.1 skrll
4066 1.1 skrll #ifdef OBJ_ELF
4067 1.1 skrll /* Handle the SPARC ELF .register pseudo-op. This sets the binding of a
4068 1.1 skrll global register.
4069 1.1 skrll The syntax is:
4070 1.1 skrll
4071 1.1 skrll .register %g[2367],{#scratch|symbolname|#ignore}
4072 1.1 skrll */
4073 1.1 skrll
4074 1.1 skrll static void
4075 1.1 skrll s_register (int ignore ATTRIBUTE_UNUSED)
4076 1.1 skrll {
4077 1.1 skrll char c;
4078 1.1 skrll int reg;
4079 1.1 skrll int flags;
4080 1.1 skrll const char *regname;
4081 1.1 skrll
4082 1.1 skrll if (input_line_pointer[0] != '%'
4083 1.1 skrll || input_line_pointer[1] != 'g'
4084 1.1 skrll || ((input_line_pointer[2] & ~1) != '2'
4085 1.1 skrll && (input_line_pointer[2] & ~1) != '6')
4086 1.1 skrll || input_line_pointer[3] != ',')
4087 1.1 skrll as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}"));
4088 1.1 skrll reg = input_line_pointer[2] - '0';
4089 1.1 skrll input_line_pointer += 4;
4090 1.1 skrll
4091 1.1 skrll if (*input_line_pointer == '#')
4092 1.1 skrll {
4093 1.1 skrll ++input_line_pointer;
4094 1.1 skrll regname = input_line_pointer;
4095 1.1 skrll c = get_symbol_end ();
4096 1.1 skrll if (strcmp (regname, "scratch") && strcmp (regname, "ignore"))
4097 1.1 skrll as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}"));
4098 1.1 skrll if (regname[0] == 'i')
4099 1.1 skrll regname = NULL;
4100 1.1 skrll else
4101 1.1 skrll regname = "";
4102 1.1 skrll }
4103 1.1 skrll else
4104 1.1 skrll {
4105 1.1 skrll regname = input_line_pointer;
4106 1.1 skrll c = get_symbol_end ();
4107 1.1 skrll }
4108 1.1 skrll if (sparc_arch_size == 64)
4109 1.1 skrll {
4110 1.1 skrll if (globals[reg])
4111 1.1 skrll {
4112 1.1 skrll if ((regname && globals[reg] != (symbolS *) 1
4113 1.1 skrll && strcmp (S_GET_NAME (globals[reg]), regname))
4114 1.1 skrll || ((regname != NULL) ^ (globals[reg] != (symbolS *) 1)))
4115 1.1 skrll as_bad (_("redefinition of global register"));
4116 1.1 skrll }
4117 1.1 skrll else
4118 1.1 skrll {
4119 1.1 skrll if (regname == NULL)
4120 1.1 skrll globals[reg] = (symbolS *) 1;
4121 1.1 skrll else
4122 1.1 skrll {
4123 1.1 skrll if (*regname)
4124 1.1 skrll {
4125 1.1 skrll if (symbol_find (regname))
4126 1.1 skrll as_bad (_("Register symbol %s already defined."),
4127 1.1 skrll regname);
4128 1.1 skrll }
4129 1.1 skrll globals[reg] = symbol_make (regname);
4130 1.1 skrll flags = symbol_get_bfdsym (globals[reg])->flags;
4131 1.1 skrll if (! *regname)
4132 1.1 skrll flags = flags & ~(BSF_GLOBAL|BSF_LOCAL|BSF_WEAK);
4133 1.1 skrll if (! (flags & (BSF_GLOBAL|BSF_LOCAL|BSF_WEAK)))
4134 1.1 skrll flags |= BSF_GLOBAL;
4135 1.1 skrll symbol_get_bfdsym (globals[reg])->flags = flags;
4136 1.1 skrll S_SET_VALUE (globals[reg], (valueT) reg);
4137 1.1 skrll S_SET_ALIGN (globals[reg], reg);
4138 1.1 skrll S_SET_SIZE (globals[reg], 0);
4139 1.1 skrll /* Although we actually want undefined_section here,
4140 1.1 skrll we have to use absolute_section, because otherwise
4141 1.1 skrll generic as code will make it a COM section.
4142 1.1 skrll We fix this up in sparc_adjust_symtab. */
4143 1.1 skrll S_SET_SEGMENT (globals[reg], absolute_section);
4144 1.1 skrll S_SET_OTHER (globals[reg], 0);
4145 1.1 skrll elf_symbol (symbol_get_bfdsym (globals[reg]))
4146 1.1 skrll ->internal_elf_sym.st_info =
4147 1.1 skrll ELF_ST_INFO(STB_GLOBAL, STT_REGISTER);
4148 1.1 skrll elf_symbol (symbol_get_bfdsym (globals[reg]))
4149 1.1 skrll ->internal_elf_sym.st_shndx = SHN_UNDEF;
4150 1.1 skrll }
4151 1.1 skrll }
4152 1.1 skrll }
4153 1.1 skrll
4154 1.1 skrll *input_line_pointer = c;
4155 1.1 skrll
4156 1.1 skrll demand_empty_rest_of_line ();
4157 1.1 skrll }
4158 1.1 skrll
4159 1.1 skrll /* Adjust the symbol table. We set undefined sections for STT_REGISTER
4160 1.1 skrll symbols which need it. */
4161 1.1 skrll
4162 1.1 skrll void
4163 1.1 skrll sparc_adjust_symtab (void)
4164 1.1 skrll {
4165 1.1 skrll symbolS *sym;
4166 1.1 skrll
4167 1.1 skrll for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
4168 1.1 skrll {
4169 1.1 skrll if (ELF_ST_TYPE (elf_symbol (symbol_get_bfdsym (sym))
4170 1.1 skrll ->internal_elf_sym.st_info) != STT_REGISTER)
4171 1.1 skrll continue;
4172 1.1 skrll
4173 1.1 skrll if (ELF_ST_TYPE (elf_symbol (symbol_get_bfdsym (sym))
4174 1.1 skrll ->internal_elf_sym.st_shndx != SHN_UNDEF))
4175 1.1 skrll continue;
4176 1.1 skrll
4177 1.1 skrll S_SET_SEGMENT (sym, undefined_section);
4178 1.1 skrll }
4179 1.1 skrll }
4180 1.1 skrll #endif
4181 1.1 skrll
4182 1.1 skrll /* If the --enforce-aligned-data option is used, we require .word,
4183 1.1 skrll et. al., to be aligned correctly. We do it by setting up an
4184 1.1 skrll rs_align_code frag, and checking in HANDLE_ALIGN to make sure that
4185 1.1 skrll no unexpected alignment was introduced.
4186 1.1 skrll
4187 1.1 skrll The SunOS and Solaris native assemblers enforce aligned data by
4188 1.1 skrll default. We don't want to do that, because gcc can deliberately
4189 1.1 skrll generate misaligned data if the packed attribute is used. Instead,
4190 1.1 skrll we permit misaligned data by default, and permit the user to set an
4191 1.1 skrll option to check for it. */
4192 1.1 skrll
4193 1.1 skrll void
4194 1.1 skrll sparc_cons_align (int nbytes)
4195 1.1 skrll {
4196 1.1 skrll int nalign;
4197 1.1.1.2 christos
4198 1.1 skrll /* Only do this if we are enforcing aligned data. */
4199 1.1 skrll if (! enforce_aligned_data)
4200 1.1 skrll return;
4201 1.1 skrll
4202 1.1 skrll /* Don't align if this is an unaligned pseudo-op. */
4203 1.1 skrll if (sparc_no_align_cons)
4204 1.1 skrll return;
4205 1.1 skrll
4206 1.1.1.2 christos nalign = mylog2 (nbytes);
4207 1.1.1.2 christos if (nalign == 0)
4208 1.1 skrll return;
4209 1.1 skrll
4210 1.1 skrll gas_assert (nalign > 0);
4211 1.1 skrll
4212 1.1 skrll if (now_seg == absolute_section)
4213 1.1 skrll {
4214 1.1 skrll if ((abs_section_offset & ((1 << nalign) - 1)) != 0)
4215 1.1 skrll as_bad (_("misaligned data"));
4216 1.1 skrll return;
4217 1.1 skrll }
4218 1.1 skrll
4219 1.1 skrll frag_var (rs_align_test, 1, 1, (relax_substateT) 0,
4220 1.1 skrll (symbolS *) NULL, (offsetT) nalign, (char *) NULL);
4221 1.1 skrll
4222 1.1 skrll record_alignment (now_seg, nalign);
4223 1.1 skrll }
4224 1.1 skrll
4225 1.1 skrll /* This is called from HANDLE_ALIGN in tc-sparc.h. */
4226 1.1 skrll
4227 1.1 skrll void
4228 1.1 skrll sparc_handle_align (fragS *fragp)
4229 1.1 skrll {
4230 1.1 skrll int count, fix;
4231 1.1 skrll char *p;
4232 1.1 skrll
4233 1.1 skrll count = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
4234 1.1 skrll
4235 1.1 skrll switch (fragp->fr_type)
4236 1.1 skrll {
4237 1.1 skrll case rs_align_test:
4238 1.1 skrll if (count != 0)
4239 1.1 skrll as_bad_where (fragp->fr_file, fragp->fr_line, _("misaligned data"));
4240 1.1 skrll break;
4241 1.1 skrll
4242 1.1 skrll case rs_align_code:
4243 1.1 skrll p = fragp->fr_literal + fragp->fr_fix;
4244 1.1 skrll fix = 0;
4245 1.1 skrll
4246 1.1 skrll if (count & 3)
4247 1.1 skrll {
4248 1.1 skrll fix = count & 3;
4249 1.1 skrll memset (p, 0, fix);
4250 1.1 skrll p += fix;
4251 1.1 skrll count -= fix;
4252 1.1 skrll }
4253 1.1 skrll
4254 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture) && count > 8)
4255 1.1 skrll {
4256 1.1 skrll unsigned wval = (0x30680000 | count >> 2); /* ba,a,pt %xcc, 1f */
4257 1.1 skrll if (INSN_BIG_ENDIAN)
4258 1.1 skrll number_to_chars_bigendian (p, wval, 4);
4259 1.1 skrll else
4260 1.1 skrll number_to_chars_littleendian (p, wval, 4);
4261 1.1 skrll p += 4;
4262 1.1 skrll count -= 4;
4263 1.1 skrll fix += 4;
4264 1.1 skrll }
4265 1.1 skrll
4266 1.1 skrll if (INSN_BIG_ENDIAN)
4267 1.1 skrll number_to_chars_bigendian (p, 0x01000000, 4);
4268 1.1 skrll else
4269 1.1 skrll number_to_chars_littleendian (p, 0x01000000, 4);
4270 1.1 skrll
4271 1.1 skrll fragp->fr_fix += fix;
4272 1.1 skrll fragp->fr_var = 4;
4273 1.1 skrll break;
4274 1.1 skrll
4275 1.1 skrll default:
4276 1.1 skrll break;
4277 1.1 skrll }
4278 1.1 skrll }
4279 1.1 skrll
4280 1.1 skrll #ifdef OBJ_ELF
4281 1.1 skrll /* Some special processing for a Sparc ELF file. */
4282 1.1 skrll
4283 1.1 skrll void
4284 1.1 skrll sparc_elf_final_processing (void)
4285 1.1 skrll {
4286 1.1 skrll /* Set the Sparc ELF flag bits. FIXME: There should probably be some
4287 1.1 skrll sort of BFD interface for this. */
4288 1.1 skrll if (sparc_arch_size == 64)
4289 1.1 skrll {
4290 1.1 skrll switch (sparc_memory_model)
4291 1.1 skrll {
4292 1.1 skrll case MM_RMO:
4293 1.1 skrll elf_elfheader (stdoutput)->e_flags |= EF_SPARCV9_RMO;
4294 1.1 skrll break;
4295 1.1 skrll case MM_PSO:
4296 1.1 skrll elf_elfheader (stdoutput)->e_flags |= EF_SPARCV9_PSO;
4297 1.1 skrll break;
4298 1.1 skrll default:
4299 1.1 skrll break;
4300 1.1 skrll }
4301 1.1 skrll }
4302 1.1 skrll else if (current_architecture >= SPARC_OPCODE_ARCH_V9)
4303 1.1 skrll elf_elfheader (stdoutput)->e_flags |= EF_SPARC_32PLUS;
4304 1.1 skrll if (current_architecture == SPARC_OPCODE_ARCH_V9A)
4305 1.1 skrll elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1;
4306 1.1 skrll else if (current_architecture == SPARC_OPCODE_ARCH_V9B)
4307 1.1 skrll elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1|EF_SPARC_SUN_US3;
4308 1.1 skrll }
4309 1.1 skrll
4310 1.1 skrll void
4311 1.1 skrll sparc_cons (expressionS *exp, int size)
4312 1.1 skrll {
4313 1.1 skrll char *save;
4314 1.1 skrll
4315 1.1 skrll SKIP_WHITESPACE ();
4316 1.1 skrll sparc_cons_special_reloc = NULL;
4317 1.1 skrll save = input_line_pointer;
4318 1.1 skrll if (input_line_pointer[0] == '%'
4319 1.1 skrll && input_line_pointer[1] == 'r'
4320 1.1 skrll && input_line_pointer[2] == '_')
4321 1.1 skrll {
4322 1.1 skrll if (strncmp (input_line_pointer + 3, "disp", 4) == 0)
4323 1.1 skrll {
4324 1.1 skrll input_line_pointer += 7;
4325 1.1 skrll sparc_cons_special_reloc = "disp";
4326 1.1 skrll }
4327 1.1 skrll else if (strncmp (input_line_pointer + 3, "plt", 3) == 0)
4328 1.1 skrll {
4329 1.1 skrll if (size != 4 && size != 8)
4330 1.1 skrll as_bad (_("Illegal operands: %%r_plt in %d-byte data field"), size);
4331 1.1 skrll else
4332 1.1 skrll {
4333 1.1 skrll input_line_pointer += 6;
4334 1.1 skrll sparc_cons_special_reloc = "plt";
4335 1.1 skrll }
4336 1.1 skrll }
4337 1.1 skrll else if (strncmp (input_line_pointer + 3, "tls_dtpoff", 10) == 0)
4338 1.1 skrll {
4339 1.1 skrll if (size != 4 && size != 8)
4340 1.1 skrll as_bad (_("Illegal operands: %%r_tls_dtpoff in %d-byte data field"), size);
4341 1.1 skrll else
4342 1.1 skrll {
4343 1.1 skrll input_line_pointer += 13;
4344 1.1 skrll sparc_cons_special_reloc = "tls_dtpoff";
4345 1.1 skrll }
4346 1.1 skrll }
4347 1.1 skrll if (sparc_cons_special_reloc)
4348 1.1 skrll {
4349 1.1 skrll int bad = 0;
4350 1.1 skrll
4351 1.1 skrll switch (size)
4352 1.1 skrll {
4353 1.1 skrll case 1:
4354 1.1 skrll if (*input_line_pointer != '8')
4355 1.1 skrll bad = 1;
4356 1.1 skrll input_line_pointer--;
4357 1.1 skrll break;
4358 1.1 skrll case 2:
4359 1.1 skrll if (input_line_pointer[0] != '1' || input_line_pointer[1] != '6')
4360 1.1 skrll bad = 1;
4361 1.1 skrll break;
4362 1.1 skrll case 4:
4363 1.1 skrll if (input_line_pointer[0] != '3' || input_line_pointer[1] != '2')
4364 1.1 skrll bad = 1;
4365 1.1 skrll break;
4366 1.1 skrll case 8:
4367 1.1 skrll if (input_line_pointer[0] != '6' || input_line_pointer[1] != '4')
4368 1.1 skrll bad = 1;
4369 1.1 skrll break;
4370 1.1 skrll default:
4371 1.1 skrll bad = 1;
4372 1.1 skrll break;
4373 1.1 skrll }
4374 1.1 skrll
4375 1.1 skrll if (bad)
4376 1.1 skrll {
4377 1.1 skrll as_bad (_("Illegal operands: Only %%r_%s%d allowed in %d-byte data fields"),
4378 1.1 skrll sparc_cons_special_reloc, size * 8, size);
4379 1.1 skrll }
4380 1.1 skrll else
4381 1.1 skrll {
4382 1.1 skrll input_line_pointer += 2;
4383 1.1 skrll if (*input_line_pointer != '(')
4384 1.1 skrll {
4385 1.1 skrll as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
4386 1.1 skrll sparc_cons_special_reloc, size * 8);
4387 1.1 skrll bad = 1;
4388 1.1 skrll }
4389 1.1 skrll }
4390 1.1 skrll
4391 1.1 skrll if (bad)
4392 1.1 skrll {
4393 1.1 skrll input_line_pointer = save;
4394 1.1 skrll sparc_cons_special_reloc = NULL;
4395 1.1 skrll }
4396 1.1 skrll else
4397 1.1 skrll {
4398 1.1 skrll int c;
4399 1.1 skrll char *end = ++input_line_pointer;
4400 1.1 skrll int npar = 0;
4401 1.1 skrll
4402 1.1 skrll while (! is_end_of_line[(c = *end)])
4403 1.1 skrll {
4404 1.1 skrll if (c == '(')
4405 1.1 skrll npar++;
4406 1.1 skrll else if (c == ')')
4407 1.1 skrll {
4408 1.1 skrll if (!npar)
4409 1.1 skrll break;
4410 1.1 skrll npar--;
4411 1.1 skrll }
4412 1.1 skrll end++;
4413 1.1 skrll }
4414 1.1 skrll
4415 1.1 skrll if (c != ')')
4416 1.1 skrll as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
4417 1.1 skrll sparc_cons_special_reloc, size * 8);
4418 1.1 skrll else
4419 1.1 skrll {
4420 1.1 skrll *end = '\0';
4421 1.1 skrll expression (exp);
4422 1.1 skrll *end = c;
4423 1.1 skrll if (input_line_pointer != end)
4424 1.1 skrll {
4425 1.1 skrll as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
4426 1.1 skrll sparc_cons_special_reloc, size * 8);
4427 1.1 skrll }
4428 1.1 skrll else
4429 1.1 skrll {
4430 1.1 skrll input_line_pointer++;
4431 1.1 skrll SKIP_WHITESPACE ();
4432 1.1 skrll c = *input_line_pointer;
4433 1.1 skrll if (! is_end_of_line[c] && c != ',')
4434 1.1 skrll as_bad (_("Illegal operands: garbage after %%r_%s%d()"),
4435 1.1 skrll sparc_cons_special_reloc, size * 8);
4436 1.1 skrll }
4437 1.1 skrll }
4438 1.1 skrll }
4439 1.1 skrll }
4440 1.1 skrll }
4441 1.1 skrll if (sparc_cons_special_reloc == NULL)
4442 1.1 skrll expression (exp);
4443 1.1 skrll }
4444 1.1 skrll
4445 1.1 skrll #endif
4446 1.1 skrll
4447 1.1 skrll /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
4448 1.1 skrll reloc for a cons. We could use the definition there, except that
4449 1.1 skrll we want to handle little endian relocs specially. */
4450 1.1 skrll
4451 1.1 skrll void
4452 1.1 skrll cons_fix_new_sparc (fragS *frag,
4453 1.1 skrll int where,
4454 1.1 skrll unsigned int nbytes,
4455 1.1 skrll expressionS *exp)
4456 1.1 skrll {
4457 1.1 skrll bfd_reloc_code_real_type r;
4458 1.1 skrll
4459 1.1 skrll r = (nbytes == 1 ? BFD_RELOC_8 :
4460 1.1 skrll (nbytes == 2 ? BFD_RELOC_16 :
4461 1.1 skrll (nbytes == 4 ? BFD_RELOC_32 : BFD_RELOC_64)));
4462 1.1 skrll
4463 1.1 skrll if (target_little_endian_data
4464 1.1 skrll && nbytes == 4
4465 1.1 skrll && now_seg->flags & SEC_ALLOC)
4466 1.1 skrll r = BFD_RELOC_SPARC_REV32;
4467 1.1 skrll
4468 1.1 skrll if (sparc_cons_special_reloc)
4469 1.1 skrll {
4470 1.1 skrll if (*sparc_cons_special_reloc == 'd')
4471 1.1 skrll switch (nbytes)
4472 1.1 skrll {
4473 1.1 skrll case 1: r = BFD_RELOC_8_PCREL; break;
4474 1.1 skrll case 2: r = BFD_RELOC_16_PCREL; break;
4475 1.1 skrll case 4: r = BFD_RELOC_32_PCREL; break;
4476 1.1 skrll case 8: r = BFD_RELOC_64_PCREL; break;
4477 1.1 skrll default: abort ();
4478 1.1 skrll }
4479 1.1 skrll else if (*sparc_cons_special_reloc == 'p')
4480 1.1 skrll switch (nbytes)
4481 1.1 skrll {
4482 1.1 skrll case 4: r = BFD_RELOC_SPARC_PLT32; break;
4483 1.1 skrll case 8: r = BFD_RELOC_SPARC_PLT64; break;
4484 1.1 skrll }
4485 1.1 skrll else
4486 1.1 skrll switch (nbytes)
4487 1.1 skrll {
4488 1.1 skrll case 4: r = BFD_RELOC_SPARC_TLS_DTPOFF32; break;
4489 1.1 skrll case 8: r = BFD_RELOC_SPARC_TLS_DTPOFF64; break;
4490 1.1 skrll }
4491 1.1 skrll }
4492 1.1 skrll else if (sparc_no_align_cons)
4493 1.1 skrll {
4494 1.1 skrll switch (nbytes)
4495 1.1 skrll {
4496 1.1 skrll case 2: r = BFD_RELOC_SPARC_UA16; break;
4497 1.1 skrll case 4: r = BFD_RELOC_SPARC_UA32; break;
4498 1.1 skrll case 8: r = BFD_RELOC_SPARC_UA64; break;
4499 1.1 skrll default: abort ();
4500 1.1 skrll }
4501 1.1 skrll }
4502 1.1 skrll
4503 1.1 skrll fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
4504 1.1 skrll sparc_cons_special_reloc = NULL;
4505 1.1 skrll }
4506 1.1 skrll
4507 1.1 skrll void
4508 1.1 skrll sparc_cfi_frame_initial_instructions (void)
4509 1.1 skrll {
4510 1.1 skrll cfi_add_CFA_def_cfa (14, sparc_arch_size == 64 ? 0x7ff : 0);
4511 1.1 skrll }
4512 1.1 skrll
4513 1.1 skrll int
4514 1.1 skrll sparc_regname_to_dw2regnum (char *regname)
4515 1.1 skrll {
4516 1.1 skrll char *p, *q;
4517 1.1 skrll
4518 1.1 skrll if (!regname[0])
4519 1.1 skrll return -1;
4520 1.1 skrll
4521 1.1 skrll q = "goli";
4522 1.1 skrll p = strchr (q, regname[0]);
4523 1.1 skrll if (p)
4524 1.1 skrll {
4525 1.1 skrll if (regname[1] < '0' || regname[1] > '8' || regname[2])
4526 1.1 skrll return -1;
4527 1.1 skrll return (p - q) * 8 + regname[1] - '0';
4528 1.1 skrll }
4529 1.1 skrll if (regname[0] == 's' && regname[1] == 'p' && !regname[2])
4530 1.1 skrll return 14;
4531 1.1 skrll if (regname[0] == 'f' && regname[1] == 'p' && !regname[2])
4532 1.1 skrll return 30;
4533 1.1 skrll if (regname[0] == 'f' || regname[0] == 'r')
4534 1.1 skrll {
4535 1.1 skrll unsigned int regnum;
4536 1.1 skrll
4537 1.1 skrll regnum = strtoul (regname + 1, &q, 10);
4538 1.1 skrll if (p == q || *q)
4539 1.1 skrll return -1;
4540 1.1 skrll if (regnum >= ((regname[0] == 'f'
4541 1.1 skrll && SPARC_OPCODE_ARCH_V9_P (max_architecture))
4542 1.1 skrll ? 64 : 32))
4543 1.1 skrll return -1;
4544 1.1 skrll if (regname[0] == 'f')
4545 1.1 skrll {
4546 1.1 skrll regnum += 32;
4547 1.1 skrll if (regnum >= 64 && (regnum & 1))
4548 1.1 skrll return -1;
4549 1.1 skrll }
4550 1.1 skrll return regnum;
4551 }
4552 return -1;
4553 }
4554
4555 void
4556 sparc_cfi_emit_pcrel_expr (expressionS *exp, unsigned int nbytes)
4557 {
4558 sparc_cons_special_reloc = "disp";
4559 sparc_no_align_cons = 1;
4560 emit_expr (exp, nbytes);
4561 sparc_no_align_cons = 0;
4562 sparc_cons_special_reloc = NULL;
4563 }
4564