1 /* tc-arc.c -- Assembler for the ARC
2 Copyright 1994, 1995, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
4 Contributed by Doug Evans (dje@cygnus.com).
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 { "extcondcode", arc_extoper
, 0 },
98 { "extcoreregister", arc_extoper
, 1 },
99 { "extauxregister", arc_extoper
, 2 },
100 { "extinstruction", arc_extinst
, 0 },
104 /* This array holds the chars that always start a comment. If the
105 pre-processor is disabled, these aren't very useful. */
106 const char comment_chars
[] = "#;";
108 /* This array holds the chars that only start a comment at the beginning of
109 a line. If the line seems to have the form '# 123 filename'
110 .line and .file directives will appear in the pre-processed output */
111 /* Note that input_file.c hand checks for '#' at the beginning of the
112 first line of the input file. This is because the compiler outputs
113 #NO_APP at the beginning of its output. */
114 /* Also note that comments started like this one will always
115 work if '/' isn't otherwise defined. */
116 const char line_comment_chars
[] = "#";
118 const char line_separator_chars
[] = "";
120 /* Chars that can be used to separate mant from exp in floating point nums. */
121 const char EXP_CHARS
[] = "eE";
123 /* Chars that mean this number is a floating point constant
124 As in 0f12.456 or 0d1.2345e12. */
125 const char FLT_CHARS
[] = "rRsSfFdD";
128 extern int target_big_endian
;
129 const char *arc_target_format
= DEFAULT_TARGET_FORMAT
;
130 static int byte_order
= DEFAULT_BYTE_ORDER
;
132 static segT arcext_section
;
134 /* One of bfd_mach_arc_n. */
135 static int arc_mach_type
= bfd_mach_arc_6
;
137 /* Non-zero if the cpu type has been explicitly specified. */
138 static int mach_type_specified_p
= 0;
140 /* Non-zero if opcode tables have been initialized.
141 A .option command must appear before any instructions. */
142 static int cpu_tables_init_p
= 0;
144 static struct hash_control
*arc_suffix_hash
= NULL
;
146 const char *md_shortopts
= "";
147 struct option md_longopts
[] = {
148 #define OPTION_EB (OPTION_MD_BASE + 0)
149 { "EB", no_argument
, NULL
, OPTION_EB
},
150 #define OPTION_EL (OPTION_MD_BASE + 1)
151 { "EL", no_argument
, NULL
, OPTION_EL
},
152 #define OPTION_ARC5 (OPTION_MD_BASE + 2)
153 { "marc5", no_argument
, NULL
, OPTION_ARC5
},
154 { "pre-v6", no_argument
, NULL
, OPTION_ARC5
},
155 #define OPTION_ARC6 (OPTION_MD_BASE + 3)
156 { "marc6", no_argument
, NULL
, OPTION_ARC6
},
157 #define OPTION_ARC7 (OPTION_MD_BASE + 4)
158 { "marc7", no_argument
, NULL
, OPTION_ARC7
},
159 #define OPTION_ARC8 (OPTION_MD_BASE + 5)
160 { "marc8", no_argument
, NULL
, OPTION_ARC8
},
161 #define OPTION_ARC (OPTION_MD_BASE + 6)
162 { "marc", no_argument
, NULL
, OPTION_ARC
},
163 { NULL
, no_argument
, NULL
, 0 }
165 size_t md_longopts_size
= sizeof (md_longopts
);
167 #define IS_SYMBOL_OPERAND(o) \
168 ((o) == 'b' || (o) == 'c' || (o) == 's' || (o) == 'o' || (o) == 'O')
170 struct arc_operand_value
*get_ext_suffix (char *s
);
172 /* Invocation line includes a switch not recognized by the base assembler.
173 See if it's a processor-specific option. */
176 md_parse_option (c
, arg
)
178 char *arg ATTRIBUTE_UNUSED
;
183 arc_mach_type
= bfd_mach_arc_5
;
187 arc_mach_type
= bfd_mach_arc_6
;
190 arc_mach_type
= bfd_mach_arc_7
;
193 arc_mach_type
= bfd_mach_arc_8
;
196 byte_order
= BIG_ENDIAN
;
197 arc_target_format
= "elf32-bigarc";
200 byte_order
= LITTLE_ENDIAN
;
201 arc_target_format
= "elf32-littlearc";
210 md_show_usage (stream
)
215 -marc[5|6|7|8] select processor variant (default arc%d)\n\
216 -EB assemble code for a big endian cpu\n\
217 -EL assemble code for a little endian cpu\n", arc_mach_type
+ 5);
220 /* This function is called once, at assembler startup time. It should
221 set up all the tables, etc. that the MD part of the assembler will need.
222 Opcode selection is deferred until later because we might see a .option
228 /* The endianness can be chosen "at the factory". */
229 target_big_endian
= byte_order
== BIG_ENDIAN
;
231 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_arc
, arc_mach_type
))
232 as_warn ("could not set architecture and machine");
234 /* This call is necessary because we need to initialize `arc_operand_map'
235 which may be needed before we see the first insn. */
236 arc_opcode_init_tables (arc_get_opcode_mach (arc_mach_type
,
240 /* Initialize the various opcode and operand tables.
241 MACH is one of bfd_mach_arc_xxx. */
243 init_opcode_tables (mach
)
249 if ((arc_suffix_hash
= hash_new ()) == NULL
)
250 as_fatal ("virtual memory exhausted");
252 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_arc
, mach
))
253 as_warn ("could not set architecture and machine");
255 /* This initializes a few things in arc-opc.c that we need.
256 This must be called before the various arc_xxx_supported fns. */
257 arc_opcode_init_tables (arc_get_opcode_mach (mach
, target_big_endian
));
259 /* Only put the first entry of each equivalently named suffix in the
262 for (i
= 0; i
< arc_suffixes_count
; i
++)
264 if (strcmp (arc_suffixes
[i
].name
, last
) != 0)
265 hash_insert (arc_suffix_hash
, arc_suffixes
[i
].name
, (PTR
) (arc_suffixes
+ i
));
266 last
= arc_suffixes
[i
].name
;
269 /* Since registers don't have a prefix, we put them in the symbol table so
270 they can't be used as symbols. This also simplifies argument parsing as
271 we can let gas parse registers for us. The recorded register number is
272 the address of the register's entry in arc_reg_names.
274 If the register name is already in the table, then the existing
275 definition is assumed to be from an .ExtCoreRegister pseudo-op. */
277 for (i
= 0; i
< arc_reg_names_count
; i
++)
279 if (symbol_find (arc_reg_names
[i
].name
))
281 /* Use symbol_create here instead of symbol_new so we don't try to
282 output registers into the object file's symbol table. */
283 symbol_table_insert (symbol_create (arc_reg_names
[i
].name
,
285 (int) &arc_reg_names
[i
],
286 &zero_address_frag
));
289 /* Tell `.option' it's too late. */
290 cpu_tables_init_p
= 1;
293 /* Insert an operand value into an instruction.
294 If REG is non-NULL, it is a register number and ignore VAL. */
297 arc_insert_operand (insn
, operand
, mods
, reg
, val
, file
, line
)
299 const struct arc_operand
*operand
;
301 const struct arc_operand_value
*reg
;
306 if (operand
->bits
!= 32)
311 if ((operand
->flags
& ARC_OPERAND_SIGNED
) != 0)
313 if ((operand
->flags
& ARC_OPERAND_SIGNOPT
) != 0)
314 max
= (1 << operand
->bits
) - 1;
316 max
= (1 << (operand
->bits
- 1)) - 1;
317 min
= - (1 << (operand
->bits
- 1));
321 max
= (1 << operand
->bits
) - 1;
325 if ((operand
->flags
& ARC_OPERAND_NEGATIVE
) != 0)
330 if (test
< (offsetT
) min
|| test
> (offsetT
) max
)
331 as_warn_value_out_of_range (_("operand"), test
, (offsetT
) min
, (offsetT
) max
, file
, line
);
339 insn
= (*operand
->insert
) (insn
, operand
, mods
, reg
, (long) val
, &errmsg
);
340 if (errmsg
!= (const char *) NULL
)
344 insn
|= (((long) val
& ((1 << operand
->bits
) - 1))
350 /* We need to keep a list of fixups. We can't simply generate them as
351 we go, because that would require us to first create the frag, and
352 that would screw up references to ``.''. */
355 /* index into `arc_operands' */
362 #define MAX_SUFFIXES 5
364 /* This routine is called for each instruction to be assembled. */
370 const struct arc_opcode
*opcode
;
371 const struct arc_opcode
*std_opcode
;
372 struct arc_opcode
*ext_opcode
;
374 const char *last_errmsg
= 0;
376 static int init_tables_p
= 0;
378 /* Opcode table initialization is deferred until here because we have to
379 wait for a possible .option command. */
382 init_opcode_tables (arc_mach_type
);
386 /* Skip leading white space. */
387 while (ISSPACE (*str
))
390 /* The instructions are stored in lists hashed by the first letter (though
391 we needn't care how they're hashed). Get the first in the list. */
393 ext_opcode
= arc_ext_opcodes
;
394 std_opcode
= arc_opcode_lookup_asm (str
);
396 /* Keep looking until we find a match. */
399 for (opcode
= (ext_opcode
? ext_opcode
: std_opcode
);
401 opcode
= (ARC_OPCODE_NEXT_ASM (opcode
)
402 ? ARC_OPCODE_NEXT_ASM (opcode
)
403 : (ext_opcode
? ext_opcode
= NULL
, std_opcode
: NULL
)))
405 int past_opcode_p
, fc
, num_suffixes
;
408 struct arc_fixup fixups
[MAX_FIXUPS
];
409 /* Used as a sanity check. If we need a limm reloc, make sure we ask
410 for an extra 4 bytes from frag_more. */
413 const struct arc_operand_value
*insn_suffixes
[MAX_SUFFIXES
];
415 /* Is this opcode supported by the selected cpu? */
416 if (! arc_opcode_supported (opcode
))
419 /* Scan the syntax string. If it doesn't match, try the next one. */
421 arc_opcode_init_insert ();
422 insn
= opcode
->value
;
429 /* We don't check for (*str != '\0') here because we want to parse
430 any trailing fake arguments in the syntax string. */
431 for (str
= start
, syn
= opcode
->syntax
; *syn
!= '\0';)
434 const struct arc_operand
*operand
;
436 /* Non operand chars must match exactly. */
437 if (*syn
!= '%' || *++syn
== '%')
451 /* We have an operand. Pick out any modifiers. */
453 while (ARC_MOD_P (arc_operands
[arc_operand_map
[(int) *syn
]].flags
))
455 mods
|= arc_operands
[arc_operand_map
[(int) *syn
]].flags
& ARC_MOD_BITS
;
458 operand
= arc_operands
+ arc_operand_map
[(int) *syn
];
459 if (operand
->fmt
== 0)
460 as_fatal ("unknown syntax format character `%c'", *syn
);
462 if (operand
->flags
& ARC_OPERAND_FAKE
)
464 const char *errmsg
= NULL
;
467 insn
= (*operand
->insert
) (insn
, operand
, mods
, NULL
, 0, &errmsg
);
468 if (errmsg
!= (const char *) NULL
)
470 last_errmsg
= errmsg
;
471 if (operand
->flags
& ARC_OPERAND_ERROR
)
476 else if (operand
->flags
& ARC_OPERAND_WARN
)
481 && (operand
->flags
&& operand
->flags
& ARC_OPERAND_LIMM
)
483 (ARC_OPERAND_ABSOLUTE_BRANCH
| ARC_OPERAND_ADDRESS
)))
485 fixups
[fix_up_at
].opindex
= arc_operand_map
[operand
->fmt
];
490 /* Are we finished with suffixes? */
491 else if (!past_opcode_p
)
496 const struct arc_operand_value
*suf
, *suffix_end
;
497 const struct arc_operand_value
*suffix
= NULL
;
499 if (!(operand
->flags
& ARC_OPERAND_SUFFIX
))
502 /* If we're at a space in the input string, we want to skip the
503 remaining suffixes. There may be some fake ones though, so
504 just go on to try the next one. */
512 if (mods
& ARC_MOD_DOT
)
520 /* This can happen in "b.nd foo" and we're currently looking
521 for "%q" (ie: a condition code suffix). */
529 /* Pick the suffix out and look it up via the hash table. */
530 for (t
= s
; *t
&& ISALNUM (*t
); ++t
)
534 if ((suf
= get_ext_suffix (s
)))
537 suf
= hash_find (arc_suffix_hash
, s
);
540 /* This can happen in "blle foo" and we're currently using
541 the template "b%q%.n %j". The "bl" insn occurs later in
542 the table so "lle" isn't an illegal suffix. */
547 /* Is it the right type? Note that the same character is used
548 several times, so we have to examine all of them. This is
549 relatively efficient as equivalent entries are kept
550 together. If it's not the right type, don't increment `str'
551 so we try the next one in the series. */
553 if (ext_suffix_p
&& arc_operands
[suf
->type
].fmt
== *syn
)
555 /* Insert the suffix's value into the insn. */
558 insn
= (*operand
->insert
) (insn
, operand
,
559 mods
, NULL
, suf
->value
,
562 insn
|= suf
->value
<< operand
->shift
;
570 suffix_end
= arc_suffixes
+ arc_suffixes_count
;
572 suffix
< suffix_end
&& strcmp (suffix
->name
, suf
->name
) == 0;
575 if (arc_operands
[suffix
->type
].fmt
== *syn
)
577 /* Insert the suffix's value into the insn. */
579 insn
= (*operand
->insert
) (insn
, operand
,
580 mods
, NULL
, suffix
->value
,
583 insn
|= suffix
->value
<< operand
->shift
;
593 /* Wrong type. Just go on to try next insn entry. */
597 if (num_suffixes
== MAX_SUFFIXES
)
598 as_bad ("too many suffixes");
600 insn_suffixes
[num_suffixes
++] = suffix
;
604 /* This is either a register or an expression of some kind. */
607 const struct arc_operand_value
*reg
= NULL
;
611 if (operand
->flags
& ARC_OPERAND_SUFFIX
)
614 /* Is there anything left to parse?
615 We don't check for this at the top because we want to parse
616 any trailing fake arguments in the syntax string. */
617 if (is_end_of_line
[(unsigned char) *str
])
620 /* Parse the operand. */
621 hold
= input_line_pointer
;
622 input_line_pointer
= str
;
624 str
= input_line_pointer
;
625 input_line_pointer
= hold
;
627 if (exp
.X_op
== O_illegal
)
628 as_bad ("illegal operand");
629 else if (exp
.X_op
== O_absent
)
630 as_bad ("missing operand");
631 else if (exp
.X_op
== O_constant
)
633 value
= exp
.X_add_number
;
635 else if (exp
.X_op
== O_register
)
637 reg
= (struct arc_operand_value
*) exp
.X_add_number
;
639 #define IS_REG_DEST_OPERAND(o) ((o) == 'a')
640 else if (IS_REG_DEST_OPERAND (*syn
))
641 as_bad ("symbol as destination register");
644 if (!strncmp (str
, "@h30", 4))
646 arc_code_symbol (&exp
);
649 /* We need to generate a fixup for this expression. */
650 if (fc
>= MAX_FIXUPS
)
651 as_fatal ("too many fixups");
652 fixups
[fc
].exp
= exp
;
653 /* We don't support shimm relocs. break here to force
654 the assembler to output a limm. */
655 #define IS_REG_SHIMM_OFFSET(o) ((o) == 'd')
656 if (IS_REG_SHIMM_OFFSET (*syn
))
658 /* If this is a register constant (IE: one whose
659 register value gets stored as 61-63) then this
661 /* ??? This bit could use some cleaning up.
662 Referencing the format chars like this goes
664 if (IS_SYMBOL_OPERAND (*syn
))
668 /* Save this, we don't yet know what reloc to use. */
670 /* Tell insert_reg we need a limm. This is
671 needed because the value at this point is
673 /* ??? We need a cleaner interface than this. */
674 (*arc_operands
[arc_operand_map
['Q']].insert
)
675 (insn
, operand
, mods
, reg
, 0L, &junk
);
678 fixups
[fc
].opindex
= arc_operand_map
[(int) *syn
];
683 /* Insert the register or expression into the instruction. */
686 const char *errmsg
= NULL
;
687 insn
= (*operand
->insert
) (insn
, operand
, mods
,
688 reg
, (long) value
, &errmsg
);
689 if (errmsg
!= (const char *) NULL
)
691 last_errmsg
= errmsg
;
692 if (operand
->flags
& ARC_OPERAND_ERROR
)
697 else if (operand
->flags
& ARC_OPERAND_WARN
)
703 insn
|= (value
& ((1 << operand
->bits
) - 1)) << operand
->shift
;
709 /* If we're at the end of the syntax string, we're done. */
710 /* FIXME: try to move this to a separate function. */
717 /* For the moment we assume a valid `str' can only contain blanks
718 now. IE: We needn't try again with a longer version of the
719 insn and it is assumed that longer versions of insns appear
720 before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3). */
722 while (ISSPACE (*str
))
725 if (!is_end_of_line
[(unsigned char) *str
])
726 as_bad ("junk at end of line: `%s'", str
);
728 /* Is there a limm value? */
729 limm_p
= arc_opcode_limm_p (&limm
);
731 /* Perform various error and warning tests. */
734 static int in_delay_slot_p
= 0;
735 static int prev_insn_needs_cc_nop_p
= 0;
736 /* delay slot type seen */
737 int delay_slot_type
= ARC_DELAY_NONE
;
738 /* conditional execution flag seen */
740 /* 1 if condition codes are being set */
742 /* 1 if conditional branch, including `b' "branch always" */
743 int cond_branch_p
= opcode
->flags
& ARC_OPCODE_COND_BRANCH
;
745 for (i
= 0; i
< num_suffixes
; ++i
)
747 switch (arc_operands
[insn_suffixes
[i
]->type
].fmt
)
750 delay_slot_type
= insn_suffixes
[i
]->value
;
753 conditional
= insn_suffixes
[i
]->value
;
761 /* Putting an insn with a limm value in a delay slot is supposed to
762 be legal, but let's warn the user anyway. Ditto for 8 byte
763 jumps with delay slots. */
764 if (in_delay_slot_p
&& limm_p
)
765 as_warn ("8 byte instruction in delay slot");
766 if (delay_slot_type
!= ARC_DELAY_NONE
767 && limm_p
&& arc_insn_not_jl (insn
)) /* except for jl addr */
768 as_warn ("8 byte jump instruction with delay slot");
769 in_delay_slot_p
= (delay_slot_type
!= ARC_DELAY_NONE
) && !limm_p
;
771 /* Warn when a conditional branch immediately follows a set of
772 the condition codes. Note that this needn't be done if the
773 insn that sets the condition codes uses a limm. */
774 if (cond_branch_p
&& conditional
!= 0 /* 0 = "always" */
775 && prev_insn_needs_cc_nop_p
&& arc_mach_type
== bfd_mach_arc_5
)
776 as_warn ("conditional branch follows set of flags");
777 prev_insn_needs_cc_nop_p
=
778 /* FIXME: ??? not required:
779 (delay_slot_type != ARC_DELAY_NONE) && */
783 /* Write out the instruction.
784 It is important to fetch enough space in one call to `frag_more'.
785 We use (f - frag_now->fr_literal) to compute where we are and we
786 don't want frag_now to change between calls. */
790 md_number_to_chars (f
, insn
, 4);
791 md_number_to_chars (f
+ 4, limm
, 4);
792 dwarf2_emit_insn (8);
794 else if (limm_reloc_p
)
796 /* We need a limm reloc, but the tables think we don't. */
802 md_number_to_chars (f
, insn
, 4);
803 dwarf2_emit_insn (4);
806 /* Create any fixups. */
807 for (i
= 0; i
< fc
; ++i
)
809 int op_type
, reloc_type
;
811 const struct arc_operand
*operand
;
813 /* Create a fixup for this operand.
814 At this point we do not use a bfd_reloc_code_real_type for
815 operands residing in the insn, but instead just use the
816 operand index. This lets us easily handle fixups for any
817 operand type, although that is admittedly not a very exciting
818 feature. We pick a BFD reloc type in md_apply_fix3.
820 Limm values (4 byte immediate "constants") must be treated
821 normally because they're not part of the actual insn word
822 and thus the insertion routines don't handle them. */
824 if (arc_operands
[fixups
[i
].opindex
].flags
& ARC_OPERAND_LIMM
)
826 /* Modify the fixup addend as required by the cpu. */
827 fixups
[i
].exp
.X_add_number
+= arc_limm_fixup_adjust (insn
);
828 op_type
= fixups
[i
].opindex
;
829 /* FIXME: can we add this data to the operand table? */
830 if (op_type
== arc_operand_map
['L']
831 || op_type
== arc_operand_map
['s']
832 || op_type
== arc_operand_map
['o']
833 || op_type
== arc_operand_map
['O'])
834 reloc_type
= BFD_RELOC_32
;
835 else if (op_type
== arc_operand_map
['J'])
836 reloc_type
= BFD_RELOC_ARC_B26
;
839 reloc_type
= get_arc_exp_reloc_type (1, reloc_type
,
845 op_type
= get_arc_exp_reloc_type (0, fixups
[i
].opindex
,
846 &fixups
[i
].exp
, &exptmp
);
847 reloc_type
= op_type
+ (int) BFD_RELOC_UNUSED
;
849 operand
= &arc_operands
[op_type
];
850 fix_new_exp (frag_now
,
851 ((f
- frag_now
->fr_literal
)
852 + (operand
->flags
& ARC_OPERAND_LIMM
? 4 : 0)), 4,
854 (operand
->flags
& ARC_OPERAND_RELATIVE_BRANCH
) != 0,
855 (bfd_reloc_code_real_type
) reloc_type
);
862 /* Try the next entry. */
865 if (NULL
== last_errmsg
)
866 as_bad ("bad instruction `%s'", start
);
868 as_bad (last_errmsg
);
872 arc_extoper (opertype
)
881 struct arc_ext_operand_value
*ext_oper
;
887 name
= input_line_pointer
;
888 c
= get_symbol_end ();
889 name
= xstrdup (name
);
898 /* just after name is now '\0' */
899 p
= input_line_pointer
;
903 if (*input_line_pointer
!= ',')
905 as_bad ("expected comma after operand name");
906 ignore_rest_of_line ();
911 input_line_pointer
++; /* skip ',' */
912 number
= get_absolute_expression ();
916 as_bad ("negative operand number %d", number
);
917 ignore_rest_of_line ();
926 if (*input_line_pointer
!= ',')
928 as_bad ("expected comma after register-number");
929 ignore_rest_of_line ();
934 input_line_pointer
++; /* skip ',' */
935 mode
= input_line_pointer
;
937 if (!strncmp (mode
, "r|w", 3))
940 input_line_pointer
+= 3;
944 if (!strncmp (mode
, "r", 1))
946 imode
= ARC_REGISTER_READONLY
;
947 input_line_pointer
+= 1;
951 if (strncmp (mode
, "w", 1))
953 as_bad ("invalid mode");
954 ignore_rest_of_line ();
960 imode
= ARC_REGISTER_WRITEONLY
;
961 input_line_pointer
+= 1;
968 if (*input_line_pointer
!= ',')
970 as_bad ("expected comma after register-mode");
971 ignore_rest_of_line ();
976 input_line_pointer
++; /* skip ',' */
978 if (!strncmp (input_line_pointer
, "cannot_shortcut", 15))
980 imode
|= arc_get_noshortcut_flag ();
981 input_line_pointer
+= 15;
985 if (strncmp (input_line_pointer
, "can_shortcut", 12))
987 as_bad ("shortcut designator invalid");
988 ignore_rest_of_line ();
994 input_line_pointer
+= 12;
1000 if ((opertype
== 1) && number
> 60)
1002 as_bad ("core register value (%d) too large", number
);
1003 ignore_rest_of_line ();
1008 if ((opertype
== 0) && number
> 31)
1010 as_bad ("condition code value (%d) too large", number
);
1011 ignore_rest_of_line ();
1016 ext_oper
= (struct arc_ext_operand_value
*) \
1017 xmalloc (sizeof (struct arc_ext_operand_value
));
1021 /* If the symbol already exists, point it at the new definition. */
1022 if ((symbolP
= symbol_find (name
)))
1024 if (S_GET_SEGMENT (symbolP
) == reg_section
)
1025 S_SET_VALUE (symbolP
, (int) &ext_oper
->operand
);
1028 as_bad ("attempt to override symbol: %s", name
);
1029 ignore_rest_of_line ();
1037 /* If its not there, add it. */
1038 symbol_table_insert (symbol_create (name
, reg_section
,
1039 (int) &ext_oper
->operand
, &zero_address_frag
));
1043 ext_oper
->operand
.name
= name
;
1044 ext_oper
->operand
.value
= number
;
1045 ext_oper
->operand
.type
= arc_operand_type (opertype
);
1046 ext_oper
->operand
.flags
= imode
;
1048 ext_oper
->next
= arc_ext_operands
;
1049 arc_ext_operands
= ext_oper
;
1051 /* OK, now that we know what this operand is, put a description in
1052 the arc extension section of the output file. */
1055 old_subsec
= now_subseg
;
1063 *p
= 3 + strlen (name
) + 1;
1068 p
= frag_more (strlen (name
) + 1);
1073 *p
= 3 + strlen (name
) + 1;
1075 *p
= EXT_CORE_REGISTER
;
1078 p
= frag_more (strlen (name
) + 1);
1083 *p
= 6 + strlen (name
) + 1;
1085 *p
= EXT_AUX_REGISTER
;
1087 *p
= number
>> 24 & 0xff;
1089 *p
= number
>> 16 & 0xff;
1091 *p
= number
>> 8 & 0xff;
1094 p
= frag_more (strlen (name
) + 1);
1098 as_bad ("invalid opertype");
1099 ignore_rest_of_line ();
1105 subseg_set (old_sec
, old_subsec
);
1107 /* Enter all registers into the symbol table. */
1109 demand_empty_rest_of_line ();
1113 arc_extinst (ignore
)
1114 int ignore ATTRIBUTE_UNUSED
;
1120 int suffixcode
= -1;
1121 int opcode
, subopcode
;
1125 struct arc_opcode
*ext_op
;
1130 name
= input_line_pointer
;
1131 c
= get_symbol_end ();
1132 name
= xstrdup (name
);
1133 strcpy (syntax
, name
);
1134 name_len
= strlen (name
);
1136 /* just after name is now '\0' */
1137 p
= input_line_pointer
;
1142 if (*input_line_pointer
!= ',')
1144 as_bad ("expected comma after operand name");
1145 ignore_rest_of_line ();
1149 input_line_pointer
++; /* skip ',' */
1150 opcode
= get_absolute_expression ();
1154 if (*input_line_pointer
!= ',')
1156 as_bad ("expected comma after opcode");
1157 ignore_rest_of_line ();
1161 input_line_pointer
++; /* skip ',' */
1162 subopcode
= get_absolute_expression ();
1166 as_bad ("negative subopcode %d", subopcode
);
1167 ignore_rest_of_line ();
1175 as_bad ("subcode value found when opcode not equal 0x03");
1176 ignore_rest_of_line ();
1181 if (subopcode
< 0x09 || subopcode
== 0x3f)
1183 as_bad ("invalid subopcode %d", subopcode
);
1184 ignore_rest_of_line ();
1192 if (*input_line_pointer
!= ',')
1194 as_bad ("expected comma after subopcode");
1195 ignore_rest_of_line ();
1199 input_line_pointer
++; /* skip ',' */
1201 for (i
= 0; i
< (int) MAXSUFFIXCLASS
; i
++)
1203 if (!strncmp (suffixclass
[i
].name
,input_line_pointer
, suffixclass
[i
].len
))
1206 input_line_pointer
+= suffixclass
[i
].len
;
1211 if (-1 == suffixcode
)
1213 as_bad ("invalid suffix class");
1214 ignore_rest_of_line ();
1220 if (*input_line_pointer
!= ',')
1222 as_bad ("expected comma after suffix class");
1223 ignore_rest_of_line ();
1227 input_line_pointer
++; /* skip ',' */
1229 for (i
= 0; i
< (int) MAXSYNTAXCLASS
; i
++)
1231 if (!strncmp (syntaxclass
[i
].name
,input_line_pointer
, syntaxclass
[i
].len
))
1233 class = syntaxclass
[i
].class;
1234 input_line_pointer
+= syntaxclass
[i
].len
;
1239 if (0 == (SYNTAX_VALID
& class))
1241 as_bad ("invalid syntax class");
1242 ignore_rest_of_line ();
1246 if ((0x3 == opcode
) & (class & SYNTAX_3OP
))
1248 as_bad ("opcode 0x3 and SYNTAX_3OP invalid");
1249 ignore_rest_of_line ();
1256 strcat (syntax
, "%.q%.f ");
1259 strcat (syntax
, "%.f ");
1262 strcat (syntax
, "%.q ");
1265 strcat (syntax
, " ");
1268 as_bad ("unknown suffix class");
1269 ignore_rest_of_line ();
1274 strcat (syntax
, ((opcode
== 0x3) ? "%a,%b" : ((class & SYNTAX_3OP
) ? "%a,%b,%c" : "%b,%c")));
1276 strcat (syntax
, "%F");
1277 strcat (syntax
, "%S%L");
1279 ext_op
= (struct arc_opcode
*) xmalloc (sizeof (struct arc_opcode
));
1280 ext_op
->syntax
= xstrdup (syntax
);
1282 ext_op
->mask
= I (-1) | ((0x3 == opcode
) ? C (-1) : 0);
1283 ext_op
->value
= I (opcode
) | ((0x3 == opcode
) ? C (subopcode
) : 0);
1284 ext_op
->flags
= class;
1285 ext_op
->next_asm
= arc_ext_opcodes
;
1286 ext_op
->next_dis
= arc_ext_opcodes
;
1287 arc_ext_opcodes
= ext_op
;
1289 /* OK, now that we know what this inst is, put a description in the
1290 arc extension section of the output file. */
1293 old_subsec
= now_subseg
;
1298 *p
= 5 + name_len
+ 1;
1300 *p
= EXT_INSTRUCTION
;
1306 *p
= (class & (OP1_MUST_BE_IMM
| OP1_IMM_IMPLIED
) ? IGNORE_FIRST_OPD
: 0);
1307 p
= frag_more (name_len
);
1308 strncpy (p
, syntax
, name_len
);
1312 subseg_set (old_sec
, old_subsec
);
1314 demand_empty_rest_of_line ();
1320 if (!arcext_section
)
1322 arcext_section
= subseg_new (".arcextmap", 0);
1323 bfd_set_section_flags (stdoutput
, arcext_section
,
1324 SEC_READONLY
| SEC_HAS_CONTENTS
);
1327 subseg_set (arcext_section
, 0);
1332 arc_common (localScope
)
1341 name
= input_line_pointer
;
1342 c
= get_symbol_end ();
1343 /* just after name is now '\0' */
1344 p
= input_line_pointer
;
1348 if (*input_line_pointer
!= ',')
1350 as_bad ("expected comma after symbol name");
1351 ignore_rest_of_line ();
1355 input_line_pointer
++; /* skip ',' */
1356 size
= get_absolute_expression ();
1360 as_bad ("negative symbol length");
1361 ignore_rest_of_line ();
1366 symbolP
= symbol_find_or_make (name
);
1369 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
1371 as_bad ("ignoring attempt to re-define symbol");
1372 ignore_rest_of_line ();
1375 if (((int) S_GET_VALUE (symbolP
) != 0) \
1376 && ((int) S_GET_VALUE (symbolP
) != size
))
1378 as_warn ("length of symbol \"%s\" already %ld, ignoring %d",
1379 S_GET_NAME (symbolP
), (long) S_GET_VALUE (symbolP
), size
);
1381 assert (symbolP
->sy_frag
== &zero_address_frag
);
1383 /* Now parse the alignment field. This field is optional for
1384 local and global symbols. Default alignment is zero. */
1385 if (*input_line_pointer
== ',')
1387 input_line_pointer
++;
1388 align
= get_absolute_expression ();
1392 as_warn ("assuming symbol alignment of zero");
1398 if (localScope
!= 0)
1405 old_subsec
= now_subseg
;
1406 record_alignment (bss_section
, align
);
1407 subseg_set (bss_section
, 0); /* ??? subseg_set (bss_section, 1); ??? */
1411 frag_align (align
, 0, 0);
1413 /* Detach from old frag. */
1414 if (S_GET_SEGMENT (symbolP
) == bss_section
)
1415 symbolP
->sy_frag
->fr_symbol
= NULL
;
1417 symbolP
->sy_frag
= frag_now
;
1418 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
,
1419 (offsetT
) size
, (char *) 0);
1422 S_SET_SIZE (symbolP
, size
);
1423 S_SET_SEGMENT (symbolP
, bss_section
);
1424 S_CLEAR_EXTERNAL (symbolP
);
1426 subseg_set (old_sec
, old_subsec
);
1430 S_SET_VALUE (symbolP
, (valueT
) size
);
1431 S_SET_ALIGN (symbolP
, align
);
1432 S_SET_EXTERNAL (symbolP
);
1433 S_SET_SEGMENT (symbolP
, bfd_com_section_ptr
);
1436 symbolP
->bsym
->flags
|= BSF_OBJECT
;
1438 demand_empty_rest_of_line ();
1441 /* Select the cpu we're assembling for. */
1445 int ignore ATTRIBUTE_UNUSED
;
1451 cpu
= input_line_pointer
;
1452 c
= get_symbol_end ();
1453 mach
= arc_get_mach (cpu
);
1454 *input_line_pointer
= c
;
1456 /* If an instruction has already been seen, it's too late. */
1457 if (cpu_tables_init_p
)
1459 as_bad ("\".option\" directive must appear before any instructions");
1460 ignore_rest_of_line ();
1467 if (mach_type_specified_p
&& mach
!= arc_mach_type
)
1469 as_bad ("\".option\" directive conflicts with initial definition");
1470 ignore_rest_of_line ();
1475 /* The cpu may have been selected on the command line. */
1476 if (mach
!= arc_mach_type
)
1477 as_warn ("\".option\" directive overrides command-line (default) value");
1478 arc_mach_type
= mach
;
1479 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_arc
, mach
))
1480 as_fatal ("could not set architecture and machine");
1481 mach_type_specified_p
= 1;
1483 demand_empty_rest_of_line ();
1487 as_bad ("invalid identifier for \".option\"");
1488 ignore_rest_of_line ();
1491 /* Turn a string in input_line_pointer into a floating point constant
1492 of type TYPE, and store the appropriate bytes in *LITP. The number
1493 of LITTLENUMS emitted is stored in *SIZEP. An error message is
1494 returned, or NULL on OK. */
1496 /* Equal to MAX_PRECISION in atof-ieee.c */
1497 #define MAX_LITTLENUMS 6
1500 md_atof (type
, litP
, sizeP
)
1506 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
1507 LITTLENUM_TYPE
*wordP
;
1524 return "bad call to md_atof";
1527 t
= atof_ieee (input_line_pointer
, type
, words
);
1529 input_line_pointer
= t
;
1530 *sizeP
= prec
* sizeof (LITTLENUM_TYPE
);
1531 for (wordP
= words
; prec
--;)
1533 md_number_to_chars (litP
, (valueT
) (*wordP
++), sizeof (LITTLENUM_TYPE
));
1534 litP
+= sizeof (LITTLENUM_TYPE
);
1540 /* Write a value out to the object file, using the appropriate
1544 md_number_to_chars (buf
, val
, n
)
1549 if (target_big_endian
)
1550 number_to_chars_bigendian (buf
, val
, n
);
1552 number_to_chars_littleendian (buf
, val
, n
);
1555 /* Round up a section size to the appropriate boundary. */
1558 md_section_align (segment
, size
)
1562 int align
= bfd_get_section_alignment (stdoutput
, segment
);
1564 return ((size
+ (1 << align
) - 1) & (-1 << align
));
1567 /* We don't have any form of relaxing. */
1570 md_estimate_size_before_relax (fragp
, seg
)
1571 fragS
*fragp ATTRIBUTE_UNUSED
;
1572 asection
*seg ATTRIBUTE_UNUSED
;
1574 as_fatal (_("md_estimate_size_before_relax\n"));
1578 /* Convert a machine dependent frag. We never generate these. */
1581 md_convert_frag (abfd
, sec
, fragp
)
1582 bfd
*abfd ATTRIBUTE_UNUSED
;
1583 asection
*sec ATTRIBUTE_UNUSED
;
1584 fragS
*fragp ATTRIBUTE_UNUSED
;
1586 as_fatal (_("md_convert_frag\n"));
1590 arc_code_symbol (expressionP
)
1591 expressionS
*expressionP
;
1593 if (expressionP
->X_op
== O_symbol
&& expressionP
->X_add_number
== 0)
1596 expressionP
->X_op
= O_right_shift
;
1597 expressionP
->X_add_symbol
->sy_value
.X_op
= O_constant
;
1598 two
.X_op
= O_constant
;
1599 two
.X_add_symbol
= two
.X_op_symbol
= NULL
;
1600 two
.X_add_number
= 2;
1601 expressionP
->X_op_symbol
= make_expr_symbol (&two
);
1603 /* Allow %st(sym1-sym2) */
1604 else if (expressionP
->X_op
== O_subtract
1605 && expressionP
->X_add_symbol
!= NULL
1606 && expressionP
->X_op_symbol
!= NULL
1607 && expressionP
->X_add_number
== 0)
1610 expressionP
->X_add_symbol
= make_expr_symbol (expressionP
);
1611 expressionP
->X_op
= O_right_shift
;
1612 two
.X_op
= O_constant
;
1613 two
.X_add_symbol
= two
.X_op_symbol
= NULL
;
1614 two
.X_add_number
= 2;
1615 expressionP
->X_op_symbol
= make_expr_symbol (&two
);
1619 as_bad ("expression too complex code symbol");
1624 /* Parse an operand that is machine-specific.
1626 The ARC has a special %-op to adjust addresses so they're usable in
1627 branches. The "st" is short for the STatus register.
1628 ??? Later expand this to take a flags value too.
1630 ??? We can't create new expression types so we map the %-op's onto the
1631 existing syntax. This means that the user could use the chosen syntax
1632 to achieve the same effect. */
1635 md_operand (expressionP
)
1636 expressionS
*expressionP
;
1638 char *p
= input_line_pointer
;
1643 if (strncmp (p
, "%st(", 4) == 0)
1645 input_line_pointer
+= 4;
1646 expression (expressionP
);
1647 if (*input_line_pointer
!= ')')
1649 as_bad ("missing ')' in %%-op");
1652 ++input_line_pointer
;
1653 arc_code_symbol (expressionP
);
1657 /* It could be a register. */
1659 struct arc_ext_operand_value
*ext_oper
= arc_ext_operands
;
1664 l
= strlen (ext_oper
->operand
.name
);
1665 if (!strncmp (p
, ext_oper
->operand
.name
, l
) && !ISALNUM (*(p
+ l
)))
1667 input_line_pointer
+= l
+ 1;
1668 expressionP
->X_op
= O_register
;
1669 expressionP
->X_add_number
= (int) &ext_oper
->operand
;
1672 ext_oper
= ext_oper
->next
;
1674 for (i
= 0; i
< arc_reg_names_count
; i
++)
1676 l
= strlen (arc_reg_names
[i
].name
);
1677 if (!strncmp (p
, arc_reg_names
[i
].name
, l
) && !ISALNUM (*(p
+ l
)))
1679 input_line_pointer
+= l
+ 1;
1680 expressionP
->X_op
= O_register
;
1681 expressionP
->X_add_number
= (int) &arc_reg_names
[i
];
1688 /* We have no need to default values of symbols.
1689 We could catch register names here, but that is handled by inserting
1690 them all in the symbol table to begin with. */
1693 md_undefined_symbol (name
)
1694 char *name ATTRIBUTE_UNUSED
;
1699 /* Functions concerning expressions. */
1701 /* Parse a .byte, .word, etc. expression.
1703 Values for the status register are specified with %st(label).
1704 `label' will be right shifted by 2. */
1707 arc_parse_cons_expression (exp
, nbytes
)
1709 unsigned int nbytes ATTRIBUTE_UNUSED
;
1711 char *p
= input_line_pointer
;
1712 int code_symbol_fix
= 0;
1714 for (; ! is_end_of_line
[(unsigned char) *p
]; p
++)
1715 if (*p
== '@' && !strncmp (p
, "@h30", 4))
1717 code_symbol_fix
= 1;
1721 if (code_symbol_fix
)
1723 arc_code_symbol (exp
);
1724 input_line_pointer
= p
;
1728 /* Record a fixup for a cons expression. */
1731 arc_cons_fix_new (frag
, where
, nbytes
, exp
)
1742 /* This may be a special ARC reloc (eg: %st()). */
1743 reloc_type
= get_arc_exp_reloc_type (1, BFD_RELOC_32
, exp
, &exptmp
);
1744 fix_new_exp (frag
, where
, nbytes
, &exptmp
, 0, reloc_type
);
1748 fix_new_exp (frag
, where
, nbytes
, exp
, 0,
1749 nbytes
== 2 ? BFD_RELOC_16
1750 : nbytes
== 8 ? BFD_RELOC_64
1755 /* Functions concerning relocs. */
1757 /* The location from which a PC relative jump should be calculated,
1758 given a PC relative reloc. */
1761 md_pcrel_from (fixP
)
1764 /* Return the address of the delay slot. */
1765 return fixP
->fx_frag
->fr_address
+ fixP
->fx_where
+ fixP
->fx_size
;
1768 /* Compute the reloc type of an expression.
1769 The possibly modified expression is stored in EXPNEW.
1771 This is used to convert the expressions generated by the %-op's into
1772 the appropriate operand type. It is called for both data in instructions
1773 (operands) and data outside instructions (variables, debugging info, etc.).
1775 Currently supported %-ops:
1777 %st(symbol): represented as "symbol >> 2"
1778 "st" is short for STatus as in the status register (pc)
1780 DEFAULT_TYPE is the type to use if no special processing is required.
1782 DATA_P is non-zero for data or limm values, zero for insn operands.
1783 Remember that the opcode "insertion fns" cannot be used on data, they're
1784 only for inserting operands into insns. They also can't be used for limm
1785 values as the insertion routines don't handle limm values. When called for
1786 insns we return fudged reloc types (real_value - BFD_RELOC_UNUSED). When
1787 called for data or limm values we use real reloc types. */
1790 get_arc_exp_reloc_type (data_p
, default_type
, exp
, expnew
)
1794 expressionS
*expnew
;
1796 /* If the expression is "symbol >> 2" we must change it to just "symbol",
1797 as fix_new_exp can't handle it. Similarly for (symbol - symbol) >> 2.
1798 That's ok though. What's really going on here is that we're using
1799 ">> 2" as a special syntax for specifying BFD_RELOC_ARC_B26. */
1801 if (exp
->X_op
== O_right_shift
1802 && exp
->X_op_symbol
!= NULL
1803 && exp
->X_op_symbol
->sy_value
.X_op
== O_constant
1804 && exp
->X_op_symbol
->sy_value
.X_add_number
== 2
1805 && exp
->X_add_number
== 0)
1807 if (exp
->X_add_symbol
!= NULL
1808 && (exp
->X_add_symbol
->sy_value
.X_op
== O_constant
1809 || exp
->X_add_symbol
->sy_value
.X_op
== O_symbol
))
1812 expnew
->X_op
= O_symbol
;
1813 expnew
->X_op_symbol
= NULL
;
1814 return data_p
? BFD_RELOC_ARC_B26
: arc_operand_map
['J'];
1816 else if (exp
->X_add_symbol
!= NULL
1817 && exp
->X_add_symbol
->sy_value
.X_op
== O_subtract
)
1819 *expnew
= exp
->X_add_symbol
->sy_value
;
1820 return data_p
? BFD_RELOC_ARC_B26
: arc_operand_map
['J'];
1825 return default_type
;
1828 /* Apply a fixup to the object code. This is called for all the
1829 fixups we generated by the call to fix_new_exp, above. In the call
1830 above we used a reloc code which was the largest legal reloc code
1831 plus the operand index. Here we undo that to recover the operand
1832 index. At this point all symbol values should be fully resolved,
1833 and we attempt to completely resolve the reloc. If we can not do
1834 that, we determine the correct reloc code and put it back in the fixup. */
1837 md_apply_fix3 (fixP
, valP
, seg
)
1842 valueT value
= * valP
;
1844 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
1847 else if (fixP
->fx_pcrel
)
1849 /* Hack around bfd_install_relocation brain damage. */
1850 if (S_GET_SEGMENT (fixP
->fx_addsy
) != seg
)
1851 value
+= md_pcrel_from (fixP
);
1854 /* We can't actually support subtracting a symbol. */
1855 if (fixP
->fx_subsy
!= NULL
)
1856 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("expression too complex"));
1858 if ((int) fixP
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
1861 const struct arc_operand
*operand
;
1865 opindex
= (int) fixP
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
1867 operand
= &arc_operands
[opindex
];
1869 /* Fetch the instruction, insert the fully resolved operand
1870 value, and stuff the instruction back again. */
1871 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1872 if (target_big_endian
)
1873 insn
= bfd_getb32 ((unsigned char *) where
);
1875 insn
= bfd_getl32 ((unsigned char *) where
);
1876 insn
= arc_insert_operand (insn
, operand
, -1, NULL
, (offsetT
) value
,
1877 fixP
->fx_file
, fixP
->fx_line
);
1878 if (target_big_endian
)
1879 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1881 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
1885 /* Nothing else to do here. */
1889 /* Determine a BFD reloc value based on the operand information.
1890 We are only prepared to turn a few of the operands into relocs.
1891 !!! Note that we can't handle limm values here. Since we're using
1892 implicit addends the addend must be inserted into the instruction,
1893 however, the opcode insertion routines currently do nothing with
1895 if (operand
->fmt
== 'B')
1897 assert ((operand
->flags
& ARC_OPERAND_RELATIVE_BRANCH
) != 0
1898 && operand
->bits
== 20
1899 && operand
->shift
== 7);
1900 fixP
->fx_r_type
= BFD_RELOC_ARC_B22_PCREL
;
1902 else if (operand
->fmt
== 'J')
1904 assert ((operand
->flags
& ARC_OPERAND_ABSOLUTE_BRANCH
) != 0
1905 && operand
->bits
== 24
1906 && operand
->shift
== 32);
1907 fixP
->fx_r_type
= BFD_RELOC_ARC_B26
;
1909 else if (operand
->fmt
== 'L')
1911 assert ((operand
->flags
& ARC_OPERAND_LIMM
) != 0
1912 && operand
->bits
== 32
1913 && operand
->shift
== 32);
1914 fixP
->fx_r_type
= BFD_RELOC_32
;
1918 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1919 "unresolved expression that must be resolved");
1926 switch (fixP
->fx_r_type
)
1929 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
1933 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
1937 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
1940 case BFD_RELOC_ARC_B26
:
1941 /* If !fixP->fx_done then `value' is an implicit addend.
1942 We must shift it right by 2 in this case as well because the
1943 linker performs the relocation and then adds this in (as opposed
1944 to adding this in and then shifting right by 2). */
1946 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
1955 /* Translate internal representation of relocation info to BFD target
1959 tc_gen_reloc (section
, fixP
)
1960 asection
*section ATTRIBUTE_UNUSED
;
1965 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1966 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1968 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixP
->fx_addsy
);
1969 reloc
->address
= fixP
->fx_frag
->fr_address
+ fixP
->fx_where
;
1970 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixP
->fx_r_type
);
1971 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
1973 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1974 "internal error: can't export reloc type %d (`%s')",
1976 bfd_get_reloc_code_name (fixP
->fx_r_type
));
1980 assert (!fixP
->fx_pcrel
== !reloc
->howto
->pc_relative
);
1982 /* Set addend to account for PC being advanced one insn before the
1983 target address is computed. */
1985 reloc
->addend
= (fixP
->fx_pcrel
? -4 : 0);