1 /* tc-arc.c -- Assembler for the ARC
2 Copyright 1994, 1995, 1997, 1999, 2000, 2001, 2002
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
)
333 "operand out of range (%s not between %ld and %ld)";
336 sprint_value (buf
, test
);
337 if (file
== (char *) NULL
)
338 as_warn (err
, buf
, min
, max
);
340 as_warn_where (file
, line
, err
, buf
, min
, max
);
349 insn
= (*operand
->insert
) (insn
, operand
, mods
, reg
, (long) val
, &errmsg
);
350 if (errmsg
!= (const char *) NULL
)
354 insn
|= (((long) val
& ((1 << operand
->bits
) - 1))
360 /* We need to keep a list of fixups. We can't simply generate them as
361 we go, because that would require us to first create the frag, and
362 that would screw up references to ``.''. */
365 /* index into `arc_operands' */
372 #define MAX_SUFFIXES 5
374 /* This routine is called for each instruction to be assembled. */
380 const struct arc_opcode
*opcode
;
381 const struct arc_opcode
*std_opcode
;
382 struct arc_opcode
*ext_opcode
;
384 const char *last_errmsg
= 0;
386 static int init_tables_p
= 0;
388 /* Opcode table initialization is deferred until here because we have to
389 wait for a possible .option command. */
392 init_opcode_tables (arc_mach_type
);
396 /* Skip leading white space. */
397 while (ISSPACE (*str
))
400 /* The instructions are stored in lists hashed by the first letter (though
401 we needn't care how they're hashed). Get the first in the list. */
403 ext_opcode
= arc_ext_opcodes
;
404 std_opcode
= arc_opcode_lookup_asm (str
);
406 /* Keep looking until we find a match. */
409 for (opcode
= (ext_opcode
? ext_opcode
: std_opcode
);
411 opcode
= (ARC_OPCODE_NEXT_ASM (opcode
)
412 ? ARC_OPCODE_NEXT_ASM (opcode
)
413 : (ext_opcode
? ext_opcode
= NULL
, std_opcode
: NULL
)))
415 int past_opcode_p
, fc
, num_suffixes
;
418 struct arc_fixup fixups
[MAX_FIXUPS
];
419 /* Used as a sanity check. If we need a limm reloc, make sure we ask
420 for an extra 4 bytes from frag_more. */
423 const struct arc_operand_value
*insn_suffixes
[MAX_SUFFIXES
];
425 /* Is this opcode supported by the selected cpu? */
426 if (! arc_opcode_supported (opcode
))
429 /* Scan the syntax string. If it doesn't match, try the next one. */
431 arc_opcode_init_insert ();
432 insn
= opcode
->value
;
439 /* We don't check for (*str != '\0') here because we want to parse
440 any trailing fake arguments in the syntax string. */
441 for (str
= start
, syn
= opcode
->syntax
; *syn
!= '\0';)
444 const struct arc_operand
*operand
;
446 /* Non operand chars must match exactly. */
447 if (*syn
!= '%' || *++syn
== '%')
449 /* Handle '+' specially as we want to allow "ld r0,[sp-4]". */
450 /* ??? The syntax has changed to [sp,-4]. */
451 if (0 && *syn
== '+' && *str
== '-')
453 /* Skip over syn's +, but leave str's - alone.
454 That makes the case identical to "ld r0,[sp+-4]". */
457 else if (*str
== *syn
)
469 /* We have an operand. Pick out any modifiers. */
471 while (ARC_MOD_P (arc_operands
[arc_operand_map
[(int) *syn
]].flags
))
473 mods
|= arc_operands
[arc_operand_map
[(int) *syn
]].flags
& ARC_MOD_BITS
;
476 operand
= arc_operands
+ arc_operand_map
[(int) *syn
];
477 if (operand
->fmt
== 0)
478 as_fatal ("unknown syntax format character `%c'", *syn
);
480 if (operand
->flags
& ARC_OPERAND_FAKE
)
482 const char *errmsg
= NULL
;
485 insn
= (*operand
->insert
) (insn
, operand
, mods
, NULL
, 0, &errmsg
);
486 if (errmsg
!= (const char *) NULL
)
488 last_errmsg
= errmsg
;
489 if (operand
->flags
& ARC_OPERAND_ERROR
)
494 else if (operand
->flags
& ARC_OPERAND_WARN
)
499 && (operand
->flags
&& operand
->flags
& ARC_OPERAND_LIMM
)
501 (ARC_OPERAND_ABSOLUTE_BRANCH
| ARC_OPERAND_ADDRESS
)))
503 fixups
[fix_up_at
].opindex
= arc_operand_map
[operand
->fmt
];
508 /* Are we finished with suffixes? */
509 else if (!past_opcode_p
)
514 const struct arc_operand_value
*suf
, *suffix_end
;
515 const struct arc_operand_value
*suffix
= NULL
;
517 if (!(operand
->flags
& ARC_OPERAND_SUFFIX
))
520 /* If we're at a space in the input string, we want to skip the
521 remaining suffixes. There may be some fake ones though, so
522 just go on to try the next one. */
530 if (mods
& ARC_MOD_DOT
)
538 /* This can happen in "b.nd foo" and we're currently looking
539 for "%q" (ie: a condition code suffix). */
547 /* Pick the suffix out and look it up via the hash table. */
548 for (t
= s
; *t
&& ISALNUM (*t
); ++t
)
552 if ((suf
= get_ext_suffix (s
)))
555 suf
= hash_find (arc_suffix_hash
, s
);
558 /* This can happen in "blle foo" and we're currently using
559 the template "b%q%.n %j". The "bl" insn occurs later in
560 the table so "lle" isn't an illegal suffix. */
565 /* Is it the right type? Note that the same character is used
566 several times, so we have to examine all of them. This is
567 relatively efficient as equivalent entries are kept
568 together. If it's not the right type, don't increment `str'
569 so we try the next one in the series. */
571 if (ext_suffix_p
&& arc_operands
[suf
->type
].fmt
== *syn
)
573 /* Insert the suffix's value into the insn. */
576 insn
= (*operand
->insert
) (insn
, operand
,
577 mods
, NULL
, suf
->value
,
580 insn
|= suf
->value
<< operand
->shift
;
588 suffix_end
= arc_suffixes
+ arc_suffixes_count
;
590 suffix
< suffix_end
&& strcmp (suffix
->name
, suf
->name
) == 0;
593 if (arc_operands
[suffix
->type
].fmt
== *syn
)
595 /* Insert the suffix's value into the insn. */
597 insn
= (*operand
->insert
) (insn
, operand
,
598 mods
, NULL
, suffix
->value
,
601 insn
|= suffix
->value
<< operand
->shift
;
611 /* Wrong type. Just go on to try next insn entry. */
615 if (num_suffixes
== MAX_SUFFIXES
)
616 as_bad ("too many suffixes");
618 insn_suffixes
[num_suffixes
++] = suffix
;
622 /* This is either a register or an expression of some kind. */
625 const struct arc_operand_value
*reg
= NULL
;
629 if (operand
->flags
& ARC_OPERAND_SUFFIX
)
632 /* Is there anything left to parse?
633 We don't check for this at the top because we want to parse
634 any trailing fake arguments in the syntax string. */
635 if (is_end_of_line
[(unsigned char) *str
])
638 /* Parse the operand. */
639 hold
= input_line_pointer
;
640 input_line_pointer
= str
;
642 str
= input_line_pointer
;
643 input_line_pointer
= hold
;
645 if (exp
.X_op
== O_illegal
)
646 as_bad ("illegal operand");
647 else if (exp
.X_op
== O_absent
)
648 as_bad ("missing operand");
649 else if (exp
.X_op
== O_constant
)
651 value
= exp
.X_add_number
;
653 else if (exp
.X_op
== O_register
)
655 reg
= (struct arc_operand_value
*) exp
.X_add_number
;
657 #define IS_REG_DEST_OPERAND(o) ((o) == 'a')
658 else if (IS_REG_DEST_OPERAND (*syn
))
659 as_bad ("symbol as destination register");
662 if (!strncmp (str
, "@h30", 4))
664 arc_code_symbol (&exp
);
667 /* We need to generate a fixup for this expression. */
668 if (fc
>= MAX_FIXUPS
)
669 as_fatal ("too many fixups");
670 fixups
[fc
].exp
= exp
;
671 /* We don't support shimm relocs. break here to force
672 the assembler to output a limm. */
673 #define IS_REG_SHIMM_OFFSET(o) ((o) == 'd')
674 if (IS_REG_SHIMM_OFFSET (*syn
))
676 /* If this is a register constant (IE: one whose
677 register value gets stored as 61-63) then this
679 /* ??? This bit could use some cleaning up.
680 Referencing the format chars like this goes
682 if (IS_SYMBOL_OPERAND (*syn
))
686 /* Save this, we don't yet know what reloc to use. */
688 /* Tell insert_reg we need a limm. This is
689 needed because the value at this point is
691 /* ??? We need a cleaner interface than this. */
692 (*arc_operands
[arc_operand_map
['Q']].insert
)
693 (insn
, operand
, mods
, reg
, 0L, &junk
);
696 fixups
[fc
].opindex
= arc_operand_map
[(int) *syn
];
701 /* Insert the register or expression into the instruction. */
704 const char *errmsg
= NULL
;
705 insn
= (*operand
->insert
) (insn
, operand
, mods
,
706 reg
, (long) value
, &errmsg
);
707 if (errmsg
!= (const char *) NULL
)
709 last_errmsg
= errmsg
;
710 if (operand
->flags
& ARC_OPERAND_ERROR
)
715 else if (operand
->flags
& ARC_OPERAND_WARN
)
721 insn
|= (value
& ((1 << operand
->bits
) - 1)) << operand
->shift
;
727 /* If we're at the end of the syntax string, we're done. */
728 /* FIXME: try to move this to a separate function. */
735 /* For the moment we assume a valid `str' can only contain blanks
736 now. IE: We needn't try again with a longer version of the
737 insn and it is assumed that longer versions of insns appear
738 before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3). */
740 while (ISSPACE (*str
))
743 if (!is_end_of_line
[(unsigned char) *str
])
744 as_bad ("junk at end of line: `%s'", str
);
746 /* Is there a limm value? */
747 limm_p
= arc_opcode_limm_p (&limm
);
749 /* Perform various error and warning tests. */
752 static int in_delay_slot_p
= 0;
753 static int prev_insn_needs_cc_nop_p
= 0;
754 /* delay slot type seen */
755 int delay_slot_type
= ARC_DELAY_NONE
;
756 /* conditional execution flag seen */
758 /* 1 if condition codes are being set */
760 /* 1 if conditional branch, including `b' "branch always" */
761 int cond_branch_p
= opcode
->flags
& ARC_OPCODE_COND_BRANCH
;
763 for (i
= 0; i
< num_suffixes
; ++i
)
765 switch (arc_operands
[insn_suffixes
[i
]->type
].fmt
)
768 delay_slot_type
= insn_suffixes
[i
]->value
;
771 conditional
= insn_suffixes
[i
]->value
;
779 /* Putting an insn with a limm value in a delay slot is supposed to
780 be legal, but let's warn the user anyway. Ditto for 8 byte
781 jumps with delay slots. */
782 if (in_delay_slot_p
&& limm_p
)
783 as_warn ("8 byte instruction in delay slot");
784 if (delay_slot_type
!= ARC_DELAY_NONE
785 && limm_p
&& arc_insn_not_jl (insn
)) /* except for jl addr */
786 as_warn ("8 byte jump instruction with delay slot");
787 in_delay_slot_p
= (delay_slot_type
!= ARC_DELAY_NONE
) && !limm_p
;
789 /* Warn when a conditional branch immediately follows a set of
790 the condition codes. Note that this needn't be done if the
791 insn that sets the condition codes uses a limm. */
792 if (cond_branch_p
&& conditional
!= 0 /* 0 = "always" */
793 && prev_insn_needs_cc_nop_p
&& arc_mach_type
== bfd_mach_arc_5
)
794 as_warn ("conditional branch follows set of flags");
795 prev_insn_needs_cc_nop_p
=
796 /* FIXME: ??? not required:
797 (delay_slot_type != ARC_DELAY_NONE) && */
801 /* Write out the instruction.
802 It is important to fetch enough space in one call to `frag_more'.
803 We use (f - frag_now->fr_literal) to compute where we are and we
804 don't want frag_now to change between calls. */
808 md_number_to_chars (f
, insn
, 4);
809 md_number_to_chars (f
+ 4, limm
, 4);
810 dwarf2_emit_insn (8);
812 else if (limm_reloc_p
)
814 /* We need a limm reloc, but the tables think we don't. */
820 md_number_to_chars (f
, insn
, 4);
821 dwarf2_emit_insn (4);
824 /* Create any fixups. */
825 for (i
= 0; i
< fc
; ++i
)
827 int op_type
, reloc_type
;
829 const struct arc_operand
*operand
;
831 /* Create a fixup for this operand.
832 At this point we do not use a bfd_reloc_code_real_type for
833 operands residing in the insn, but instead just use the
834 operand index. This lets us easily handle fixups for any
835 operand type, although that is admittedly not a very exciting
836 feature. We pick a BFD reloc type in md_apply_fix3.
838 Limm values (4 byte immediate "constants") must be treated
839 normally because they're not part of the actual insn word
840 and thus the insertion routines don't handle them. */
842 if (arc_operands
[fixups
[i
].opindex
].flags
& ARC_OPERAND_LIMM
)
844 /* Modify the fixup addend as required by the cpu. */
845 fixups
[i
].exp
.X_add_number
+= arc_limm_fixup_adjust (insn
);
846 op_type
= fixups
[i
].opindex
;
847 /* FIXME: can we add this data to the operand table? */
848 if (op_type
== arc_operand_map
['L']
849 || op_type
== arc_operand_map
['s']
850 || op_type
== arc_operand_map
['o']
851 || op_type
== arc_operand_map
['O'])
852 reloc_type
= BFD_RELOC_32
;
853 else if (op_type
== arc_operand_map
['J'])
854 reloc_type
= BFD_RELOC_ARC_B26
;
857 reloc_type
= get_arc_exp_reloc_type (1, reloc_type
,
863 op_type
= get_arc_exp_reloc_type (0, fixups
[i
].opindex
,
864 &fixups
[i
].exp
, &exptmp
);
865 reloc_type
= op_type
+ (int) BFD_RELOC_UNUSED
;
867 operand
= &arc_operands
[op_type
];
868 fix_new_exp (frag_now
,
869 ((f
- frag_now
->fr_literal
)
870 + (operand
->flags
& ARC_OPERAND_LIMM
? 4 : 0)), 4,
872 (operand
->flags
& ARC_OPERAND_RELATIVE_BRANCH
) != 0,
873 (bfd_reloc_code_real_type
) reloc_type
);
880 /* Try the next entry. */
883 if (NULL
== last_errmsg
)
884 as_bad ("bad instruction `%s'", start
);
886 as_bad (last_errmsg
);
890 arc_extoper (opertype
)
899 struct arc_ext_operand_value
*ext_oper
;
905 name
= input_line_pointer
;
906 c
= get_symbol_end ();
907 name
= xstrdup (name
);
916 /* just after name is now '\0' */
917 p
= input_line_pointer
;
921 if (*input_line_pointer
!= ',')
923 as_bad ("expected comma after operand name");
924 ignore_rest_of_line ();
929 input_line_pointer
++; /* skip ',' */
930 number
= get_absolute_expression ();
934 as_bad ("negative operand number %d", number
);
935 ignore_rest_of_line ();
944 if (*input_line_pointer
!= ',')
946 as_bad ("expected comma after register-number");
947 ignore_rest_of_line ();
952 input_line_pointer
++; /* skip ',' */
953 mode
= input_line_pointer
;
955 if (!strncmp (mode
, "r|w", 3))
958 input_line_pointer
+= 3;
962 if (!strncmp (mode
, "r", 1))
964 imode
= ARC_REGISTER_READONLY
;
965 input_line_pointer
+= 1;
969 if (strncmp (mode
, "w", 1))
971 as_bad ("invalid mode");
972 ignore_rest_of_line ();
978 imode
= ARC_REGISTER_WRITEONLY
;
979 input_line_pointer
+= 1;
986 if (*input_line_pointer
!= ',')
988 as_bad ("expected comma after register-mode");
989 ignore_rest_of_line ();
994 input_line_pointer
++; /* skip ',' */
996 if (!strncmp (input_line_pointer
, "cannot_shortcut", 15))
998 imode
|= arc_get_noshortcut_flag ();
999 input_line_pointer
+= 15;
1003 if (strncmp (input_line_pointer
, "can_shortcut", 12))
1005 as_bad ("shortcut designator invalid");
1006 ignore_rest_of_line ();
1012 input_line_pointer
+= 12;
1018 if ((opertype
== 1) && number
> 60)
1020 as_bad ("core register value (%d) too large", number
);
1021 ignore_rest_of_line ();
1026 if ((opertype
== 0) && number
> 31)
1028 as_bad ("condition code value (%d) too large", number
);
1029 ignore_rest_of_line ();
1034 ext_oper
= (struct arc_ext_operand_value
*) \
1035 xmalloc (sizeof (struct arc_ext_operand_value
));
1039 /* If the symbol already exists, point it at the new definition. */
1040 if ((symbolP
= symbol_find (name
)))
1042 if (S_GET_SEGMENT (symbolP
) == reg_section
)
1043 S_SET_VALUE (symbolP
, (int) &ext_oper
->operand
);
1046 as_bad ("attempt to override symbol: %s", name
);
1047 ignore_rest_of_line ();
1055 /* If its not there, add it. */
1056 symbol_table_insert (symbol_create (name
, reg_section
,
1057 (int) &ext_oper
->operand
, &zero_address_frag
));
1061 ext_oper
->operand
.name
= name
;
1062 ext_oper
->operand
.value
= number
;
1063 ext_oper
->operand
.type
= arc_operand_type (opertype
);
1064 ext_oper
->operand
.flags
= imode
;
1066 ext_oper
->next
= arc_ext_operands
;
1067 arc_ext_operands
= ext_oper
;
1069 /* OK, now that we know what this operand is, put a description in
1070 the arc extension section of the output file. */
1073 old_subsec
= now_subseg
;
1081 *p
= 3 + strlen (name
) + 1;
1086 p
= frag_more (strlen (name
) + 1);
1091 *p
= 3 + strlen (name
) + 1;
1093 *p
= EXT_CORE_REGISTER
;
1096 p
= frag_more (strlen (name
) + 1);
1101 *p
= 6 + strlen (name
) + 1;
1103 *p
= EXT_AUX_REGISTER
;
1105 *p
= number
>> 24 & 0xff;
1107 *p
= number
>> 16 & 0xff;
1109 *p
= number
>> 8 & 0xff;
1112 p
= frag_more (strlen (name
) + 1);
1116 as_bad ("invalid opertype");
1117 ignore_rest_of_line ();
1123 subseg_set (old_sec
, old_subsec
);
1125 /* Enter all registers into the symbol table. */
1127 demand_empty_rest_of_line ();
1131 arc_extinst (ignore
)
1132 int ignore ATTRIBUTE_UNUSED
;
1134 unsigned char syntax
[129];
1138 int suffixcode
= -1;
1139 int opcode
, subopcode
;
1143 struct arc_opcode
*ext_op
;
1148 name
= input_line_pointer
;
1149 c
= get_symbol_end ();
1150 name
= xstrdup (name
);
1151 strcpy (syntax
, name
);
1152 name_len
= strlen (name
);
1154 /* just after name is now '\0' */
1155 p
= input_line_pointer
;
1160 if (*input_line_pointer
!= ',')
1162 as_bad ("expected comma after operand name");
1163 ignore_rest_of_line ();
1167 input_line_pointer
++; /* skip ',' */
1168 opcode
= get_absolute_expression ();
1172 if (*input_line_pointer
!= ',')
1174 as_bad ("expected comma after opcode");
1175 ignore_rest_of_line ();
1179 input_line_pointer
++; /* skip ',' */
1180 subopcode
= get_absolute_expression ();
1184 as_bad ("negative subopcode %d", subopcode
);
1185 ignore_rest_of_line ();
1193 as_bad ("subcode value found when opcode not equal 0x03");
1194 ignore_rest_of_line ();
1199 if (subopcode
< 0x09 || subopcode
== 0x3f)
1201 as_bad ("invalid subopcode %d", subopcode
);
1202 ignore_rest_of_line ();
1210 if (*input_line_pointer
!= ',')
1212 as_bad ("expected comma after subopcode");
1213 ignore_rest_of_line ();
1217 input_line_pointer
++; /* skip ',' */
1219 for (i
= 0; i
< (int) MAXSUFFIXCLASS
; i
++)
1221 if (!strncmp (suffixclass
[i
].name
,input_line_pointer
, suffixclass
[i
].len
))
1224 input_line_pointer
+= suffixclass
[i
].len
;
1229 if (-1 == suffixcode
)
1231 as_bad ("invalid suffix class");
1232 ignore_rest_of_line ();
1238 if (*input_line_pointer
!= ',')
1240 as_bad ("expected comma after suffix class");
1241 ignore_rest_of_line ();
1245 input_line_pointer
++; /* skip ',' */
1247 for (i
= 0; i
< (int) MAXSYNTAXCLASS
; i
++)
1249 if (!strncmp (syntaxclass
[i
].name
,input_line_pointer
, syntaxclass
[i
].len
))
1251 class = syntaxclass
[i
].class;
1252 input_line_pointer
+= syntaxclass
[i
].len
;
1257 if (0 == (SYNTAX_VALID
& class))
1259 as_bad ("invalid syntax class");
1260 ignore_rest_of_line ();
1264 if ((0x3 == opcode
) & (class & SYNTAX_3OP
))
1266 as_bad ("opcode 0x3 and SYNTAX_3OP invalid");
1267 ignore_rest_of_line ();
1274 strcat (syntax
, "%.q%.f ");
1277 strcat (syntax
, "%.f ");
1280 strcat (syntax
, "%.q ");
1283 strcat (syntax
, " ");
1286 as_bad ("unknown suffix class");
1287 ignore_rest_of_line ();
1292 strcat (syntax
, ((opcode
== 0x3) ? "%a,%b" : ((class & SYNTAX_3OP
) ? "%a,%b,%c" : "%b,%c")));
1294 strcat (syntax
, "%F");
1295 strcat (syntax
, "%S%L");
1297 ext_op
= (struct arc_opcode
*) xmalloc (sizeof (struct arc_opcode
));
1298 ext_op
->syntax
= xstrdup (syntax
);
1300 ext_op
->mask
= I (-1) | ((0x3 == opcode
) ? C (-1) : 0);
1301 ext_op
->value
= I (opcode
) | ((0x3 == opcode
) ? C (subopcode
) : 0);
1302 ext_op
->flags
= class;
1303 ext_op
->next_asm
= arc_ext_opcodes
;
1304 ext_op
->next_dis
= arc_ext_opcodes
;
1305 arc_ext_opcodes
= ext_op
;
1307 /* OK, now that we know what this inst is, put a description in the
1308 arc extension section of the output file. */
1311 old_subsec
= now_subseg
;
1316 *p
= 5 + name_len
+ 1;
1318 *p
= EXT_INSTRUCTION
;
1324 *p
= (class & (OP1_MUST_BE_IMM
| OP1_IMM_IMPLIED
) ? IGNORE_FIRST_OPD
: 0);
1325 p
= frag_more (name_len
);
1326 strncpy (p
, syntax
, name_len
);
1330 subseg_set (old_sec
, old_subsec
);
1332 demand_empty_rest_of_line ();
1338 if (!arcext_section
)
1340 arcext_section
= subseg_new (".arcextmap", 0);
1341 bfd_set_section_flags (stdoutput
, arcext_section
,
1342 SEC_READONLY
| SEC_HAS_CONTENTS
);
1345 subseg_set (arcext_section
, 0);
1350 arc_common (localScope
)
1359 name
= input_line_pointer
;
1360 c
= get_symbol_end ();
1361 /* just after name is now '\0' */
1362 p
= input_line_pointer
;
1366 if (*input_line_pointer
!= ',')
1368 as_bad ("expected comma after symbol name");
1369 ignore_rest_of_line ();
1373 input_line_pointer
++; /* skip ',' */
1374 size
= get_absolute_expression ();
1378 as_bad ("negative symbol length");
1379 ignore_rest_of_line ();
1384 symbolP
= symbol_find_or_make (name
);
1387 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
1389 as_bad ("ignoring attempt to re-define symbol");
1390 ignore_rest_of_line ();
1393 if (((int) S_GET_VALUE (symbolP
) != 0) \
1394 && ((int) S_GET_VALUE (symbolP
) != size
))
1396 as_warn ("length of symbol \"%s\" already %ld, ignoring %d",
1397 S_GET_NAME (symbolP
), (long) S_GET_VALUE (symbolP
), size
);
1399 assert (symbolP
->sy_frag
== &zero_address_frag
);
1401 /* Now parse the alignment field. This field is optional for
1402 local and global symbols. Default alignment is zero. */
1403 if (*input_line_pointer
== ',')
1405 input_line_pointer
++;
1406 align
= get_absolute_expression ();
1410 as_warn ("assuming symbol alignment of zero");
1416 if (localScope
!= 0)
1423 old_subsec
= now_subseg
;
1424 record_alignment (bss_section
, align
);
1425 subseg_set (bss_section
, 0); /* ??? subseg_set (bss_section, 1); ??? */
1429 frag_align (align
, 0, 0);
1431 /* Detach from old frag. */
1432 if (S_GET_SEGMENT (symbolP
) == bss_section
)
1433 symbolP
->sy_frag
->fr_symbol
= NULL
;
1435 symbolP
->sy_frag
= frag_now
;
1436 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
,
1437 (offsetT
) size
, (char *) 0);
1440 S_SET_SIZE (symbolP
, size
);
1441 S_SET_SEGMENT (symbolP
, bss_section
);
1442 S_CLEAR_EXTERNAL (symbolP
);
1444 subseg_set (old_sec
, old_subsec
);
1448 S_SET_VALUE (symbolP
, (valueT
) size
);
1449 S_SET_ALIGN (symbolP
, align
);
1450 S_SET_EXTERNAL (symbolP
);
1451 S_SET_SEGMENT (symbolP
, bfd_com_section_ptr
);
1454 symbolP
->bsym
->flags
|= BSF_OBJECT
;
1456 demand_empty_rest_of_line ();
1459 /* Select the cpu we're assembling for. */
1463 int ignore ATTRIBUTE_UNUSED
;
1469 cpu
= input_line_pointer
;
1470 c
= get_symbol_end ();
1471 mach
= arc_get_mach (cpu
);
1472 *input_line_pointer
= c
;
1474 /* If an instruction has already been seen, it's too late. */
1475 if (cpu_tables_init_p
)
1477 as_bad ("\".option\" directive must appear before any instructions");
1478 ignore_rest_of_line ();
1485 if (mach_type_specified_p
&& mach
!= arc_mach_type
)
1487 as_bad ("\".option\" directive conflicts with initial definition");
1488 ignore_rest_of_line ();
1493 /* The cpu may have been selected on the command line. */
1494 if (mach
!= arc_mach_type
)
1495 as_warn ("\".option\" directive overrides command-line (default) value");
1496 arc_mach_type
= mach
;
1497 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_arc
, mach
))
1498 as_fatal ("could not set architecture and machine");
1499 mach_type_specified_p
= 1;
1501 demand_empty_rest_of_line ();
1505 as_bad ("invalid identifier for \".option\"");
1506 ignore_rest_of_line ();
1509 /* Turn a string in input_line_pointer into a floating point constant
1510 of type TYPE, and store the appropriate bytes in *LITP. The number
1511 of LITTLENUMS emitted is stored in *SIZEP. An error message is
1512 returned, or NULL on OK. */
1514 /* Equal to MAX_PRECISION in atof-ieee.c */
1515 #define MAX_LITTLENUMS 6
1518 md_atof (type
, litP
, sizeP
)
1524 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
1525 LITTLENUM_TYPE
*wordP
;
1542 return "bad call to md_atof";
1545 t
= atof_ieee (input_line_pointer
, type
, words
);
1547 input_line_pointer
= t
;
1548 *sizeP
= prec
* sizeof (LITTLENUM_TYPE
);
1549 for (wordP
= words
; prec
--;)
1551 md_number_to_chars (litP
, (valueT
) (*wordP
++), sizeof (LITTLENUM_TYPE
));
1552 litP
+= sizeof (LITTLENUM_TYPE
);
1558 /* Write a value out to the object file, using the appropriate
1562 md_number_to_chars (buf
, val
, n
)
1567 if (target_big_endian
)
1568 number_to_chars_bigendian (buf
, val
, n
);
1570 number_to_chars_littleendian (buf
, val
, n
);
1573 /* Round up a section size to the appropriate boundary. */
1576 md_section_align (segment
, size
)
1580 int align
= bfd_get_section_alignment (stdoutput
, segment
);
1582 return ((size
+ (1 << align
) - 1) & (-1 << align
));
1585 /* We don't have any form of relaxing. */
1588 md_estimate_size_before_relax (fragp
, seg
)
1589 fragS
*fragp ATTRIBUTE_UNUSED
;
1590 asection
*seg ATTRIBUTE_UNUSED
;
1592 as_fatal (_("md_estimate_size_before_relax\n"));
1596 /* Convert a machine dependent frag. We never generate these. */
1599 md_convert_frag (abfd
, sec
, fragp
)
1600 bfd
*abfd ATTRIBUTE_UNUSED
;
1601 asection
*sec ATTRIBUTE_UNUSED
;
1602 fragS
*fragp ATTRIBUTE_UNUSED
;
1604 as_fatal (_("md_convert_frag\n"));
1608 arc_code_symbol (expressionP
)
1609 expressionS
*expressionP
;
1611 if (expressionP
->X_op
== O_symbol
&& expressionP
->X_add_number
== 0)
1614 expressionP
->X_op
= O_right_shift
;
1615 expressionP
->X_add_symbol
->sy_value
.X_op
= O_constant
;
1616 two
.X_op
= O_constant
;
1617 two
.X_add_symbol
= two
.X_op_symbol
= NULL
;
1618 two
.X_add_number
= 2;
1619 expressionP
->X_op_symbol
= make_expr_symbol (&two
);
1621 /* Allow %st(sym1-sym2) */
1622 else if (expressionP
->X_op
== O_subtract
1623 && expressionP
->X_add_symbol
!= NULL
1624 && expressionP
->X_op_symbol
!= NULL
1625 && expressionP
->X_add_number
== 0)
1628 expressionP
->X_add_symbol
= make_expr_symbol (expressionP
);
1629 expressionP
->X_op
= O_right_shift
;
1630 two
.X_op
= O_constant
;
1631 two
.X_add_symbol
= two
.X_op_symbol
= NULL
;
1632 two
.X_add_number
= 2;
1633 expressionP
->X_op_symbol
= make_expr_symbol (&two
);
1637 as_bad ("expression too complex code symbol");
1642 /* Parse an operand that is machine-specific.
1644 The ARC has a special %-op to adjust addresses so they're usable in
1645 branches. The "st" is short for the STatus register.
1646 ??? Later expand this to take a flags value too.
1648 ??? We can't create new expression types so we map the %-op's onto the
1649 existing syntax. This means that the user could use the chosen syntax
1650 to achieve the same effect. */
1653 md_operand (expressionP
)
1654 expressionS
*expressionP
;
1656 char *p
= input_line_pointer
;
1659 if (strncmp (p
, "%st(", 4) == 0)
1661 input_line_pointer
+= 4;
1662 expression (expressionP
);
1663 if (*input_line_pointer
!= ')')
1665 as_bad ("missing ')' in %%-op");
1668 ++input_line_pointer
;
1669 arc_code_symbol (expressionP
);
1673 /* It could be a register. */
1675 struct arc_ext_operand_value
*ext_oper
= arc_ext_operands
;
1680 l
= strlen (ext_oper
->operand
.name
);
1681 if (!strncmp (p
, ext_oper
->operand
.name
, l
) && !ISALNUM (*(p
+ l
)))
1683 input_line_pointer
+= l
+ 1;
1684 expressionP
->X_op
= O_register
;
1685 expressionP
->X_add_number
= (int) &ext_oper
->operand
;
1688 ext_oper
= ext_oper
->next
;
1690 for (i
= 0; i
< arc_reg_names_count
; i
++)
1692 l
= strlen (arc_reg_names
[i
].name
);
1693 if (!strncmp (p
, arc_reg_names
[i
].name
, l
) && !ISALNUM (*(p
+ l
)))
1695 input_line_pointer
+= l
+ 1;
1696 expressionP
->X_op
= O_register
;
1697 expressionP
->X_add_number
= (int) &arc_reg_names
[i
];
1704 /* We have no need to default values of symbols.
1705 We could catch register names here, but that is handled by inserting
1706 them all in the symbol table to begin with. */
1709 md_undefined_symbol (name
)
1710 char *name ATTRIBUTE_UNUSED
;
1715 /* Functions concerning expressions. */
1717 /* Parse a .byte, .word, etc. expression.
1719 Values for the status register are specified with %st(label).
1720 `label' will be right shifted by 2. */
1723 arc_parse_cons_expression (exp
, nbytes
)
1725 unsigned int nbytes ATTRIBUTE_UNUSED
;
1727 char *p
= input_line_pointer
;
1728 int code_symbol_fix
= 0;
1730 for (; ! is_end_of_line
[(unsigned char) *p
]; p
++)
1731 if (*p
== '@' && !strncmp (p
, "@h30", 4))
1733 code_symbol_fix
= 1;
1737 if (code_symbol_fix
)
1739 arc_code_symbol (exp
);
1740 input_line_pointer
= p
;
1744 /* Record a fixup for a cons expression. */
1747 arc_cons_fix_new (frag
, where
, nbytes
, exp
)
1758 /* This may be a special ARC reloc (eg: %st()). */
1759 reloc_type
= get_arc_exp_reloc_type (1, BFD_RELOC_32
, exp
, &exptmp
);
1760 fix_new_exp (frag
, where
, nbytes
, &exptmp
, 0, reloc_type
);
1764 fix_new_exp (frag
, where
, nbytes
, exp
, 0,
1765 nbytes
== 2 ? BFD_RELOC_16
1766 : nbytes
== 8 ? BFD_RELOC_64
1771 /* Functions concerning relocs. */
1773 /* The location from which a PC relative jump should be calculated,
1774 given a PC relative reloc. */
1777 md_pcrel_from (fixP
)
1780 /* Return the address of the delay slot. */
1781 return fixP
->fx_frag
->fr_address
+ fixP
->fx_where
+ fixP
->fx_size
;
1784 /* Compute the reloc type of an expression.
1785 The possibly modified expression is stored in EXPNEW.
1787 This is used to convert the expressions generated by the %-op's into
1788 the appropriate operand type. It is called for both data in instructions
1789 (operands) and data outside instructions (variables, debugging info, etc.).
1791 Currently supported %-ops:
1793 %st(symbol): represented as "symbol >> 2"
1794 "st" is short for STatus as in the status register (pc)
1796 DEFAULT_TYPE is the type to use if no special processing is required.
1798 DATA_P is non-zero for data or limm values, zero for insn operands.
1799 Remember that the opcode "insertion fns" cannot be used on data, they're
1800 only for inserting operands into insns. They also can't be used for limm
1801 values as the insertion routines don't handle limm values. When called for
1802 insns we return fudged reloc types (real_value - BFD_RELOC_UNUSED). When
1803 called for data or limm values we use real reloc types. */
1806 get_arc_exp_reloc_type (data_p
, default_type
, exp
, expnew
)
1810 expressionS
*expnew
;
1812 /* If the expression is "symbol >> 2" we must change it to just "symbol",
1813 as fix_new_exp can't handle it. Similarly for (symbol - symbol) >> 2.
1814 That's ok though. What's really going on here is that we're using
1815 ">> 2" as a special syntax for specifying BFD_RELOC_ARC_B26. */
1817 if (exp
->X_op
== O_right_shift
1818 && exp
->X_op_symbol
!= NULL
1819 && exp
->X_op_symbol
->sy_value
.X_op
== O_constant
1820 && exp
->X_op_symbol
->sy_value
.X_add_number
== 2
1821 && exp
->X_add_number
== 0)
1823 if (exp
->X_add_symbol
!= NULL
1824 && (exp
->X_add_symbol
->sy_value
.X_op
== O_constant
1825 || exp
->X_add_symbol
->sy_value
.X_op
== O_symbol
))
1828 expnew
->X_op
= O_symbol
;
1829 expnew
->X_op_symbol
= NULL
;
1830 return data_p
? BFD_RELOC_ARC_B26
: arc_operand_map
['J'];
1832 else if (exp
->X_add_symbol
!= NULL
1833 && exp
->X_add_symbol
->sy_value
.X_op
== O_subtract
)
1835 *expnew
= exp
->X_add_symbol
->sy_value
;
1836 return data_p
? BFD_RELOC_ARC_B26
: arc_operand_map
['J'];
1841 return default_type
;
1844 /* Apply a fixup to the object code. This is called for all the
1845 fixups we generated by the call to fix_new_exp, above. In the call
1846 above we used a reloc code which was the largest legal reloc code
1847 plus the operand index. Here we undo that to recover the operand
1848 index. At this point all symbol values should be fully resolved,
1849 and we attempt to completely resolve the reloc. If we can not do
1850 that, we determine the correct reloc code and put it back in the fixup. */
1853 md_apply_fix3 (fixP
, valP
, seg
)
1859 char *buf
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
1861 valueT value
= * valP
;
1863 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
1866 else if (fixP
->fx_pcrel
)
1868 /* Hack around bfd_install_relocation brain damage. */
1869 if (S_GET_SEGMENT (fixP
->fx_addsy
) != seg
)
1870 value
+= md_pcrel_from (fixP
);
1873 /* We can't actually support subtracting a symbol. */
1874 if (fixP
->fx_subsy
!= NULL
)
1875 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("expression too complex"));
1877 if ((int) fixP
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
1880 const struct arc_operand
*operand
;
1884 opindex
= (int) fixP
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
1886 operand
= &arc_operands
[opindex
];
1888 /* Fetch the instruction, insert the fully resolved operand
1889 value, and stuff the instruction back again. */
1890 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1891 if (target_big_endian
)
1892 insn
= bfd_getb32 ((unsigned char *) where
);
1894 insn
= bfd_getl32 ((unsigned char *) where
);
1895 insn
= arc_insert_operand (insn
, operand
, -1, NULL
, (offsetT
) value
,
1896 fixP
->fx_file
, fixP
->fx_line
);
1897 if (target_big_endian
)
1898 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1900 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
1904 /* Nothing else to do here. */
1908 /* Determine a BFD reloc value based on the operand information.
1909 We are only prepared to turn a few of the operands into relocs.
1910 !!! Note that we can't handle limm values here. Since we're using
1911 implicit addends the addend must be inserted into the instruction,
1912 however, the opcode insertion routines currently do nothing with
1914 if (operand
->fmt
== 'B')
1916 assert ((operand
->flags
& ARC_OPERAND_RELATIVE_BRANCH
) != 0
1917 && operand
->bits
== 20
1918 && operand
->shift
== 7);
1919 fixP
->fx_r_type
= BFD_RELOC_ARC_B22_PCREL
;
1921 else if (operand
->fmt
== 'J')
1923 assert ((operand
->flags
& ARC_OPERAND_ABSOLUTE_BRANCH
) != 0
1924 && operand
->bits
== 24
1925 && operand
->shift
== 32);
1926 fixP
->fx_r_type
= BFD_RELOC_ARC_B26
;
1928 else if (operand
->fmt
== 'L')
1930 assert ((operand
->flags
& ARC_OPERAND_LIMM
) != 0
1931 && operand
->bits
== 32
1932 && operand
->shift
== 32);
1933 fixP
->fx_r_type
= BFD_RELOC_32
;
1937 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1938 "unresolved expression that must be resolved");
1945 switch (fixP
->fx_r_type
)
1948 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
1952 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
1956 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
1961 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
1965 case BFD_RELOC_ARC_B26
:
1966 /* If !fixP->fx_done then `value' is an implicit addend.
1967 We must shift it right by 2 in this case as well because the
1968 linker performs the relocation and then adds this in (as opposed
1969 to adding this in and then shifting right by 2). */
1971 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
1980 /* Translate internal representation of relocation info to BFD target
1984 tc_gen_reloc (section
, fixP
)
1985 asection
*section ATTRIBUTE_UNUSED
;
1990 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1992 reloc
->sym_ptr_ptr
= &fixP
->fx_addsy
->bsym
;
1993 reloc
->address
= fixP
->fx_frag
->fr_address
+ fixP
->fx_where
;
1994 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixP
->fx_r_type
);
1995 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
1997 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1998 "internal error: can't export reloc type %d (`%s')",
2000 bfd_get_reloc_code_name (fixP
->fx_r_type
));
2004 assert (!fixP
->fx_pcrel
== !reloc
->howto
->pc_relative
);
2006 /* Set addend to account for PC being advanced one insn before the
2007 target address is computed. */
2009 reloc
->addend
= (fixP
->fx_pcrel
? -4 : 0);