1 /* tc-arc.c -- Assembler for the ARC
2 Copyright 1994, 1995, 1997, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 #include "libiberty.h"
26 #include "struc-symbol.h"
27 #include "safe-ctype.h"
29 #include "opcode/arc.h"
30 #include "../opcodes/arc-ext.h"
32 #include "dwarf2dbg.h"
34 extern int arc_get_mach PARAMS ((char *));
35 extern int arc_operand_type PARAMS ((int));
36 extern int arc_insn_not_jl PARAMS ((arc_insn));
37 extern int arc_limm_fixup_adjust PARAMS ((arc_insn));
38 extern int arc_get_noshortcut_flag PARAMS ((void));
39 extern int arc_set_ext_seg PARAMS ((void));
40 extern void arc_code_symbol PARAMS ((expressionS *));
42 static arc_insn arc_insert_operand PARAMS ((arc_insn,
43 const struct arc_operand *, int,
44 const struct arc_operand_value *,
45 offsetT, char *, unsigned int));
46 static void arc_common PARAMS ((int));
47 static void arc_extinst PARAMS ((int));
48 static void arc_extoper PARAMS ((int));
49 static void arc_option PARAMS ((int));
50 static int get_arc_exp_reloc_type PARAMS ((int, int, expressionS *,
53 static void init_opcode_tables PARAMS ((int));
55 const struct suffix_classes {
59 { "SUFFIX_COND|SUFFIX_FLAG",23 },
60 { "SUFFIX_FLAG", 11 },
61 { "SUFFIX_COND", 11 },
65 #define MAXSUFFIXCLASS (sizeof (suffixclass) / sizeof (struct suffix_classes))
67 const struct syntax_classes {
72 { "SYNTAX_3OP|OP1_MUST_BE_IMM", 26, SYNTAX_3OP|OP1_MUST_BE_IMM|SYNTAX_VALID },
73 { "OP1_MUST_BE_IMM|SYNTAX_3OP", 26, OP1_MUST_BE_IMM|SYNTAX_3OP|SYNTAX_VALID },
74 { "SYNTAX_2OP|OP1_IMM_IMPLIED", 26, SYNTAX_2OP|OP1_IMM_IMPLIED|SYNTAX_VALID },
75 { "OP1_IMM_IMPLIED|SYNTAX_2OP", 26, OP1_IMM_IMPLIED|SYNTAX_2OP|SYNTAX_VALID },
76 { "SYNTAX_3OP", 10, SYNTAX_3OP|SYNTAX_VALID },
77 { "SYNTAX_2OP", 10, SYNTAX_2OP|SYNTAX_VALID }
80 #define MAXSYNTAXCLASS (sizeof (syntaxclass) / sizeof (struct syntax_classes))
82 const pseudo_typeS md_pseudo_table[] = {
83 { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0). */
84 { "comm", arc_common, 0 },
85 { "common", arc_common, 0 },
86 { "lcomm", arc_common, 1 },
87 { "lcommon", arc_common, 1 },
94 { "option", arc_option, 0 },
95 { "cpu", arc_option, 0 },
96 { "block", s_space, 0 },
97 { "file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0 },
98 { "loc", dwarf2_directive_loc, 0 },
99 { "extcondcode", arc_extoper, 0 },
100 { "extcoreregister", arc_extoper, 1 },
101 { "extauxregister", arc_extoper, 2 },
102 { "extinstruction", arc_extinst, 0 },
106 /* This array holds the chars that always start a comment. If the
107 pre-processor is disabled, these aren't very useful. */
108 const char comment_chars[] = "#;";
110 /* This array holds the chars that only start a comment at the beginning of
111 a line. If the line seems to have the form '# 123 filename'
112 .line and .file directives will appear in the pre-processed output */
113 /* Note that input_file.c hand checks for '#' at the beginning of the
114 first line of the input file. This is because the compiler outputs
115 #NO_APP at the beginning of its output. */
116 /* Also note that comments started like this one will always
117 work if '/' isn't otherwise defined. */
118 const char line_comment_chars[] = "#";
120 const char line_separator_chars[] = "";
122 /* Chars that can be used to separate mant from exp in floating point nums. */
123 const char EXP_CHARS[] = "eE";
125 /* Chars that mean this number is a floating point constant
126 As in 0f12.456 or 0d1.2345e12. */
127 const char FLT_CHARS[] = "rRsSfFdD";
130 extern int target_big_endian;
131 const char *arc_target_format = DEFAULT_TARGET_FORMAT;
132 static int byte_order = DEFAULT_BYTE_ORDER;
134 static segT arcext_section;
136 /* One of bfd_mach_arc_n. */
137 static int arc_mach_type = bfd_mach_arc_6;
139 /* Non-zero if the cpu type has been explicitly specified. */
140 static int mach_type_specified_p = 0;
142 /* Non-zero if opcode tables have been initialized.
143 A .option command must appear before any instructions. */
144 static int cpu_tables_init_p = 0;
146 static struct hash_control *arc_suffix_hash = NULL;
148 const char *md_shortopts = "";
149 struct option md_longopts[] = {
150 #define OPTION_EB (OPTION_MD_BASE + 0)
151 { "EB", no_argument, NULL, OPTION_EB },
152 #define OPTION_EL (OPTION_MD_BASE + 1)
153 { "EL", no_argument, NULL, OPTION_EL },
154 #define OPTION_ARC5 (OPTION_MD_BASE + 2)
155 { "marc5", no_argument, NULL, OPTION_ARC5 },
156 { "pre-v6", no_argument, NULL, OPTION_ARC5 },
157 #define OPTION_ARC6 (OPTION_MD_BASE + 3)
158 { "marc6", no_argument, NULL, OPTION_ARC6 },
159 #define OPTION_ARC7 (OPTION_MD_BASE + 4)
160 { "marc7", no_argument, NULL, OPTION_ARC7 },
161 #define OPTION_ARC8 (OPTION_MD_BASE + 5)
162 { "marc8", no_argument, NULL, OPTION_ARC8 },
163 #define OPTION_ARC (OPTION_MD_BASE + 6)
164 { "marc", no_argument, NULL, OPTION_ARC },
165 { NULL, no_argument, NULL, 0 }
167 size_t md_longopts_size = sizeof (md_longopts);
169 #define IS_SYMBOL_OPERAND(o) \
170 ((o) == 'b' || (o) == 'c' || (o) == 's' || (o) == 'o' || (o) == 'O')
172 struct arc_operand_value *get_ext_suffix (char *s);
174 /* Invocation line includes a switch not recognized by the base assembler.
175 See if it's a processor-specific option. */
178 md_parse_option (c, arg)
180 char *arg ATTRIBUTE_UNUSED;
185 arc_mach_type = bfd_mach_arc_5;
189 arc_mach_type = bfd_mach_arc_6;
192 arc_mach_type = bfd_mach_arc_7;
195 arc_mach_type = bfd_mach_arc_8;
198 byte_order = BIG_ENDIAN;
199 arc_target_format = "elf32-bigarc";
202 byte_order = LITTLE_ENDIAN;
203 arc_target_format = "elf32-littlearc";
212 md_show_usage (stream)
217 -marc[5|6|7|8] select processor variant (default arc%d)\n\
218 -EB assemble code for a big endian cpu\n\
219 -EL assemble code for a little endian cpu\n", arc_mach_type + 5);
222 /* This function is called once, at assembler startup time. It should
223 set up all the tables, etc. that the MD part of the assembler will need.
224 Opcode selection is deferred until later because we might see a .option
230 /* The endianness can be chosen "at the factory". */
231 target_big_endian = byte_order == BIG_ENDIAN;
233 if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, arc_mach_type))
234 as_warn ("could not set architecture and machine");
236 /* This call is necessary because we need to initialize `arc_operand_map'
237 which may be needed before we see the first insn. */
238 arc_opcode_init_tables (arc_get_opcode_mach (arc_mach_type,
242 /* Initialize the various opcode and operand tables.
243 MACH is one of bfd_mach_arc_xxx. */
245 init_opcode_tables (mach)
251 if ((arc_suffix_hash = hash_new ()) == NULL)
252 as_fatal ("virtual memory exhausted");
254 if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
255 as_warn ("could not set architecture and machine");
257 /* This initializes a few things in arc-opc.c that we need.
258 This must be called before the various arc_xxx_supported fns. */
259 arc_opcode_init_tables (arc_get_opcode_mach (mach, target_big_endian));
261 /* Only put the first entry of each equivalently named suffix in the
264 for (i = 0; i < arc_suffixes_count; i++)
266 if (strcmp (arc_suffixes[i].name, last) != 0)
267 hash_insert (arc_suffix_hash, arc_suffixes[i].name, (PTR) (arc_suffixes + i));
268 last = arc_suffixes[i].name;
271 /* Since registers don't have a prefix, we put them in the symbol table so
272 they can't be used as symbols. This also simplifies argument parsing as
273 we can let gas parse registers for us. The recorded register number is
274 the address of the register's entry in arc_reg_names.
276 If the register name is already in the table, then the existing
277 definition is assumed to be from an .ExtCoreRegister pseudo-op. */
279 for (i = 0; i < arc_reg_names_count; i++)
281 if (symbol_find (arc_reg_names[i].name))
283 /* Use symbol_create here instead of symbol_new so we don't try to
284 output registers into the object file's symbol table. */
285 symbol_table_insert (symbol_create (arc_reg_names[i].name,
287 (int) &arc_reg_names[i],
288 &zero_address_frag));
291 /* Tell `.option' it's too late. */
292 cpu_tables_init_p = 1;
295 /* Insert an operand value into an instruction.
296 If REG is non-NULL, it is a register number and ignore VAL. */
299 arc_insert_operand (insn, operand, mods, reg, val, file, line)
301 const struct arc_operand *operand;
303 const struct arc_operand_value *reg;
308 if (operand->bits != 32)
313 if ((operand->flags & ARC_OPERAND_SIGNED) != 0)
315 if ((operand->flags & ARC_OPERAND_SIGNOPT) != 0)
316 max = (1 << operand->bits) - 1;
318 max = (1 << (operand->bits - 1)) - 1;
319 min = - (1 << (operand->bits - 1));
323 max = (1 << operand->bits) - 1;
327 if ((operand->flags & ARC_OPERAND_NEGATIVE) != 0)
332 if (test < (offsetT) min || test > (offsetT) max)
335 "operand out of range (%s not between %ld and %ld)";
338 sprint_value (buf, test);
339 if (file == (char *) NULL)
340 as_warn (err, buf, min, max);
342 as_warn_where (file, line, err, buf, min, max);
351 insn = (*operand->insert) (insn, operand, mods, reg, (long) val, &errmsg);
352 if (errmsg != (const char *) NULL)
356 insn |= (((long) val & ((1 << operand->bits) - 1))
362 /* We need to keep a list of fixups. We can't simply generate them as
363 we go, because that would require us to first create the frag, and
364 that would screw up references to ``.''. */
367 /* index into `arc_operands' */
374 #define MAX_SUFFIXES 5
376 /* This routine is called for each instruction to be assembled. */
382 const struct arc_opcode *opcode;
383 const struct arc_opcode *std_opcode;
384 struct arc_opcode *ext_opcode;
386 const char *last_errmsg = 0;
388 static int init_tables_p = 0;
390 /* Opcode table initialization is deferred until here because we have to
391 wait for a possible .option command. */
394 init_opcode_tables (arc_mach_type);
398 /* Skip leading white space. */
399 while (ISSPACE (*str))
402 /* The instructions are stored in lists hashed by the first letter (though
403 we needn't care how they're hashed). Get the first in the list. */
405 ext_opcode = arc_ext_opcodes;
406 std_opcode = arc_opcode_lookup_asm (str);
408 /* Keep looking until we find a match. */
411 for (opcode = (ext_opcode ? ext_opcode : std_opcode);
413 opcode = (ARC_OPCODE_NEXT_ASM (opcode)
414 ? ARC_OPCODE_NEXT_ASM (opcode)
415 : (ext_opcode ? ext_opcode = NULL, std_opcode : NULL)))
417 int past_opcode_p, fc, num_suffixes;
420 struct arc_fixup fixups[MAX_FIXUPS];
421 /* Used as a sanity check. If we need a limm reloc, make sure we ask
422 for an extra 4 bytes from frag_more. */
425 const struct arc_operand_value *insn_suffixes[MAX_SUFFIXES];
427 /* Is this opcode supported by the selected cpu? */
428 if (! arc_opcode_supported (opcode))
431 /* Scan the syntax string. If it doesn't match, try the next one. */
433 arc_opcode_init_insert ();
434 insn = opcode->value;
441 /* We don't check for (*str != '\0') here because we want to parse
442 any trailing fake arguments in the syntax string. */
443 for (str = start, syn = opcode->syntax; *syn != '\0';)
446 const struct arc_operand *operand;
448 /* Non operand chars must match exactly. */
449 if (*syn != '%' || *++syn == '%')
451 /* Handle '+' specially as we want to allow "ld r0,[sp-4]". */
452 /* ??? The syntax has changed to [sp,-4]. */
453 if (0 && *syn == '+' && *str == '-')
455 /* Skip over syn's +, but leave str's - alone.
456 That makes the case identical to "ld r0,[sp+-4]". */
459 else if (*str == *syn)
471 /* We have an operand. Pick out any modifiers. */
473 while (ARC_MOD_P (arc_operands[arc_operand_map[(int) *syn]].flags))
475 mods |= arc_operands[arc_operand_map[(int) *syn]].flags & ARC_MOD_BITS;
478 operand = arc_operands + arc_operand_map[(int) *syn];
479 if (operand->fmt == 0)
480 as_fatal ("unknown syntax format character `%c'", *syn);
482 if (operand->flags & ARC_OPERAND_FAKE)
484 const char *errmsg = NULL;
487 insn = (*operand->insert) (insn, operand, mods, NULL, 0, &errmsg);
488 if (errmsg != (const char *) NULL)
490 last_errmsg = errmsg;
491 if (operand->flags & ARC_OPERAND_ERROR)
496 else if (operand->flags & ARC_OPERAND_WARN)
501 && (operand->flags && operand->flags & ARC_OPERAND_LIMM)
503 (ARC_OPERAND_ABSOLUTE_BRANCH | ARC_OPERAND_ADDRESS)))
505 fixups[fix_up_at].opindex = arc_operand_map[operand->fmt];
510 /* Are we finished with suffixes? */
511 else if (!past_opcode_p)
516 const struct arc_operand_value *suf, *suffix_end;
517 const struct arc_operand_value *suffix = NULL;
519 if (!(operand->flags & ARC_OPERAND_SUFFIX))
522 /* If we're at a space in the input string, we want to skip the
523 remaining suffixes. There may be some fake ones though, so
524 just go on to try the next one. */
532 if (mods & ARC_MOD_DOT)
540 /* This can happen in "b.nd foo" and we're currently looking
541 for "%q" (ie: a condition code suffix). */
549 /* Pick the suffix out and look it up via the hash table. */
550 for (t = s; *t && ISALNUM (*t); ++t)
554 if ((suf = get_ext_suffix (s)))
557 suf = hash_find (arc_suffix_hash, s);
560 /* This can happen in "blle foo" and we're currently using
561 the template "b%q%.n %j". The "bl" insn occurs later in
562 the table so "lle" isn't an illegal suffix. */
567 /* Is it the right type? Note that the same character is used
568 several times, so we have to examine all of them. This is
569 relatively efficient as equivalent entries are kept
570 together. If it's not the right type, don't increment `str'
571 so we try the next one in the series. */
573 if (ext_suffix_p && arc_operands[suf->type].fmt == *syn)
575 /* Insert the suffix's value into the insn. */
578 insn = (*operand->insert) (insn, operand,
579 mods, NULL, suf->value,
582 insn |= suf->value << operand->shift;
590 suffix_end = arc_suffixes + arc_suffixes_count;
592 suffix < suffix_end && strcmp (suffix->name, suf->name) == 0;
595 if (arc_operands[suffix->type].fmt == *syn)
597 /* Insert the suffix's value into the insn. */
599 insn = (*operand->insert) (insn, operand,
600 mods, NULL, suffix->value,
603 insn |= suffix->value << operand->shift;
613 /* Wrong type. Just go on to try next insn entry. */
617 if (num_suffixes == MAX_SUFFIXES)
618 as_bad ("too many suffixes");
620 insn_suffixes[num_suffixes++] = suffix;
624 /* This is either a register or an expression of some kind. */
627 const struct arc_operand_value *reg = NULL;
631 if (operand->flags & ARC_OPERAND_SUFFIX)
634 /* Is there anything left to parse?
635 We don't check for this at the top because we want to parse
636 any trailing fake arguments in the syntax string. */
637 if (is_end_of_line[(unsigned char) *str])
640 /* Parse the operand. */
641 hold = input_line_pointer;
642 input_line_pointer = str;
644 str = input_line_pointer;
645 input_line_pointer = hold;
647 if (exp.X_op == O_illegal)
648 as_bad ("illegal operand");
649 else if (exp.X_op == O_absent)
650 as_bad ("missing operand");
651 else if (exp.X_op == O_constant)
653 value = exp.X_add_number;
655 else if (exp.X_op == O_register)
657 reg = (struct arc_operand_value *) exp.X_add_number;
659 #define IS_REG_DEST_OPERAND(o) ((o) == 'a')
660 else if (IS_REG_DEST_OPERAND (*syn))
661 as_bad ("symbol as destination register");
664 if (!strncmp (str, "@h30", 4))
666 arc_code_symbol (&exp);
669 /* We need to generate a fixup for this expression. */
670 if (fc >= MAX_FIXUPS)
671 as_fatal ("too many fixups");
672 fixups[fc].exp = exp;
673 /* We don't support shimm relocs. break here to force
674 the assembler to output a limm. */
675 #define IS_REG_SHIMM_OFFSET(o) ((o) == 'd')
676 if (IS_REG_SHIMM_OFFSET (*syn))
678 /* If this is a register constant (IE: one whose
679 register value gets stored as 61-63) then this
681 /* ??? This bit could use some cleaning up.
682 Referencing the format chars like this goes
684 if (IS_SYMBOL_OPERAND (*syn))
688 /* Save this, we don't yet know what reloc to use. */
690 /* Tell insert_reg we need a limm. This is
691 needed because the value at this point is
693 /* ??? We need a cleaner interface than this. */
694 (*arc_operands[arc_operand_map['Q']].insert)
695 (insn, operand, mods, reg, 0L, &junk);
698 fixups[fc].opindex = arc_operand_map[(int) *syn];
703 /* Insert the register or expression into the instruction. */
706 const char *errmsg = NULL;
707 insn = (*operand->insert) (insn, operand, mods,
708 reg, (long) value, &errmsg);
709 if (errmsg != (const char *) NULL)
711 last_errmsg = errmsg;
712 if (operand->flags & ARC_OPERAND_ERROR)
717 else if (operand->flags & ARC_OPERAND_WARN)
723 insn |= (value & ((1 << operand->bits) - 1)) << operand->shift;
729 /* If we're at the end of the syntax string, we're done. */
730 /* FIXME: try to move this to a separate function. */
737 /* For the moment we assume a valid `str' can only contain blanks
738 now. IE: We needn't try again with a longer version of the
739 insn and it is assumed that longer versions of insns appear
740 before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3). */
742 while (ISSPACE (*str))
745 if (!is_end_of_line[(unsigned char) *str])
746 as_bad ("junk at end of line: `%s'", str);
748 /* Is there a limm value? */
749 limm_p = arc_opcode_limm_p (&limm);
751 /* Perform various error and warning tests. */
754 static int in_delay_slot_p = 0;
755 static int prev_insn_needs_cc_nop_p = 0;
756 /* delay slot type seen */
757 int delay_slot_type = ARC_DELAY_NONE;
758 /* conditional execution flag seen */
760 /* 1 if condition codes are being set */
762 /* 1 if conditional branch, including `b' "branch always" */
763 int cond_branch_p = opcode->flags & ARC_OPCODE_COND_BRANCH;
765 for (i = 0; i < num_suffixes; ++i)
767 switch (arc_operands[insn_suffixes[i]->type].fmt)
770 delay_slot_type = insn_suffixes[i]->value;
773 conditional = insn_suffixes[i]->value;
781 /* Putting an insn with a limm value in a delay slot is supposed to
782 be legal, but let's warn the user anyway. Ditto for 8 byte
783 jumps with delay slots. */
784 if (in_delay_slot_p && limm_p)
785 as_warn ("8 byte instruction in delay slot");
786 if (delay_slot_type != ARC_DELAY_NONE
787 && limm_p && arc_insn_not_jl (insn)) /* except for jl addr */
788 as_warn ("8 byte jump instruction with delay slot");
789 in_delay_slot_p = (delay_slot_type != ARC_DELAY_NONE) && !limm_p;
791 /* Warn when a conditional branch immediately follows a set of
792 the condition codes. Note that this needn't be done if the
793 insn that sets the condition codes uses a limm. */
794 if (cond_branch_p && conditional != 0 /* 0 = "always" */
795 && prev_insn_needs_cc_nop_p && arc_mach_type == bfd_mach_arc_5)
796 as_warn ("conditional branch follows set of flags");
797 prev_insn_needs_cc_nop_p =
798 /* FIXME: ??? not required:
799 (delay_slot_type != ARC_DELAY_NONE) && */
803 /* Write out the instruction.
804 It is important to fetch enough space in one call to `frag_more'.
805 We use (f - frag_now->fr_literal) to compute where we are and we
806 don't want frag_now to change between calls. */
810 md_number_to_chars (f, insn, 4);
811 md_number_to_chars (f + 4, limm, 4);
812 dwarf2_emit_insn (8);
814 else if (limm_reloc_p)
816 /* We need a limm reloc, but the tables think we don't. */
822 md_number_to_chars (f, insn, 4);
823 dwarf2_emit_insn (4);
826 /* Create any fixups. */
827 for (i = 0; i < fc; ++i)
829 int op_type, reloc_type;
831 const struct arc_operand *operand;
833 /* Create a fixup for this operand.
834 At this point we do not use a bfd_reloc_code_real_type for
835 operands residing in the insn, but instead just use the
836 operand index. This lets us easily handle fixups for any
837 operand type, although that is admittedly not a very exciting
838 feature. We pick a BFD reloc type in md_apply_fix3.
840 Limm values (4 byte immediate "constants") must be treated
841 normally because they're not part of the actual insn word
842 and thus the insertion routines don't handle them. */
844 if (arc_operands[fixups[i].opindex].flags & ARC_OPERAND_LIMM)
846 /* Modify the fixup addend as required by the cpu. */
847 fixups[i].exp.X_add_number += arc_limm_fixup_adjust (insn);
848 op_type = fixups[i].opindex;
849 /* FIXME: can we add this data to the operand table? */
850 if (op_type == arc_operand_map['L']
851 || op_type == arc_operand_map['s']
852 || op_type == arc_operand_map['o']
853 || op_type == arc_operand_map['O'])
854 reloc_type = BFD_RELOC_32;
855 else if (op_type == arc_operand_map['J'])
856 reloc_type = BFD_RELOC_ARC_B26;
859 reloc_type = get_arc_exp_reloc_type (1, reloc_type,
865 op_type = get_arc_exp_reloc_type (0, fixups[i].opindex,
866 &fixups[i].exp, &exptmp);
867 reloc_type = op_type + (int) BFD_RELOC_UNUSED;
869 operand = &arc_operands[op_type];
870 fix_new_exp (frag_now,
871 ((f - frag_now->fr_literal)
872 + (operand->flags & ARC_OPERAND_LIMM ? 4 : 0)), 4,
874 (operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0,
875 (bfd_reloc_code_real_type) reloc_type);
882 /* Try the next entry. */
885 if (NULL == last_errmsg)
886 as_bad ("bad instruction `%s'", start);
888 as_bad (last_errmsg);
892 arc_extoper (opertype)
901 struct arc_ext_operand_value *ext_oper;
907 name = input_line_pointer;
908 c = get_symbol_end ();
909 name = xstrdup (name);
912 ignore_rest_of_line ();
923 /* just after name is now '\0' */
924 p = input_line_pointer;
928 if (*input_line_pointer != ',')
930 as_bad ("expected comma after operand name");
931 ignore_rest_of_line ();
936 input_line_pointer++; /* skip ',' */
937 number = get_absolute_expression ();
941 as_bad ("negative operand number %d", number);
942 ignore_rest_of_line ();
951 if (*input_line_pointer != ',')
953 as_bad ("expected comma after register-number");
954 ignore_rest_of_line ();
959 input_line_pointer++; /* skip ',' */
960 mode = input_line_pointer;
962 if (!strncmp (mode, "r|w", 3))
965 input_line_pointer += 3;
969 if (!strncmp (mode, "r", 1))
971 imode = ARC_REGISTER_READONLY;
972 input_line_pointer += 1;
976 if (strncmp (mode, "w", 1))
978 as_bad ("invalid mode");
979 ignore_rest_of_line ();
985 imode = ARC_REGISTER_WRITEONLY;
986 input_line_pointer += 1;
993 if (*input_line_pointer != ',')
995 as_bad ("expected comma after register-mode");
996 ignore_rest_of_line ();
1001 input_line_pointer++; /* skip ',' */
1003 if (!strncmp (input_line_pointer, "cannot_shortcut", 15))
1005 imode |= arc_get_noshortcut_flag ();
1006 input_line_pointer += 15;
1010 if (strncmp (input_line_pointer, "can_shortcut", 12))
1012 as_bad ("shortcut designator invalid");
1013 ignore_rest_of_line ();
1019 input_line_pointer += 12;
1025 if ((opertype == 1) && number > 60)
1027 as_bad ("core register value (%d) too large", number);
1028 ignore_rest_of_line ();
1033 if ((opertype == 0) && number > 31)
1035 as_bad ("condition code value (%d) too large", number);
1036 ignore_rest_of_line ();
1041 ext_oper = (struct arc_ext_operand_value *) \
1042 xmalloc (sizeof (struct arc_ext_operand_value));
1046 /* If the symbol already exists, point it at the new definition. */
1047 if ((symbolP = symbol_find (name)))
1049 if (S_GET_SEGMENT (symbolP) == reg_section)
1050 S_SET_VALUE (symbolP, (int) &ext_oper->operand);
1053 as_bad ("attempt to override symbol: %s", name);
1054 ignore_rest_of_line ();
1062 /* If its not there, add it. */
1063 symbol_table_insert (symbol_create (name, reg_section,
1064 (int) &ext_oper->operand, &zero_address_frag));
1068 ext_oper->operand.name = name;
1069 ext_oper->operand.value = number;
1070 ext_oper->operand.type = arc_operand_type (opertype);
1071 ext_oper->operand.flags = imode;
1073 ext_oper->next = arc_ext_operands;
1074 arc_ext_operands = ext_oper;
1076 /* OK, now that we know what this operand is, put a description in
1077 the arc extension section of the output file. */
1080 old_subsec = now_subseg;
1088 *p = 3 + strlen (name) + 1;
1093 p = frag_more (strlen (name) + 1);
1098 *p = 3 + strlen (name) + 1;
1100 *p = EXT_CORE_REGISTER;
1103 p = frag_more (strlen (name) + 1);
1108 *p = 6 + strlen (name) + 1;
1110 *p = EXT_AUX_REGISTER;
1112 *p = number >> 24 & 0xff;
1114 *p = number >> 16 & 0xff;
1116 *p = number >> 8 & 0xff;
1119 p = frag_more (strlen (name) + 1);
1123 as_bad ("invalid opertype");
1124 ignore_rest_of_line ();
1130 subseg_set (old_sec, old_subsec);
1132 /* Enter all registers into the symbol table. */
1134 demand_empty_rest_of_line ();
1138 arc_extinst (ignore)
1139 int ignore ATTRIBUTE_UNUSED;
1141 unsigned char syntax[129];
1145 int suffixcode = -1;
1146 int opcode, subopcode;
1150 struct arc_opcode *ext_op;
1155 name = input_line_pointer;
1156 c = get_symbol_end ();
1157 name = xstrdup (name);
1160 ignore_rest_of_line ();
1163 strcpy (syntax, name);
1164 name_len = strlen (name);
1166 /* just after name is now '\0' */
1167 p = input_line_pointer;
1172 if (*input_line_pointer != ',')
1174 as_bad ("expected comma after operand name");
1175 ignore_rest_of_line ();
1179 input_line_pointer++; /* skip ',' */
1180 opcode = get_absolute_expression ();
1184 if (*input_line_pointer != ',')
1186 as_bad ("expected comma after opcode");
1187 ignore_rest_of_line ();
1191 input_line_pointer++; /* skip ',' */
1192 subopcode = get_absolute_expression ();
1196 as_bad ("negative subopcode %d", subopcode);
1197 ignore_rest_of_line ();
1205 as_bad ("subcode value found when opcode not equal 0x03");
1206 ignore_rest_of_line ();
1211 if (subopcode < 0x09 || subopcode == 0x3f)
1213 as_bad ("invalid subopcode %d", subopcode);
1214 ignore_rest_of_line ();
1222 if (*input_line_pointer != ',')
1224 as_bad ("expected comma after subopcode");
1225 ignore_rest_of_line ();
1229 input_line_pointer++; /* skip ',' */
1231 for (i = 0; i < (int) MAXSUFFIXCLASS; i++)
1233 if (!strncmp (suffixclass[i].name,input_line_pointer, suffixclass[i].len))
1236 input_line_pointer += suffixclass[i].len;
1241 if (-1 == suffixcode)
1243 as_bad ("invalid suffix class");
1244 ignore_rest_of_line ();
1250 if (*input_line_pointer != ',')
1252 as_bad ("expected comma after suffix class");
1253 ignore_rest_of_line ();
1257 input_line_pointer++; /* skip ',' */
1259 for (i = 0; i < (int) MAXSYNTAXCLASS; i++)
1261 if (!strncmp (syntaxclass[i].name,input_line_pointer, syntaxclass[i].len))
1263 class = syntaxclass[i].class;
1264 input_line_pointer += syntaxclass[i].len;
1269 if (0 == (SYNTAX_VALID & class))
1271 as_bad ("invalid syntax class");
1272 ignore_rest_of_line ();
1276 if ((0x3 == opcode) & (class & SYNTAX_3OP))
1278 as_bad ("opcode 0x3 and SYNTAX_3OP invalid");
1279 ignore_rest_of_line ();
1286 strcat (syntax, "%.q%.f ");
1289 strcat (syntax, "%.f ");
1292 strcat (syntax, "%.q ");
1295 strcat (syntax, " ");
1298 as_bad ("unknown suffix class");
1299 ignore_rest_of_line ();
1304 strcat (syntax, ((opcode == 0x3) ? "%a,%b" : ((class & SYNTAX_3OP) ? "%a,%b,%c" : "%b,%c")));
1306 strcat (syntax, "%F");
1307 strcat (syntax, "%S%L");
1309 ext_op = (struct arc_opcode *) xmalloc (sizeof (struct arc_opcode));
1312 ignore_rest_of_line ();
1316 ext_op->syntax = xstrdup (syntax);
1317 if (NULL == ext_op->syntax)
1319 ignore_rest_of_line ();
1323 ext_op->mask = I (-1) | ((0x3 == opcode) ? C (-1) : 0);
1324 ext_op->value = I (opcode) | ((0x3 == opcode) ? C (subopcode) : 0);
1325 ext_op->flags = class;
1326 ext_op->next_asm = arc_ext_opcodes;
1327 ext_op->next_dis = arc_ext_opcodes;
1328 arc_ext_opcodes = ext_op;
1330 /* OK, now that we know what this inst is, put a description in the
1331 arc extension section of the output file. */
1334 old_subsec = now_subseg;
1339 *p = 5 + name_len + 1;
1341 *p = EXT_INSTRUCTION;
1347 *p = (class & (OP1_MUST_BE_IMM | OP1_IMM_IMPLIED) ? IGNORE_FIRST_OPD : 0);
1348 p = frag_more (name_len);
1349 strncpy (p, syntax, name_len);
1353 subseg_set (old_sec, old_subsec);
1355 demand_empty_rest_of_line ();
1361 if (!arcext_section)
1363 arcext_section = subseg_new (".arcextmap", 0);
1364 bfd_set_section_flags (stdoutput, arcext_section,
1365 SEC_READONLY | SEC_HAS_CONTENTS);
1368 subseg_set (arcext_section, 0);
1373 arc_common (localScope)
1382 name = input_line_pointer;
1383 c = get_symbol_end ();
1384 /* just after name is now '\0' */
1385 p = input_line_pointer;
1389 if (*input_line_pointer != ',')
1391 as_bad ("expected comma after symbol name");
1392 ignore_rest_of_line ();
1396 input_line_pointer++; /* skip ',' */
1397 size = get_absolute_expression ();
1401 as_bad ("negative symbol length");
1402 ignore_rest_of_line ();
1407 symbolP = symbol_find_or_make (name);
1410 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1412 as_bad ("ignoring attempt to re-define symbol");
1413 ignore_rest_of_line ();
1416 if (((int) S_GET_VALUE (symbolP) != 0) \
1417 && ((int) S_GET_VALUE (symbolP) != size))
1419 as_warn ("length of symbol \"%s\" already %ld, ignoring %d",
1420 S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
1422 assert (symbolP->sy_frag == &zero_address_frag);
1424 /* Now parse the alignment field. This field is optional for
1425 local and global symbols. Default alignment is zero. */
1426 if (*input_line_pointer == ',')
1428 input_line_pointer++;
1429 align = get_absolute_expression ();
1433 as_warn ("assuming symbol alignment of zero");
1439 if (localScope != 0)
1446 old_subsec = now_subseg;
1447 record_alignment (bss_section, align);
1448 subseg_set (bss_section, 0); /* ??? subseg_set (bss_section, 1); ??? */
1452 frag_align (align, 0, 0);
1454 /* Detach from old frag. */
1455 if (S_GET_SEGMENT (symbolP) == bss_section)
1456 symbolP->sy_frag->fr_symbol = NULL;
1458 symbolP->sy_frag = frag_now;
1459 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
1460 (offsetT) size, (char *) 0);
1463 S_SET_SIZE (symbolP, size);
1464 S_SET_SEGMENT (symbolP, bss_section);
1465 S_CLEAR_EXTERNAL (symbolP);
1467 subseg_set (old_sec, old_subsec);
1471 S_SET_VALUE (symbolP, (valueT) size);
1472 S_SET_ALIGN (symbolP, align);
1473 S_SET_EXTERNAL (symbolP);
1474 S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
1477 symbolP->bsym->flags |= BSF_OBJECT;
1479 demand_empty_rest_of_line ();
1483 /* Select the cpu we're assembling for. */
1487 int ignore ATTRIBUTE_UNUSED;
1493 cpu = input_line_pointer;
1494 c = get_symbol_end ();
1495 mach = arc_get_mach (cpu);
1496 *input_line_pointer = c;
1498 /* If an instruction has already been seen, it's too late. */
1499 if (cpu_tables_init_p)
1501 as_bad ("\".option\" directive must appear before any instructions");
1502 ignore_rest_of_line ();
1509 if (mach_type_specified_p && mach != arc_mach_type)
1511 as_bad ("\".option\" directive conflicts with initial definition");
1512 ignore_rest_of_line ();
1517 /* The cpu may have been selected on the command line. */
1518 if (mach != arc_mach_type)
1519 as_warn ("\".option\" directive overrides command-line (default) value");
1520 arc_mach_type = mach;
1521 if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
1522 as_fatal ("could not set architecture and machine");
1523 mach_type_specified_p = 1;
1525 demand_empty_rest_of_line ();
1529 as_bad ("invalid identifier for \".option\"");
1530 ignore_rest_of_line ();
1533 /* Turn a string in input_line_pointer into a floating point constant
1534 of type TYPE, and store the appropriate bytes in *LITP. The number
1535 of LITTLENUMS emitted is stored in *SIZEP. An error message is
1536 returned, or NULL on OK. */
1538 /* Equal to MAX_PRECISION in atof-ieee.c */
1539 #define MAX_LITTLENUMS 6
1542 md_atof (type, litP, sizeP)
1548 LITTLENUM_TYPE words[MAX_LITTLENUMS];
1549 LITTLENUM_TYPE *wordP;
1551 char * atof_ieee PARAMS ((char *, int, LITTLENUM_TYPE *));
1567 return "bad call to md_atof";
1570 t = atof_ieee (input_line_pointer, type, words);
1572 input_line_pointer = t;
1573 *sizeP = prec * sizeof (LITTLENUM_TYPE);
1574 for (wordP = words; prec--;)
1576 md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE));
1577 litP += sizeof (LITTLENUM_TYPE);
1583 /* Write a value out to the object file, using the appropriate
1587 md_number_to_chars (buf, val, n)
1592 if (target_big_endian)
1593 number_to_chars_bigendian (buf, val, n);
1595 number_to_chars_littleendian (buf, val, n);
1598 /* Round up a section size to the appropriate boundary. */
1601 md_section_align (segment, size)
1605 int align = bfd_get_section_alignment (stdoutput, segment);
1607 return ((size + (1 << align) - 1) & (-1 << align));
1610 /* We don't have any form of relaxing. */
1613 md_estimate_size_before_relax (fragp, seg)
1614 fragS *fragp ATTRIBUTE_UNUSED;
1615 asection *seg ATTRIBUTE_UNUSED;
1617 as_fatal (_("md_estimate_size_before_relax\n"));
1621 /* Convert a machine dependent frag. We never generate these. */
1624 md_convert_frag (abfd, sec, fragp)
1625 bfd *abfd ATTRIBUTE_UNUSED;
1626 asection *sec ATTRIBUTE_UNUSED;
1627 fragS *fragp ATTRIBUTE_UNUSED;
1629 as_fatal (_("md_convert_frag\n"));
1633 arc_code_symbol (expressionP)
1634 expressionS *expressionP;
1636 if (expressionP->X_op == O_symbol && expressionP->X_add_number == 0)
1639 expressionP->X_op = O_right_shift;
1640 expressionP->X_add_symbol->sy_value.X_op = O_constant;
1641 two.X_op = O_constant;
1642 two.X_add_symbol = two.X_op_symbol = NULL;
1643 two.X_add_number = 2;
1644 expressionP->X_op_symbol = make_expr_symbol (&two);
1646 /* Allow %st(sym1-sym2) */
1647 else if (expressionP->X_op == O_subtract
1648 && expressionP->X_add_symbol != NULL
1649 && expressionP->X_op_symbol != NULL
1650 && expressionP->X_add_number == 0)
1653 expressionP->X_add_symbol = make_expr_symbol (expressionP);
1654 expressionP->X_op = O_right_shift;
1655 two.X_op = O_constant;
1656 two.X_add_symbol = two.X_op_symbol = NULL;
1657 two.X_add_number = 2;
1658 expressionP->X_op_symbol = make_expr_symbol (&two);
1662 as_bad ("expression too complex code symbol");
1667 /* Parse an operand that is machine-specific.
1669 The ARC has a special %-op to adjust addresses so they're usable in
1670 branches. The "st" is short for the STatus register.
1671 ??? Later expand this to take a flags value too.
1673 ??? We can't create new expression types so we map the %-op's onto the
1674 existing syntax. This means that the user could use the chosen syntax
1675 to achieve the same effect. */
1678 md_operand (expressionP)
1679 expressionS *expressionP;
1681 char *p = input_line_pointer;
1684 if (strncmp (p, "%st(", 4) == 0)
1686 input_line_pointer += 4;
1687 expression (expressionP);
1688 if (*input_line_pointer != ')')
1690 as_bad ("missing ')' in %%-op");
1693 ++input_line_pointer;
1694 arc_code_symbol (expressionP);
1698 /* It could be a register. */
1700 struct arc_ext_operand_value *ext_oper = arc_ext_operands;
1705 l = strlen (ext_oper->operand.name);
1706 if (!strncmp (p, ext_oper->operand.name, l) && !ISALNUM (*(p + l)))
1708 input_line_pointer += l + 1;
1709 expressionP->X_op = O_register;
1710 expressionP->X_add_number = (int) &ext_oper->operand;
1713 ext_oper = ext_oper->next;
1715 for (i = 0; i < arc_reg_names_count; i++)
1717 l = strlen (arc_reg_names[i].name);
1718 if (!strncmp (p, arc_reg_names[i].name, l) && !ISALNUM (*(p + l)))
1720 input_line_pointer += l + 1;
1721 expressionP->X_op = O_register;
1722 expressionP->X_add_number = (int) &arc_reg_names[i];
1729 /* We have no need to default values of symbols.
1730 We could catch register names here, but that is handled by inserting
1731 them all in the symbol table to begin with. */
1734 md_undefined_symbol (name)
1735 char *name ATTRIBUTE_UNUSED;
1740 /* Functions concerning expressions. */
1742 /* Parse a .byte, .word, etc. expression.
1744 Values for the status register are specified with %st(label).
1745 `label' will be right shifted by 2. */
1748 arc_parse_cons_expression (exp, nbytes)
1750 unsigned int nbytes ATTRIBUTE_UNUSED;
1752 char *p = input_line_pointer;
1753 int code_symbol_fix = 0;
1755 for (; ! is_end_of_line[(unsigned char) *p]; p++)
1756 if (*p == '@' && !strncmp (p, "@h30", 4))
1758 code_symbol_fix = 1;
1762 if (code_symbol_fix)
1764 arc_code_symbol (exp);
1765 input_line_pointer = p;
1769 /* Record a fixup for a cons expression. */
1772 arc_cons_fix_new (frag, where, nbytes, exp)
1783 /* This may be a special ARC reloc (eg: %st()). */
1784 reloc_type = get_arc_exp_reloc_type (1, BFD_RELOC_32, exp, &exptmp);
1785 fix_new_exp (frag, where, nbytes, &exptmp, 0, reloc_type);
1789 fix_new_exp (frag, where, nbytes, exp, 0,
1790 nbytes == 2 ? BFD_RELOC_16
1791 : nbytes == 8 ? BFD_RELOC_64
1796 /* Functions concerning relocs. */
1798 /* The location from which a PC relative jump should be calculated,
1799 given a PC relative reloc. */
1802 md_pcrel_from (fixP)
1805 /* Return the address of the delay slot. */
1806 return fixP->fx_frag->fr_address + fixP->fx_where + fixP->fx_size;
1809 /* Compute the reloc type of an expression.
1810 The possibly modified expression is stored in EXPNEW.
1812 This is used to convert the expressions generated by the %-op's into
1813 the appropriate operand type. It is called for both data in instructions
1814 (operands) and data outside instructions (variables, debugging info, etc.).
1816 Currently supported %-ops:
1818 %st(symbol): represented as "symbol >> 2"
1819 "st" is short for STatus as in the status register (pc)
1821 DEFAULT_TYPE is the type to use if no special processing is required.
1823 DATA_P is non-zero for data or limm values, zero for insn operands.
1824 Remember that the opcode "insertion fns" cannot be used on data, they're
1825 only for inserting operands into insns. They also can't be used for limm
1826 values as the insertion routines don't handle limm values. When called for
1827 insns we return fudged reloc types (real_value - BFD_RELOC_UNUSED). When
1828 called for data or limm values we use real reloc types. */
1831 get_arc_exp_reloc_type (data_p, default_type, exp, expnew)
1835 expressionS *expnew;
1837 /* If the expression is "symbol >> 2" we must change it to just "symbol",
1838 as fix_new_exp can't handle it. Similarily for (symbol - symbol) >> 2.
1839 That's ok though. What's really going on here is that we're using
1840 ">> 2" as a special syntax for specifying BFD_RELOC_ARC_B26. */
1842 if (exp->X_op == O_right_shift
1843 && exp->X_op_symbol != NULL
1844 && exp->X_op_symbol->sy_value.X_op == O_constant
1845 && exp->X_op_symbol->sy_value.X_add_number == 2
1846 && exp->X_add_number == 0)
1848 if (exp->X_add_symbol != NULL
1849 && (exp->X_add_symbol->sy_value.X_op == O_constant
1850 || exp->X_add_symbol->sy_value.X_op == O_symbol))
1853 expnew->X_op = O_symbol;
1854 expnew->X_op_symbol = NULL;
1855 return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
1857 else if (exp->X_add_symbol != NULL
1858 && exp->X_add_symbol->sy_value.X_op == O_subtract)
1860 *expnew = exp->X_add_symbol->sy_value;
1861 return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
1866 return default_type;
1869 /* Apply a fixup to the object code. This is called for all the
1870 fixups we generated by the call to fix_new_exp, above. In the call
1871 above we used a reloc code which was the largest legal reloc code
1872 plus the operand index. Here we undo that to recover the operand
1873 index. At this point all symbol values should be fully resolved,
1874 and we attempt to completely resolve the reloc. If we can not do
1875 that, we determine the correct reloc code and put it back in the fixup. */
1878 md_apply_fix3 (fixP, valP, seg)
1884 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
1886 valueT value = * valP;
1888 if (fixP->fx_addsy == (symbolS *) NULL)
1891 else if (fixP->fx_pcrel)
1893 /* Hack around bfd_install_relocation brain damage. */
1894 if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
1895 value += md_pcrel_from (fixP);
1898 /* We can't actually support subtracting a symbol. */
1899 if (fixP->fx_subsy != NULL)
1900 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1902 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
1905 const struct arc_operand *operand;
1909 opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
1911 operand = &arc_operands[opindex];
1913 /* Fetch the instruction, insert the fully resolved operand
1914 value, and stuff the instruction back again. */
1915 where = fixP->fx_frag->fr_literal + fixP->fx_where;
1916 if (target_big_endian)
1917 insn = bfd_getb32 ((unsigned char *) where);
1919 insn = bfd_getl32 ((unsigned char *) where);
1920 insn = arc_insert_operand (insn, operand, -1, NULL, (offsetT) value,
1921 fixP->fx_file, fixP->fx_line);
1922 if (target_big_endian)
1923 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1925 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
1929 /* Nothing else to do here. */
1933 /* Determine a BFD reloc value based on the operand information.
1934 We are only prepared to turn a few of the operands into relocs.
1935 !!! Note that we can't handle limm values here. Since we're using
1936 implicit addends the addend must be inserted into the instruction,
1937 however, the opcode insertion routines currently do nothing with
1939 if (operand->fmt == 'B')
1941 assert ((operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0
1942 && operand->bits == 20
1943 && operand->shift == 7);
1944 fixP->fx_r_type = BFD_RELOC_ARC_B22_PCREL;
1946 else if (operand->fmt == 'J')
1948 assert ((operand->flags & ARC_OPERAND_ABSOLUTE_BRANCH) != 0
1949 && operand->bits == 24
1950 && operand->shift == 32);
1951 fixP->fx_r_type = BFD_RELOC_ARC_B26;
1953 else if (operand->fmt == 'L')
1955 assert ((operand->flags & ARC_OPERAND_LIMM) != 0
1956 && operand->bits == 32
1957 && operand->shift == 32);
1958 fixP->fx_r_type = BFD_RELOC_32;
1962 as_bad_where (fixP->fx_file, fixP->fx_line,
1963 "unresolved expression that must be resolved");
1970 switch (fixP->fx_r_type)
1973 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1977 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1981 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1986 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1990 case BFD_RELOC_ARC_B26:
1991 /* If !fixP->fx_done then `value' is an implicit addend.
1992 We must shift it right by 2 in this case as well because the
1993 linker performs the relocation and then adds this in (as opposed
1994 to adding this in and then shifting right by 2). */
1996 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
2005 /* Translate internal representation of relocation info to BFD target
2009 tc_gen_reloc (section, fixP)
2010 asection *section ATTRIBUTE_UNUSED;
2015 reloc = (arelent *) xmalloc (sizeof (arelent));
2017 reloc->sym_ptr_ptr = &fixP->fx_addsy->bsym;
2018 reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
2019 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
2020 if (reloc->howto == (reloc_howto_type *) NULL)
2022 as_bad_where (fixP->fx_file, fixP->fx_line,
2023 "internal error: can't export reloc type %d (`%s')",
2025 bfd_get_reloc_code_name (fixP->fx_r_type));
2029 assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
2031 /* Set addend to account for PC being advanced one insn before the
2032 target address is computed. */
2034 reloc->addend = (fixP->fx_pcrel ? -4 : 0);