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