]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-nios2.c
Update copyright years
[thirdparty/binutils-gdb.git] / gas / config / tc-nios2.c
CommitLineData
36591ba1 1/* Altera Nios II assembler.
4b95cf5c 2 Copyright (C) 2012-2014 Free Software Foundation, Inc.
36591ba1
SL
3 Contributed by Nigel Gray (ngray@altera.com).
4 Contributed by Mentor Graphics, Inc.
5
6 This file is part of GAS, the GNU Assembler.
7
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 3, or (at your option)
11 any later version.
12
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.
17
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, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
22
23#include "as.h"
24#include "opcode/nios2.h"
25#include "elf/nios2.h"
26#include "tc-nios2.h"
27#include "bfd.h"
28#include "dwarf2dbg.h"
29#include "subsegs.h"
30#include "safe-ctype.h"
31#include "dw2gencfi.h"
32
33#ifndef OBJ_ELF
34/* We are not supporting any other target so we throw a compile time error. */
35OBJ_ELF not defined
36#endif
37
38/* We can choose our endianness at run-time, regardless of configuration. */
39extern int target_big_endian;
40
41/* This array holds the chars that always start a comment. If the
42 pre-processor is disabled, these aren't very useful. */
43const char comment_chars[] = "#";
44
45/* This array holds the chars that only start a comment at the beginning of
46 a line. If the line seems to have the form '# 123 filename'
47 .line and .file directives will appear in the pre-processed output. */
48/* Note that input_file.c hand checks for '#' at the beginning of the
49 first line of the input file. This is because the compiler outputs
50 #NO_APP at the beginning of its output. */
51/* Also note that C style comments are always supported. */
52const char line_comment_chars[] = "#";
53
54/* This array holds machine specific line separator characters. */
55const char line_separator_chars[] = ";";
56
57/* Chars that can be used to separate mant from exp in floating point nums. */
58const char EXP_CHARS[] = "eE";
59
60/* Chars that mean this number is a floating point constant. */
61/* As in 0f12.456 */
62/* or 0d1.2345e12 */
63const char FLT_CHARS[] = "rRsSfFdDxXpP";
64
65/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
66 changed in read.c. Ideally it shouldn't have to know about it at all,
67 but nothing is ideal around here. */
68
69/* Machine-dependent command-line options. */
70
71const char *md_shortopts = "r";
72
73struct option md_longopts[] = {
74#define OPTION_RELAX_ALL (OPTION_MD_BASE + 0)
75 {"relax-all", no_argument, NULL, OPTION_RELAX_ALL},
76#define OPTION_NORELAX (OPTION_MD_BASE + 1)
77 {"no-relax", no_argument, NULL, OPTION_NORELAX},
78#define OPTION_RELAX_SECTION (OPTION_MD_BASE + 2)
79 {"relax-section", no_argument, NULL, OPTION_RELAX_SECTION},
80#define OPTION_EB (OPTION_MD_BASE + 3)
81 {"EB", no_argument, NULL, OPTION_EB},
82#define OPTION_EL (OPTION_MD_BASE + 4)
83 {"EL", no_argument, NULL, OPTION_EL}
84};
85
86size_t md_longopts_size = sizeof (md_longopts);
87
88/* The assembler supports three different relaxation modes, controlled by
89 command-line options. */
90typedef enum
91{
92 relax_section = 0,
93 relax_none,
94 relax_all
95} relax_optionT;
96
97/* Struct contains all assembler options set with .set. */
98struct
99{
100 /* .set noat -> noat = 1 allows assembly code to use at without warning
101 and macro expansions generate a warning.
102 .set at -> noat = 0, assembly code using at warn but macro expansions
103 do not generate warnings. */
104 bfd_boolean noat;
105
106 /* .set nobreak -> nobreak = 1 allows assembly code to use ba,bt without
107 warning.
108 .set break -> nobreak = 0, assembly code using ba,bt warns. */
109 bfd_boolean nobreak;
110
111 /* .cmd line option -relax-all allows all branches and calls to be replaced
112 with longer versions.
113 -no-relax inhibits branch/call conversion.
114 The default value is relax_section, which relaxes branches within
115 a section. */
116 relax_optionT relax;
117
118} nios2_as_options = {FALSE, FALSE, relax_section};
119
120
121typedef struct nios2_insn_reloc
122{
123 /* Any expression in the instruction is parsed into this field,
124 which is passed to fix_new_exp() to generate a fixup. */
125 expressionS reloc_expression;
126
127 /* The type of the relocation to be applied. */
128 bfd_reloc_code_real_type reloc_type;
129
130 /* PC-relative. */
131 unsigned int reloc_pcrel;
132
133 /* The next relocation to be applied to the instruction. */
134 struct nios2_insn_reloc *reloc_next;
135} nios2_insn_relocS;
136
137/* This struct is used to hold state when assembling instructions. */
138typedef struct nios2_insn_info
139{
140 /* Assembled instruction. */
141 unsigned long insn_code;
142 /* Pointer to the relevant bit of the opcode table. */
143 const struct nios2_opcode *insn_nios2_opcode;
144 /* After parsing ptrs to the tokens in the instruction fill this array
145 it is terminated with a null pointer (hence the first +1).
146 The second +1 is because in some parts of the code the opcode
147 is not counted as a token, but still placed in this array. */
148 const char *insn_tokens[NIOS2_MAX_INSN_TOKENS + 1 + 1];
149
150 /* This holds information used to generate fixups
151 and eventually relocations if it is not null. */
152 nios2_insn_relocS *insn_reloc;
153} nios2_insn_infoS;
154
155/* This struct associates an argument assemble function with
156 an argument syntax string. Used by the assembler to find out
157 how to parse and assemble a set of instruction operands and
158 return the instruction field values. */
159typedef struct nios2_arg_info
160{
161 const char *args;
162 void (*assemble_args_func) (nios2_insn_infoS *insn_info);
163} nios2_arg_infoS;
164
165/* This struct is used to convert Nios II pseudo-ops into the
166 corresponding real op. */
167typedef struct nios2_ps_insn_info
168{
169 /* Map this pseudo_op... */
170 const char *pseudo_insn;
171
172 /* ...to this real instruction. */
173 const char *insn;
174
175 /* Call this function to modify the operands.... */
176 void (*arg_modifer_func) (char ** parsed_args, const char *arg, int num,
177 int start);
178
179 /* ...with these arguments. */
180 const char *arg_modifier;
181 int num;
182 int index;
183
184 /* If arg_modifier_func allocates new memory, provide this function
185 to free it afterwards. */
186 void (*arg_cleanup_func) (char **parsed_args, int num, int start);
187} nios2_ps_insn_infoS;
188
189/* Opcode hash table. */
190static struct hash_control *nios2_opcode_hash = NULL;
191#define nios2_opcode_lookup(NAME) \
192 ((struct nios2_opcode *) hash_find (nios2_opcode_hash, (NAME)))
193
194/* Register hash table. */
195static struct hash_control *nios2_reg_hash = NULL;
196#define nios2_reg_lookup(NAME) \
197 ((struct nios2_reg *) hash_find (nios2_reg_hash, (NAME)))
198
199/* Parse args hash table. */
200static struct hash_control *nios2_arg_hash = NULL;
201#define nios2_arg_lookup(NAME) \
202 ((nios2_arg_infoS *) hash_find (nios2_arg_hash, (NAME)))
203
204/* Pseudo-op hash table. */
205static struct hash_control *nios2_ps_hash = NULL;
206#define nios2_ps_lookup(NAME) \
207 ((nios2_ps_insn_infoS *) hash_find (nios2_ps_hash, (NAME)))
208
209/* The known current alignment of the current section. */
210static int nios2_current_align;
211static segT nios2_current_align_seg;
212
213static int nios2_auto_align_on = 1;
214
215/* The last seen label in the current section. This is used to auto-align
216 labels preceeding instructions. */
217static symbolS *nios2_last_label;
218
219#ifdef OBJ_ELF
220/* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
221symbolS *GOT_symbol;
222#endif
223
224\f
225/** Utility routines. */
226/* Function md_chars_to_number takes the sequence of
227 bytes in buf and returns the corresponding value
228 in an int. n must be 1, 2 or 4. */
229static valueT
230md_chars_to_number (char *buf, int n)
231{
232 int i;
233 valueT val;
234
235 gas_assert (n == 1 || n == 2 || n == 4);
236
237 val = 0;
238 if (target_big_endian)
239 for (i = 0; i < n; ++i)
240 val = val | ((buf[i] & 0xff) << 8 * (n - (i + 1)));
241 else
242 for (i = 0; i < n; ++i)
243 val = val | ((buf[i] & 0xff) << 8 * i);
244 return val;
245}
246
247
248/* This function turns a C long int, short int or char
249 into the series of bytes that represent the number
250 on the target machine. */
251void
252md_number_to_chars (char *buf, valueT val, int n)
253{
254 gas_assert (n == 1 || n == 2 || n == 4 || n == 8);
255 if (target_big_endian)
256 number_to_chars_bigendian (buf, val, n);
257 else
258 number_to_chars_littleendian (buf, val, n);
259}
260
261/* Turn a string in input_line_pointer into a floating point constant
262 of type TYPE, and store the appropriate bytes in *LITP. The number
263 of LITTLENUMS emitted is stored in *SIZEP. An error message is
264 returned, or NULL on OK. */
265char *
266md_atof (int type, char *litP, int *sizeP)
267{
268 int prec;
269 LITTLENUM_TYPE words[4];
270 char *t;
271 int i;
272
273 switch (type)
274 {
275 case 'f':
276 prec = 2;
277 break;
278 case 'd':
279 prec = 4;
280 break;
281 default:
282 *sizeP = 0;
283 return _("bad call to md_atof");
284 }
285
286 t = atof_ieee (input_line_pointer, type, words);
287 if (t)
288 input_line_pointer = t;
289
290 *sizeP = prec * 2;
291
292 if (! target_big_endian)
293 for (i = prec - 1; i >= 0; i--, litP += 2)
294 md_number_to_chars (litP, (valueT) words[i], 2);
295 else
296 for (i = 0; i < prec; i++, litP += 2)
297 md_number_to_chars (litP, (valueT) words[i], 2);
298
299 return NULL;
300}
301
302/* Return true if STR starts with PREFIX, which should be a string literal. */
303#define strprefix(STR, PREFIX) \
304 (strncmp ((STR), PREFIX, strlen (PREFIX)) == 0)
305
306/* Return true if STR is prefixed with a control register name. */
307static int
308nios2_control_register_arg_p (const char *str)
309{
310 return (strprefix (str, "ctl")
311 || strprefix (str, "cpuid")
312 || strprefix (str, "status")
313 || strprefix (str, "estatus")
314 || strprefix (str, "bstatus")
315 || strprefix (str, "ienable")
316 || strprefix (str, "ipending")
317 || strprefix (str, "exception")
318 || strprefix (str, "pteaddr")
319 || strprefix (str, "tlbacc")
320 || strprefix (str, "tlbmisc")
e3031850 321 || strprefix (str, "eccinj")
36591ba1
SL
322 || strprefix (str, "config")
323 || strprefix (str, "mpubase")
324 || strprefix (str, "mpuacc")
325 || strprefix (str, "badaddr"));
326}
327
328/* Return true if STR is prefixed with a special relocation operator. */
329static int
330nios2_special_relocation_p (const char *str)
331{
332 return (strprefix (str, "%lo")
333 || strprefix (str, "%hi")
334 || strprefix (str, "%hiadj")
335 || strprefix (str, "%gprel")
336 || strprefix (str, "%got")
337 || strprefix (str, "%call")
338 || strprefix (str, "%gotoff_lo")
339 || strprefix (str, "%gotoff_hiadj")
340 || strprefix (str, "%tls_gd")
341 || strprefix (str, "%tls_ldm")
342 || strprefix (str, "%tls_ldo")
343 || strprefix (str, "%tls_ie")
344 || strprefix (str, "%tls_le")
345 || strprefix (str, "%gotoff"));
346}
347
348/* Checks whether the register name is a coprocessor
349 register - returns TRUE if it is, FALSE otherwise. */
350static bfd_boolean
351nios2_coproc_reg (const char *reg_name)
352{
353 gas_assert (reg_name != NULL);
354
355 /* Check that we do have a valid register name and that it is a
356 coprocessor register.
357 It must begin with c, not be a control register, and be a valid
358 register name. */
359 if (strprefix (reg_name, "c")
360 && !strprefix (reg_name, "ctl")
361 && hash_find (nios2_reg_hash, reg_name) != NULL)
362 return TRUE;
363 else
364 return FALSE;
365}
366
367/* nop fill pattern for text section. */
368static char const nop[4] = { 0x3a, 0x88, 0x01, 0x00 };
369
370/* Handles all machine-dependent alignment needs. */
371static void
372nios2_align (int log_size, const char *pfill, symbolS *label)
373{
374 int align;
375 long max_alignment = 15;
376
377 /* The front end is prone to changing segments out from under us
378 temporarily when -g is in effect. */
379 int switched_seg_p = (nios2_current_align_seg != now_seg);
380
381 align = log_size;
382 if (align > max_alignment)
383 {
384 align = max_alignment;
385 as_bad (_("Alignment too large: %d. assumed"), align);
386 }
387 else if (align < 0)
388 {
389 as_warn (_("Alignment negative: 0 assumed"));
390 align = 0;
391 }
392
393 if (align != 0)
394 {
395 if (subseg_text_p (now_seg) && align >= 2)
396 {
397 /* First, make sure we're on a four-byte boundary, in case
398 someone has been putting .byte values the text section. */
399 if (nios2_current_align < 2 || switched_seg_p)
400 frag_align (2, 0, 0);
401
402 /* Now fill in the alignment pattern. */
403 if (pfill != NULL)
404 frag_align_pattern (align, pfill, sizeof nop, 0);
405 else
406 frag_align (align, 0, 0);
407 }
408 else
409 frag_align (align, 0, 0);
410
411 if (!switched_seg_p)
412 nios2_current_align = align;
413
414 /* If the last label was in a different section we can't align it. */
415 if (label != NULL && !switched_seg_p)
416 {
417 symbolS *sym;
418 int label_seen = FALSE;
419 struct frag *old_frag;
420 valueT old_value;
421 valueT new_value;
422
423 gas_assert (S_GET_SEGMENT (label) == now_seg);
424
425 old_frag = symbol_get_frag (label);
426 old_value = S_GET_VALUE (label);
427 new_value = (valueT) frag_now_fix ();
428
429 /* It is possible to have more than one label at a particular
430 address, especially if debugging is enabled, so we must
431 take care to adjust all the labels at this address in this
432 fragment. To save time we search from the end of the symbol
433 list, backwards, since the symbols we are interested in are
434 almost certainly the ones that were most recently added.
435 Also to save time we stop searching once we have seen at least
436 one matching label, and we encounter a label that is no longer
437 in the target fragment. Note, this search is guaranteed to
438 find at least one match when sym == label, so no special case
439 code is necessary. */
440 for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym))
441 if (symbol_get_frag (sym) == old_frag
442 && S_GET_VALUE (sym) == old_value)
443 {
444 label_seen = TRUE;
445 symbol_set_frag (sym, frag_now);
446 S_SET_VALUE (sym, new_value);
447 }
448 else if (label_seen && symbol_get_frag (sym) != old_frag)
449 break;
450 }
451 record_alignment (now_seg, align);
452 }
453}
454
455\f
456/** Support for self-check mode. */
457
458/* Mode of the assembler. */
459typedef enum
460{
461 NIOS2_MODE_ASSEMBLE, /* Ordinary operation. */
462 NIOS2_MODE_TEST /* Hidden mode used for self testing. */
463} NIOS2_MODE;
464
465static NIOS2_MODE nios2_mode = NIOS2_MODE_ASSEMBLE;
466
467/* This function is used to in self-checking mode
468 to check the assembled instruction
469 opcode should be the assembled opcode, and exp_opcode
470 the parsed string representing the expected opcode. */
471static void
472nios2_check_assembly (unsigned int opcode, const char *exp_opcode)
473{
474 if (nios2_mode == NIOS2_MODE_TEST)
475 {
476 if (exp_opcode == NULL)
477 as_bad (_("expecting opcode string in self test mode"));
478 else if (opcode != strtoul (exp_opcode, NULL, 16))
479 as_bad (_("assembly 0x%08x, expected %s"), opcode, exp_opcode);
480 }
481}
482
483\f
484/** Support for machine-dependent assembler directives. */
485/* Handle the .align pseudo-op. This aligns to a power of two. It
486 also adjusts any current instruction label. We treat this the same
487 way the MIPS port does: .align 0 turns off auto alignment. */
488static void
489s_nios2_align (int ignore ATTRIBUTE_UNUSED)
490{
491 int align;
492 char fill;
493 const char *pfill = NULL;
494 long max_alignment = 15;
495
496 align = get_absolute_expression ();
497 if (align > max_alignment)
498 {
499 align = max_alignment;
500 as_bad (_("Alignment too large: %d. assumed"), align);
501 }
502 else if (align < 0)
503 {
504 as_warn (_("Alignment negative: 0 assumed"));
505 align = 0;
506 }
507
508 if (*input_line_pointer == ',')
509 {
510 input_line_pointer++;
511 fill = get_absolute_expression ();
512 pfill = (const char *) &fill;
513 }
514 else if (subseg_text_p (now_seg))
515 pfill = (const char *) &nop;
516 else
517 {
518 pfill = NULL;
519 nios2_last_label = NULL;
520 }
521
522 if (align != 0)
523 {
524 nios2_auto_align_on = 1;
525 nios2_align (align, pfill, nios2_last_label);
526 nios2_last_label = NULL;
527 }
528 else
529 nios2_auto_align_on = 0;
530
531 demand_empty_rest_of_line ();
532}
533
534/* Handle the .text pseudo-op. This is like the usual one, but it
535 clears the saved last label and resets known alignment. */
536static void
537s_nios2_text (int i)
538{
539 s_text (i);
540 nios2_last_label = NULL;
541 nios2_current_align = 0;
542 nios2_current_align_seg = now_seg;
543}
544
545/* Handle the .data pseudo-op. This is like the usual one, but it
546 clears the saved last label and resets known alignment. */
547static void
548s_nios2_data (int i)
549{
550 s_data (i);
551 nios2_last_label = NULL;
552 nios2_current_align = 0;
553 nios2_current_align_seg = now_seg;
554}
555
556/* Handle the .section pseudo-op. This is like the usual one, but it
557 clears the saved last label and resets known alignment. */
558static void
559s_nios2_section (int ignore)
560{
561 obj_elf_section (ignore);
562 nios2_last_label = NULL;
563 nios2_current_align = 0;
564 nios2_current_align_seg = now_seg;
565}
566
567/* Explicitly unaligned cons. */
568static void
569s_nios2_ucons (int nbytes)
570{
571 int hold;
572 hold = nios2_auto_align_on;
573 nios2_auto_align_on = 0;
574 cons (nbytes);
575 nios2_auto_align_on = hold;
576}
577
578/* Handle the .sdata directive. */
579static void
580s_nios2_sdata (int ignore ATTRIBUTE_UNUSED)
581{
582 get_absolute_expression (); /* Ignored. */
583 subseg_new (".sdata", 0);
584 demand_empty_rest_of_line ();
585}
586
587/* .set sets assembler options eg noat/at and is also used
588 to set symbol values (.equ, .equiv ). */
589static void
590s_nios2_set (int equiv)
591{
592 char *directive = input_line_pointer;
593 char delim = get_symbol_end ();
594 char *endline = input_line_pointer;
595 *endline = delim;
596
597 /* We only want to handle ".set XXX" if the
598 user has tried ".set XXX, YYY" they are not
599 trying a directive. This prevents
600 us from polluting the name space. */
601 SKIP_WHITESPACE ();
602 if (is_end_of_line[(unsigned char) *input_line_pointer])
603 {
604 bfd_boolean done = TRUE;
605 *endline = 0;
606
607 if (!strcmp (directive, "noat"))
608 nios2_as_options.noat = TRUE;
609 else if (!strcmp (directive, "at"))
610 nios2_as_options.noat = FALSE;
611 else if (!strcmp (directive, "nobreak"))
612 nios2_as_options.nobreak = TRUE;
613 else if (!strcmp (directive, "break"))
614 nios2_as_options.nobreak = FALSE;
615 else if (!strcmp (directive, "norelax"))
616 nios2_as_options.relax = relax_none;
617 else if (!strcmp (directive, "relaxsection"))
618 nios2_as_options.relax = relax_section;
619 else if (!strcmp (directive, "relaxall"))
620 nios2_as_options.relax = relax_all;
621 else
622 done = FALSE;
623
624 if (done)
625 {
626 *endline = delim;
627 demand_empty_rest_of_line ();
628 return;
629 }
630 }
631
632 /* If we fall through to here, either we have ".set XXX, YYY"
633 or we have ".set XXX" where XXX is unknown or we have
634 a syntax error. */
635 input_line_pointer = directive;
636 *endline = delim;
637 s_set (equiv);
638}
639
640/* Machine-dependent assembler directives.
641 Format of each entry is:
642 { "directive", handler_func, param } */
643const pseudo_typeS md_pseudo_table[] = {
644 {"align", s_nios2_align, 0},
645 {"text", s_nios2_text, 0},
646 {"data", s_nios2_data, 0},
647 {"section", s_nios2_section, 0},
648 {"section.s", s_nios2_section, 0},
649 {"sect", s_nios2_section, 0},
650 {"sect.s", s_nios2_section, 0},
651 /* .dword and .half are included for compatibility with MIPS. */
652 {"dword", cons, 8},
653 {"half", cons, 2},
654 /* NIOS2 native word size is 4 bytes, so we override
655 the GAS default of 2. */
656 {"word", cons, 4},
657 /* Explicitly unaligned directives. */
658 {"2byte", s_nios2_ucons, 2},
659 {"4byte", s_nios2_ucons, 4},
660 {"8byte", s_nios2_ucons, 8},
661 {"16byte", s_nios2_ucons, 16},
662#ifdef OBJ_ELF
663 {"sdata", s_nios2_sdata, 0},
664#endif
665 {"set", s_nios2_set, 0},
666 {NULL, NULL, 0}
667};
668
669\f
670/** Relaxation support. */
671
672/* We support two relaxation modes: a limited PC-relative mode with
673 -relax-section (the default), and an absolute jump mode with -relax-all.
674
675 Nios II PC-relative branch instructions only support 16-bit offsets.
676 And, there's no good way to add a 32-bit constant to the PC without
677 using two registers.
678
679 To deal with this, for the pc-relative relaxation mode we convert
680 br label
681 into a series of 16-bit adds, like:
682 nextpc at
683 addi at, at, 32767
684 ...
685 addi at, at, remainder
686 jmp at
687
688 Similarly, conditional branches are converted from
689 b(condition) r, s, label
690 into a series like:
691 b(opposite condition) r, s, skip
692 nextpc at
693 addi at, at, 32767
694 ...
695 addi at, at, remainder
696 jmp at
697 skip:
698
699 The compiler can do a better job, either by converting the branch
700 directly into a JMP (going through the GOT for PIC) or by allocating
701 a second register for the 32-bit displacement.
702
703 For the -relax-all relaxation mode, the conversions are
704 movhi at, %hi(symbol+offset)
705 ori at, %lo(symbol+offset)
706 jmp at
707 and
708 b(opposite condition), r, s, skip
709 movhi at, %hi(symbol+offset)
710 ori at, %lo(symbol+offset)
711 jmp at
712 skip:
713 respectively.
714*/
715
716/* Arbitrarily limit the number of addis we can insert; we need to be able
717 to specify the maximum growth size for each frag that contains a
718 relaxable branch. There's no point in specifying a huge number here
719 since that means the assembler needs to allocate that much extra
720 memory for every branch, and almost no real code will ever need it.
721 Plus, as already noted a better solution is to just use a jmp, or
722 allocate a second register to hold a 32-bit displacement.
723 FIXME: Rather than making this a constant, it could be controlled by
724 a command-line argument. */
725#define RELAX_MAX_ADDI 32
726
727/* The fr_subtype field represents the target-specific relocation state.
728 It has type relax_substateT (unsigned int). We use it to track the
729 number of addis necessary, plus a bit to track whether this is a
730 conditional branch.
731 Regardless of the smaller RELAX_MAX_ADDI limit, we reserve 16 bits
732 in the fr_subtype to encode the number of addis so that the whole
733 theoretically-valid range is representable.
734 For the -relax-all mode, N = 0 represents an in-range branch and N = 1
735 represents a branch that needs to be relaxed. */
736#define UBRANCH (0 << 16)
737#define CBRANCH (1 << 16)
738#define IS_CBRANCH(SUBTYPE) ((SUBTYPE) & CBRANCH)
739#define IS_UBRANCH(SUBTYPE) (!IS_CBRANCH (SUBTYPE))
740#define UBRANCH_SUBTYPE(N) (UBRANCH | (N))
741#define CBRANCH_SUBTYPE(N) (CBRANCH | (N))
742#define SUBTYPE_ADDIS(SUBTYPE) ((SUBTYPE) & 0xffff)
743
744/* For the -relax-section mode, unconditional branches require 2 extra i
745 nstructions besides the addis, conditional branches require 3. */
746#define UBRANCH_ADDIS_TO_SIZE(N) (((N) + 2) * 4)
747#define CBRANCH_ADDIS_TO_SIZE(N) (((N) + 3) * 4)
748
749/* For the -relax-all mode, unconditional branches require 3 instructions
750 and conditional branches require 4. */
751#define UBRANCH_JUMP_SIZE 12
752#define CBRANCH_JUMP_SIZE 16
753
754/* Maximum sizes of relaxation sequences. */
755#define UBRANCH_MAX_SIZE \
756 (nios2_as_options.relax == relax_all \
757 ? UBRANCH_JUMP_SIZE \
758 : UBRANCH_ADDIS_TO_SIZE (RELAX_MAX_ADDI))
759#define CBRANCH_MAX_SIZE \
760 (nios2_as_options.relax == relax_all \
761 ? CBRANCH_JUMP_SIZE \
762 : CBRANCH_ADDIS_TO_SIZE (RELAX_MAX_ADDI))
763
764/* Register number of AT, the assembler temporary. */
765#define AT_REGNUM 1
766
767/* Determine how many bytes are required to represent the sequence
768 indicated by SUBTYPE. */
769static int
770nios2_relax_subtype_size (relax_substateT subtype)
771{
772 int n = SUBTYPE_ADDIS (subtype);
773 if (n == 0)
774 /* Regular conditional/unconditional branch instruction. */
775 return 4;
776 else if (nios2_as_options.relax == relax_all)
777 return (IS_CBRANCH (subtype) ? CBRANCH_JUMP_SIZE : UBRANCH_JUMP_SIZE);
778 else if (IS_CBRANCH (subtype))
779 return CBRANCH_ADDIS_TO_SIZE (n);
780 else
781 return UBRANCH_ADDIS_TO_SIZE (n);
782}
783
784/* Estimate size of fragp before relaxation.
785 This could also examine the offset in fragp and adjust
786 fragp->fr_subtype, but we will do that in nios2_relax_frag anyway. */
787int
788md_estimate_size_before_relax (fragS *fragp, segT segment ATTRIBUTE_UNUSED)
789{
790 return nios2_relax_subtype_size (fragp->fr_subtype);
791}
792
793/* Implement md_relax_frag, returning the change in size of the frag. */
794long
795nios2_relax_frag (segT segment, fragS *fragp, long stretch)
796{
797 addressT target = fragp->fr_offset;
798 relax_substateT subtype = fragp->fr_subtype;
799 symbolS *symbolp = fragp->fr_symbol;
800
801 if (symbolp)
802 {
803 fragS *sym_frag = symbol_get_frag (symbolp);
804 offsetT offset;
805 int n;
806
807 target += S_GET_VALUE (symbolp);
808
809 /* See comments in write.c:relax_frag about handling of stretch. */
810 if (stretch != 0
811 && sym_frag->relax_marker != fragp->relax_marker)
812 {
813 if (stretch < 0 || sym_frag->region == fragp->region)
814 target += stretch;
815 else if (target < fragp->fr_address)
816 target = fragp->fr_next->fr_address + stretch;
817 }
818
819 /* We subtract 4 because all pc relative branches are
820 from the next instruction. */
821 offset = target - fragp->fr_address - fragp->fr_fix - 4;
822 if (offset >= -32768 && offset <= 32764)
823 /* Fits in PC-relative branch. */
824 n = 0;
825 else if (nios2_as_options.relax == relax_all)
826 /* Convert to jump. */
827 n = 1;
828 else if (nios2_as_options.relax == relax_section
829 && S_GET_SEGMENT (symbolp) == segment
830 && S_IS_DEFINED (symbolp))
831 /* Attempt a PC-relative relaxation on a branch to a defined
832 symbol in the same segment. */
833 {
834 /* The relaxation for conditional branches is offset by 4
835 bytes because we insert the inverted branch around the
836 sequence. */
837 if (IS_CBRANCH (subtype))
838 offset = offset - 4;
839 if (offset > 0)
840 n = offset / 32767 + 1;
841 else
842 n = offset / -32768 + 1;
843
844 /* Bail out immediately if relaxation has failed. If we try to
845 defer the diagnostic to md_convert_frag, some pathological test
846 cases (e.g. gcc/testsuite/gcc.c-torture/compile/20001226-1.c)
847 apparently never converge. By returning 0 here we could pretend
848 to the caller that nothing has changed, but that leaves things
849 in an inconsistent state when we get to md_convert_frag. */
850 if (n > RELAX_MAX_ADDI)
851 {
852 as_bad_where (fragp->fr_file, fragp->fr_line,
853 _("branch offset out of range\n"));
854 as_fatal (_("branch relaxation failed\n"));
855 }
856 }
857 else
858 /* We cannot handle this case, diagnose overflow later. */
859 return 0;
860
861 if (IS_CBRANCH (subtype))
862 fragp->fr_subtype = CBRANCH_SUBTYPE (n);
863 else
864 fragp->fr_subtype = UBRANCH_SUBTYPE (n);
865
866 return (nios2_relax_subtype_size (fragp->fr_subtype)
867 - nios2_relax_subtype_size (subtype));
868 }
869
870 /* If we got here, it's probably an error. */
871 return 0;
872}
873
874
875/* Complete fragp using the data from the relaxation pass. */
876void
877md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, segT segment ATTRIBUTE_UNUSED,
878 fragS *fragp)
879{
880 char *buffer = fragp->fr_literal + fragp->fr_fix;
881 relax_substateT subtype = fragp->fr_subtype;
882 int n = SUBTYPE_ADDIS (subtype);
883 addressT target = fragp->fr_offset;
884 symbolS *symbolp = fragp->fr_symbol;
885 offsetT offset;
886 unsigned int addend_mask, addi_mask;
887 offsetT addend, remainder;
888 int i;
889
890 /* If we didn't or can't relax, this is a regular branch instruction.
891 We just need to generate the fixup for the symbol and offset. */
892 if (n == 0)
893 {
894 fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, fragp->fr_offset, 1,
895 BFD_RELOC_16_PCREL);
896 fragp->fr_fix += 4;
897 return;
898 }
899
900 /* Replace the cbranch at fr_fix with one that has the opposite condition
901 in order to jump around the block of instructions we'll be adding. */
902 if (IS_CBRANCH (subtype))
903 {
904 unsigned int br_opcode;
905 int nbytes;
906
907 /* Account for the nextpc and jmp in the pc-relative case, or the two
908 load instructions and jump in the absolute case. */
909 if (nios2_as_options.relax == relax_section)
910 nbytes = (n + 2) * 4;
911 else
912 nbytes = 12;
913
914 br_opcode = md_chars_to_number (buffer, 4);
915 switch (br_opcode & OP_MASK_OP)
916 {
917 case OP_MATCH_BEQ:
918 br_opcode = (br_opcode & ~OP_MASK_OP) | OP_MATCH_BNE;
919 break;
920 case OP_MATCH_BNE:
921 br_opcode = (br_opcode & ~OP_MASK_OP) | OP_MATCH_BEQ ;
922 break;
923 case OP_MATCH_BGE:
924 br_opcode = (br_opcode & ~OP_MASK_OP) | OP_MATCH_BLT ;
925 break;
926 case OP_MATCH_BGEU:
927 br_opcode = (br_opcode & ~OP_MASK_OP) | OP_MATCH_BLTU ;
928 break;
929 case OP_MATCH_BLT:
930 br_opcode = (br_opcode & ~OP_MASK_OP) | OP_MATCH_BGE ;
931 break;
932 case OP_MATCH_BLTU:
933 br_opcode = (br_opcode & ~OP_MASK_OP) | OP_MATCH_BGEU ;
934 break;
935 default:
936 as_bad_where (fragp->fr_file, fragp->fr_line,
937 _("expecting conditional branch for relaxation\n"));
938 abort ();
939 }
940
941 br_opcode = br_opcode | (nbytes << OP_SH_IMM16);
942 md_number_to_chars (buffer, br_opcode, 4);
943 fragp->fr_fix += 4;
944 buffer += 4;
945 }
946
947 /* Load at for the PC-relative case. */
948 if (nios2_as_options.relax == relax_section)
949 {
950 /* Insert the nextpc instruction. */
951 md_number_to_chars (buffer,
952 OP_MATCH_NEXTPC | (AT_REGNUM << OP_SH_RRD), 4);
953 fragp->fr_fix += 4;
954 buffer += 4;
955
956 /* We need to know whether the offset is positive or negative. */
957 target += S_GET_VALUE (symbolp);
958 offset = target - fragp->fr_address - fragp->fr_fix;
959 if (offset > 0)
960 addend = 32767;
961 else
962 addend = -32768;
963 addend_mask = (((unsigned int)addend) & 0xffff) << OP_SH_IMM16;
964
965 /* Insert n-1 addi instructions. */
966 addi_mask = (OP_MATCH_ADDI
967 | (AT_REGNUM << OP_SH_IRD)
968 | (AT_REGNUM << OP_SH_IRS));
969 for (i = 0; i < n - 1; i ++)
970 {
971 md_number_to_chars (buffer, addi_mask | addend_mask, 4);
972 fragp->fr_fix += 4;
973 buffer += 4;
974 }
975
976 /* Insert the last addi instruction to hold the remainder. */
977 remainder = offset - addend * (n - 1);
978 gas_assert (remainder >= -32768 && remainder <= 32767);
979 addend_mask = (((unsigned int)remainder) & 0xffff) << OP_SH_IMM16;
980 md_number_to_chars (buffer, addi_mask | addend_mask, 4);
981 fragp->fr_fix += 4;
982 buffer += 4;
983 }
984
985 /* Load at for the absolute case. */
986 else
987 {
988 md_number_to_chars (buffer, OP_MATCH_ORHI | 0x00400000, 4);
989 fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, fragp->fr_offset,
990 0, BFD_RELOC_NIOS2_HI16);
991 fragp->fr_fix += 4;
992 buffer += 4;
993 md_number_to_chars (buffer, OP_MATCH_ORI | 0x08400000, 4);
994 fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, fragp->fr_offset,
995 0, BFD_RELOC_NIOS2_LO16);
996 fragp->fr_fix += 4;
997 buffer += 4;
998 }
999
1000 /* Insert the jmp instruction. */
1001 md_number_to_chars (buffer, OP_MATCH_JMP | (AT_REGNUM << OP_SH_RRS), 4);
1002 fragp->fr_fix += 4;
1003 buffer += 4;
1004}
1005
1006\f
1007/** Fixups and overflow checking. */
1008
1009/* Check a fixup for overflow. */
1010static bfd_boolean
1011nios2_check_overflow (valueT fixup, reloc_howto_type *howto)
1012{
1013 /* Apply the rightshift before checking for overflow. */
1014 fixup = ((signed)fixup) >> howto->rightshift;
1015
1016 /* Check for overflow - return TRUE if overflow, FALSE if not. */
1017 switch (howto->complain_on_overflow)
1018 {
1019 case complain_overflow_dont:
1020 break;
1021 case complain_overflow_bitfield:
1022 if ((fixup >> howto->bitsize) != 0
1023 && ((signed) fixup >> howto->bitsize) != -1)
1024 return TRUE;
1025 break;
1026 case complain_overflow_signed:
1027 if ((fixup & 0x80000000) > 0)
1028 {
1029 /* Check for negative overflow. */
1030 if ((signed) fixup < ((signed) 0x80000000 >> howto->bitsize))
1031 return TRUE;
1032 }
1033 else
1034 {
1035 /* Check for positive overflow. */
1036 if (fixup >= ((unsigned) 1 << (howto->bitsize - 1)))
1037 return TRUE;
1038 }
1039 break;
1040 case complain_overflow_unsigned:
1041 if ((fixup >> howto->bitsize) != 0)
1042 return TRUE;
1043 break;
1044 default:
1045 as_bad (_("error checking for overflow - broken assembler"));
1046 break;
1047 }
1048 return FALSE;
1049}
1050
1051/* Emit diagnostic for fixup overflow. */
1052static void
1053nios2_diagnose_overflow (valueT fixup, reloc_howto_type *howto,
1054 fixS *fixP, valueT value)
1055{
1056 if (fixP->fx_r_type == BFD_RELOC_8
1057 || fixP->fx_r_type == BFD_RELOC_16
1058 || fixP->fx_r_type == BFD_RELOC_32)
1059 /* These relocs are against data, not instructions. */
1060 as_bad_where (fixP->fx_file, fixP->fx_line,
1061 _("immediate value 0x%x truncated to 0x%x"),
1062 (unsigned int) fixup,
1063 (unsigned int) (~(~(valueT) 0 << howto->bitsize) & fixup));
1064 else
1065 {
1066 /* What opcode is the instruction? This will determine
1067 whether we check for overflow in immediate values
1068 and what error message we get. */
1069 const struct nios2_opcode *opcode;
1070 enum overflow_type overflow_msg_type;
1071 unsigned int range_min;
1072 unsigned int range_max;
1073 unsigned int address;
1074 gas_assert (fixP->fx_size == 4);
1075 opcode = nios2_find_opcode_hash (value);
1076 gas_assert (opcode);
1077 overflow_msg_type = opcode->overflow_msg;
1078 switch (overflow_msg_type)
1079 {
1080 case call_target_overflow:
1081 range_min
1082 = ((fixP->fx_frag->fr_address + fixP->fx_where) & 0xf0000000);
1083 range_max = range_min + 0x0fffffff;
1084 address = fixup | range_min;
1085
1086 as_bad_where (fixP->fx_file, fixP->fx_line,
1087 _("call target address 0x%08x out of range 0x%08x to 0x%08x"),
1088 address, range_min, range_max);
1089 break;
1090 case branch_target_overflow:
1091 as_bad_where (fixP->fx_file, fixP->fx_line,
1092 _("branch offset %d out of range %d to %d"),
1093 (int)fixup, -32768, 32767);
1094 break;
1095 case address_offset_overflow:
1096 as_bad_where (fixP->fx_file, fixP->fx_line,
1097 _("%s offset %d out of range %d to %d"),
1098 opcode->name, (int)fixup, -32768, 32767);
1099 break;
1100 case signed_immed16_overflow:
1101 as_bad_where (fixP->fx_file, fixP->fx_line,
1102 _("immediate value %d out of range %d to %d"),
1103 (int)fixup, -32768, 32767);
1104 break;
1105 case unsigned_immed16_overflow:
1106 as_bad_where (fixP->fx_file, fixP->fx_line,
1107 _("immediate value %u out of range %u to %u"),
1108 (unsigned int)fixup, 0, 65535);
1109 break;
1110 case unsigned_immed5_overflow:
1111 as_bad_where (fixP->fx_file, fixP->fx_line,
1112 _("immediate value %u out of range %u to %u"),
1113 (unsigned int)fixup, 0, 31);
1114 break;
1115 case custom_opcode_overflow:
1116 as_bad_where (fixP->fx_file, fixP->fx_line,
1117 _("custom instruction opcode %u out of range %u to %u"),
1118 (unsigned int)fixup, 0, 255);
1119 break;
1120 default:
1121 as_bad_where (fixP->fx_file, fixP->fx_line,
1122 _("overflow in immediate argument"));
1123 break;
1124 }
1125 }
1126}
1127
1128/* Apply a fixup to the object file. */
1129void
1130md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1131{
1132 /* Assert that the fixup is one we can handle. */
1133 gas_assert (fixP != NULL && valP != NULL
1134 && (fixP->fx_r_type == BFD_RELOC_8
1135 || fixP->fx_r_type == BFD_RELOC_16
1136 || fixP->fx_r_type == BFD_RELOC_32
1137 || fixP->fx_r_type == BFD_RELOC_64
1138 || fixP->fx_r_type == BFD_RELOC_NIOS2_S16
1139 || fixP->fx_r_type == BFD_RELOC_NIOS2_U16
1140 || fixP->fx_r_type == BFD_RELOC_16_PCREL
1141 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26
1142 || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM5
1143 || fixP->fx_r_type == BFD_RELOC_NIOS2_CACHE_OPX
1144 || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM6
1145 || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM8
1146 || fixP->fx_r_type == BFD_RELOC_NIOS2_HI16
1147 || fixP->fx_r_type == BFD_RELOC_NIOS2_LO16
1148 || fixP->fx_r_type == BFD_RELOC_NIOS2_HIADJ16
1149 || fixP->fx_r_type == BFD_RELOC_NIOS2_GPREL
1150 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1151 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
1152 || fixP->fx_r_type == BFD_RELOC_NIOS2_UJMP
1153 || fixP->fx_r_type == BFD_RELOC_NIOS2_CJMP
1154 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALLR
1155 || fixP->fx_r_type == BFD_RELOC_NIOS2_ALIGN
1156 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT16
1157 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL16
1158 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_LO
1159 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_HA
1160 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_GD16
1161 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LDM16
1162 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LDO16
1163 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_IE16
1164 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LE16
1165 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF
1166 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL
1c2de463
SL
1167 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26_NOAT
1168 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_LO
1169 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_HA
1170 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_LO
1171 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_HA
36591ba1
SL
1172 /* Add other relocs here as we generate them. */
1173 ));
1174
1175 if (fixP->fx_r_type == BFD_RELOC_64)
1176 {
1177 /* We may reach here due to .8byte directives, but we never output
1178 BFD_RELOC_64; it must be resolved. */
1179 if (fixP->fx_addsy != NULL)
1180 as_bad_where (fixP->fx_file, fixP->fx_line,
1181 _("cannot create 64-bit relocation"));
1182 else
1183 {
1184 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1185 *valP, 8);
1186 fixP->fx_done = 1;
1187 }
1188 return;
1189 }
1190
1191 /* The value passed in valP can be the value of a fully
1192 resolved expression, or it can be the value of a partially
1193 resolved expression. In the former case, both fixP->fx_addsy
1194 and fixP->fx_subsy are NULL, and fixP->fx_offset == *valP, and
1195 we can fix up the instruction that fixP relates to.
1196 In the latter case, one or both of fixP->fx_addsy and
1197 fixP->fx_subsy are not NULL, and fixP->fx_offset may or may not
1198 equal *valP. We don't need to check for fixP->fx_subsy being null
1199 because the generic part of the assembler generates an error if
1200 it is not an absolute symbol. */
1201 if (fixP->fx_addsy != NULL)
1202 /* Partially resolved expression. */
1203 {
1204 fixP->fx_addnumber = fixP->fx_offset;
1205 fixP->fx_done = 0;
1206
1207 switch (fixP->fx_r_type)
1208 {
1209 case BFD_RELOC_NIOS2_TLS_GD16:
1210 case BFD_RELOC_NIOS2_TLS_LDM16:
1211 case BFD_RELOC_NIOS2_TLS_LDO16:
1212 case BFD_RELOC_NIOS2_TLS_IE16:
1213 case BFD_RELOC_NIOS2_TLS_LE16:
1214 case BFD_RELOC_NIOS2_TLS_DTPMOD:
1215 case BFD_RELOC_NIOS2_TLS_DTPREL:
1216 case BFD_RELOC_NIOS2_TLS_TPREL:
1217 S_SET_THREAD_LOCAL (fixP->fx_addsy);
1218 break;
1219 default:
1220 break;
1221 }
1222 }
1223 else
1224 /* Fully resolved fixup. */
1225 {
1226 reloc_howto_type *howto
1227 = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
1228
1229 if (howto == NULL)
1230 as_bad_where (fixP->fx_file, fixP->fx_line,
1231 _("relocation is not supported"));
1232 else
1233 {
1234 valueT fixup = *valP;
1235 valueT value;
1236 char *buf;
1237
1238 /* If this is a pc-relative relocation, we need to
1239 subtract the current offset within the object file
1240 FIXME : for some reason fixP->fx_pcrel isn't 1 when it should be
1241 so I'm using the howto structure instead to determine this. */
1242 if (howto->pc_relative == 1)
1243 fixup = fixup - (fixP->fx_frag->fr_address + fixP->fx_where + 4);
1244
1245 /* Get the instruction or data to be fixed up. */
1246 buf = fixP->fx_frag->fr_literal + fixP->fx_where;
1247 value = md_chars_to_number (buf, fixP->fx_size);
1248
1249 /* Check for overflow, emitting a diagnostic if necessary. */
1250 if (nios2_check_overflow (fixup, howto))
1251 nios2_diagnose_overflow (fixup, howto, fixP, value);
1252
1253 /* Apply the right shift. */
1254 fixup = ((signed)fixup) >> howto->rightshift;
1255
1256 /* Truncate the fixup to right size. */
1257 switch (fixP->fx_r_type)
1258 {
1259 case BFD_RELOC_NIOS2_HI16:
1260 fixup = (fixup >> 16) & 0xFFFF;
1261 break;
1262 case BFD_RELOC_NIOS2_LO16:
1263 fixup = fixup & 0xFFFF;
1264 break;
1265 case BFD_RELOC_NIOS2_HIADJ16:
5d5755a7
SL
1266 fixup = ((((fixup >> 16) & 0xFFFF) + ((fixup >> 15) & 0x01))
1267 & 0xFFFF);
36591ba1
SL
1268 break;
1269 default:
1270 {
1271 int n = sizeof (fixup) * 8 - howto->bitsize;
1272 fixup = (fixup << n) >> n;
1273 break;
1274 }
1275 }
1276
1277 /* Fix up the instruction. */
1278 value = (value & ~howto->dst_mask) | (fixup << howto->bitpos);
1279 md_number_to_chars (buf, value, fixP->fx_size);
1280 }
1281
1282 fixP->fx_done = 1;
1283 }
1284
1285 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
1286 {
1287 fixP->fx_done = 0;
1288 if (fixP->fx_addsy
1289 && !S_IS_DEFINED (fixP->fx_addsy) && !S_IS_WEAK (fixP->fx_addsy))
1290 S_SET_WEAK (fixP->fx_addsy);
1291 }
1292 else if (fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1293 fixP->fx_done = 0;
1294}
1295
1296
1297\f
1298/** Instruction parsing support. */
1299
1300/* Special relocation directive strings. */
1301
1302struct nios2_special_relocS
1303{
1304 const char *string;
1305 bfd_reloc_code_real_type reloc_type;
1306};
1307
1c2de463
SL
1308/* This table is sorted so that prefix strings are listed after the longer
1309 strings that include them -- e.g., %got after %got_hiadj, etc. */
1310
36591ba1
SL
1311struct nios2_special_relocS nios2_special_reloc[] = {
1312 {"%hiadj", BFD_RELOC_NIOS2_HIADJ16},
1313 {"%hi", BFD_RELOC_NIOS2_HI16},
1314 {"%lo", BFD_RELOC_NIOS2_LO16},
1315 {"%gprel", BFD_RELOC_NIOS2_GPREL},
1c2de463
SL
1316 {"%call_lo", BFD_RELOC_NIOS2_CALL_LO},
1317 {"%call_hiadj", BFD_RELOC_NIOS2_CALL_HA},
36591ba1
SL
1318 {"%call", BFD_RELOC_NIOS2_CALL16},
1319 {"%gotoff_lo", BFD_RELOC_NIOS2_GOTOFF_LO},
1320 {"%gotoff_hiadj", BFD_RELOC_NIOS2_GOTOFF_HA},
1c2de463
SL
1321 {"%gotoff", BFD_RELOC_NIOS2_GOTOFF},
1322 {"%got_hiadj", BFD_RELOC_NIOS2_GOT_HA},
1323 {"%got_lo", BFD_RELOC_NIOS2_GOT_LO},
1324 {"%got", BFD_RELOC_NIOS2_GOT16},
36591ba1
SL
1325 {"%tls_gd", BFD_RELOC_NIOS2_TLS_GD16},
1326 {"%tls_ldm", BFD_RELOC_NIOS2_TLS_LDM16},
1327 {"%tls_ldo", BFD_RELOC_NIOS2_TLS_LDO16},
1328 {"%tls_ie", BFD_RELOC_NIOS2_TLS_IE16},
1329 {"%tls_le", BFD_RELOC_NIOS2_TLS_LE16},
36591ba1
SL
1330};
1331
1332#define NIOS2_NUM_SPECIAL_RELOCS \
1333 (sizeof(nios2_special_reloc)/sizeof(nios2_special_reloc[0]))
1334const int nios2_num_special_relocs = NIOS2_NUM_SPECIAL_RELOCS;
1335
1336/* Creates a new nios2_insn_relocS and returns a pointer to it. */
1337static nios2_insn_relocS *
1338nios2_insn_reloc_new (bfd_reloc_code_real_type reloc_type, unsigned int pcrel)
1339{
1340 nios2_insn_relocS *retval;
1341 retval = (nios2_insn_relocS *) malloc (sizeof (nios2_insn_relocS));
1342 if (retval == NULL)
1343 {
1344 as_bad (_("can't create relocation"));
1345 abort ();
1346 }
1347
1348 /* Fill out the fields with default values. */
1349 retval->reloc_next = NULL;
1350 retval->reloc_type = reloc_type;
1351 retval->reloc_pcrel = pcrel;
1352 return retval;
1353}
1354
1355/* Frees up memory previously allocated by nios2_insn_reloc_new(). */
1356/* FIXME: this is never called; memory leak? */
1357#if 0
1358static void
1359nios2_insn_reloc_destroy (nios2_insn_relocS *reloc)
1360{
1361 gas_assert (reloc != NULL);
1362 free (reloc);
1363}
1364#endif
1365
1366/* The various nios2_assemble_* functions call this
1367 function to generate an expression from a string representing an expression.
1368 It then tries to evaluate the expression, and if it can, returns its value.
1369 If not, it creates a new nios2_insn_relocS and stores the expression and
1370 reloc_type for future use. */
1371static unsigned long
1372nios2_assemble_expression (const char *exprstr,
1373 nios2_insn_infoS *insn,
1374 nios2_insn_relocS *prev_reloc,
1375 bfd_reloc_code_real_type reloc_type,
1376 unsigned int pcrel)
1377{
1378 nios2_insn_relocS *reloc;
1379 char *saved_line_ptr;
1380 unsigned short value;
1381 int i;
1382
1383 gas_assert (exprstr != NULL);
1384 gas_assert (insn != NULL);
1385
1386 /* Check for relocation operators.
1387 Change the relocation type and advance the ptr to the start of
1388 the expression proper. */
1389 for (i = 0; i < nios2_num_special_relocs; i++)
1390 if (strstr (exprstr, nios2_special_reloc[i].string) != NULL)
1391 {
1392 reloc_type = nios2_special_reloc[i].reloc_type;
1393 exprstr += strlen (nios2_special_reloc[i].string) + 1;
1394
1395 /* %lo and %hiadj have different meanings for PC-relative
1396 expressions. */
1397 if (pcrel)
1398 {
1399 if (reloc_type == BFD_RELOC_NIOS2_LO16)
1400 reloc_type = BFD_RELOC_NIOS2_PCREL_LO;
1401 if (reloc_type == BFD_RELOC_NIOS2_HIADJ16)
1402 reloc_type = BFD_RELOC_NIOS2_PCREL_HA;
1403 }
1404
1405 break;
1406 }
1407
1408 /* We potentially have a relocation. */
1409 reloc = nios2_insn_reloc_new (reloc_type, pcrel);
1410 if (prev_reloc != NULL)
1411 prev_reloc->reloc_next = reloc;
1412 else
1413 insn->insn_reloc = reloc;
1414
1415 /* Parse the expression string. */
1416 saved_line_ptr = input_line_pointer;
1417 input_line_pointer = (char *) exprstr;
1418 expression (&reloc->reloc_expression);
1419 input_line_pointer = saved_line_ptr;
1420
1421 /* This is redundant as the fixup will put this into
1422 the instruction, but it is included here so that
1423 self-test mode (-r) works. */
1424 value = 0;
1425 if (nios2_mode == NIOS2_MODE_TEST
1426 && reloc->reloc_expression.X_op == O_constant)
1427 value = reloc->reloc_expression.X_add_number;
1428
1429 return (unsigned long) value;
1430}
1431
1432/* Argument assemble functions.
1433 All take an instruction argument string, and a pointer
1434 to an instruction opcode. Upon return the insn_opcode
1435 has the relevant fields filled in to represent the arg
1436 string. The return value is NULL if successful, or
1437 an error message if an error was detected.
1438
1439 The naming conventions for these functions match the args template
1440 in the nios2_opcode structure, as documented in include/opcode/nios2.h.
1441 For example, nios2_assemble_args_dst is used for instructions with
1442 "d,s,t" args.
1443 See nios2_arg_info_structs below for the exact correspondence. */
1444
1445static void
1446nios2_assemble_args_dst (nios2_insn_infoS *insn_info)
1447{
1448 if (insn_info->insn_tokens[1] != NULL
1449 && insn_info->insn_tokens[2] != NULL
1450 && insn_info->insn_tokens[3] != NULL)
1451 {
1452 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[1]);
1453 struct nios2_reg *src1 = nios2_reg_lookup (insn_info->insn_tokens[2]);
1454 struct nios2_reg *src2 = nios2_reg_lookup (insn_info->insn_tokens[3]);
1455
1456 if (dst == NULL)
1457 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1458 else
1459 SET_INSN_FIELD (RRD, insn_info->insn_code, dst->index);
1460
1461 if (src1 == NULL)
1462 as_bad (_("unknown register %s"), insn_info->insn_tokens[2]);
1463 else
1464 SET_INSN_FIELD (RRS, insn_info->insn_code, src1->index);
1465
1466 if (src2 == NULL)
1467 as_bad (_("unknown register %s"), insn_info->insn_tokens[3]);
1468 else
1469 SET_INSN_FIELD (RRT, insn_info->insn_code, src2->index);
1470
1471 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[4]);
1472 }
1473}
1474
1475static void
1476nios2_assemble_args_tsi (nios2_insn_infoS *insn_info)
1477{
1478 if (insn_info->insn_tokens[1] != NULL &&
1479 insn_info->insn_tokens[2] != NULL && insn_info->insn_tokens[3] != NULL)
1480 {
1481 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[1]);
1482 struct nios2_reg *src1 = nios2_reg_lookup (insn_info->insn_tokens[2]);
1483 unsigned int src2
1484 = nios2_assemble_expression (insn_info->insn_tokens[3], insn_info,
1485 insn_info->insn_reloc, BFD_RELOC_NIOS2_S16,
1486 0);
1487
1488 if (dst == NULL)
1489 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1490 else
1491 SET_INSN_FIELD (IRT, insn_info->insn_code, dst->index);
1492
1493 if (src1 == NULL)
1494 as_bad (_("unknown register %s"), insn_info->insn_tokens[2]);
1495 else
1496 SET_INSN_FIELD (IRS, insn_info->insn_code, src1->index);
1497
1498 SET_INSN_FIELD (IMM16, insn_info->insn_code, src2);
1499 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[4]);
1500 SET_INSN_FIELD (IMM16, insn_info->insn_code, 0);
1501 }
1502}
1503
1504static void
1505nios2_assemble_args_tsu (nios2_insn_infoS *insn_info)
1506{
1507 if (insn_info->insn_tokens[1] != NULL
1508 && insn_info->insn_tokens[2] != NULL
1509 && insn_info->insn_tokens[3] != NULL)
1510 {
1511 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[1]);
1512 struct nios2_reg *src1 = nios2_reg_lookup (insn_info->insn_tokens[2]);
1513 unsigned int src2
1514 = nios2_assemble_expression (insn_info->insn_tokens[3], insn_info,
1515 insn_info->insn_reloc, BFD_RELOC_NIOS2_U16,
1516 0);
1517
1518 if (dst == NULL)
1519 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1520 else
1521 SET_INSN_FIELD (IRT, insn_info->insn_code, dst->index);
1522
1523 if (src1 == NULL)
1524 as_bad (_("unknown register %s"), insn_info->insn_tokens[2]);
1525 else
1526 SET_INSN_FIELD (IRS, insn_info->insn_code, src1->index);
1527
1528 SET_INSN_FIELD (IMM16, insn_info->insn_code, src2);
1529 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[4]);
1530 SET_INSN_FIELD (IMM16, insn_info->insn_code, 0);
1531 }
1532}
1533
1534static void
1535nios2_assemble_args_sto (nios2_insn_infoS *insn_info)
1536{
1537 if (insn_info->insn_tokens[1] != NULL
1538 && insn_info->insn_tokens[2] != NULL
1539 && insn_info->insn_tokens[3] != NULL)
1540 {
1541 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[1]);
1542 struct nios2_reg *src1 = nios2_reg_lookup (insn_info->insn_tokens[2]);
1543 unsigned int src2
1544 = nios2_assemble_expression (insn_info->insn_tokens[3], insn_info,
1545 insn_info->insn_reloc, BFD_RELOC_16_PCREL,
1546 1);
1547
1548 if (dst == NULL)
1549 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1550 else
1551 SET_INSN_FIELD (IRS, insn_info->insn_code, dst->index);
1552
1553 if (src1 == NULL)
1554 as_bad (_("unknown register %s"), insn_info->insn_tokens[2]);
1555 else
1556 SET_INSN_FIELD (IRT, insn_info->insn_code, src1->index);
1557
1558 SET_INSN_FIELD (IMM16, insn_info->insn_code, src2);
1559 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[4]);
1560 SET_INSN_FIELD (IMM16, insn_info->insn_code, 0);
1561 }
1562}
1563
1564static void
1565nios2_assemble_args_o (nios2_insn_infoS *insn_info)
1566{
1567 if (insn_info->insn_tokens[1] != NULL)
1568 {
1569 unsigned long immed
1570 = nios2_assemble_expression (insn_info->insn_tokens[1], insn_info,
1571 insn_info->insn_reloc, BFD_RELOC_16_PCREL,
1572 1);
1573 SET_INSN_FIELD (IMM16, insn_info->insn_code, immed);
1574 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[2]);
1575 SET_INSN_FIELD (IMM16, insn_info->insn_code, 0);
1576 }
1577}
1578
1579static void
1580nios2_assemble_args_is (nios2_insn_infoS *insn_info)
1581{
1582 if (insn_info->insn_tokens[1] != NULL && insn_info->insn_tokens[2] != NULL)
1583 {
1584 struct nios2_reg *addr_src = nios2_reg_lookup (insn_info->insn_tokens[2]);
1585 unsigned long immed
1586 = nios2_assemble_expression (insn_info->insn_tokens[1], insn_info,
1587 insn_info->insn_reloc, BFD_RELOC_NIOS2_S16,
1588 0);
1589
1590 SET_INSN_FIELD (IMM16, insn_info->insn_code, immed);
1591
1592 if (addr_src == NULL)
1593 as_bad (_("unknown base register %s"), insn_info->insn_tokens[2]);
1594 else
1595 SET_INSN_FIELD (RRS, insn_info->insn_code, addr_src->index);
1596
1597 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[3]);
1598 SET_INSN_FIELD (IMM16, insn_info->insn_code, 0);
1599 }
1600}
1601
1602static void
1603nios2_assemble_args_m (nios2_insn_infoS *insn_info)
1604{
1605 if (insn_info->insn_tokens[1] != NULL)
1606 {
1607 unsigned long immed
1608 = nios2_assemble_expression (insn_info->insn_tokens[1], insn_info,
1609 insn_info->insn_reloc,
78058a5e
SL
1610 (nios2_as_options.noat
1611 ? BFD_RELOC_NIOS2_CALL26_NOAT
1612 : BFD_RELOC_NIOS2_CALL26),
1613 0);
36591ba1
SL
1614
1615 SET_INSN_FIELD (IMM26, insn_info->insn_code, immed);
1616 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[2]);
1617 SET_INSN_FIELD (IMM26, insn_info->insn_code, 0);
1618 }
1619}
1620
1621static void
1622nios2_assemble_args_s (nios2_insn_infoS *insn_info)
1623{
1624 if (insn_info->insn_tokens[1] != NULL)
1625 {
1626 struct nios2_reg *src = nios2_reg_lookup (insn_info->insn_tokens[1]);
1627 if (src == NULL)
1628 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1629 else
1630 SET_INSN_FIELD (RRS, insn_info->insn_code, src->index);
1631
1632 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[2]);
1633 }
1634}
1635
1636static void
1637nios2_assemble_args_tis (nios2_insn_infoS *insn_info)
1638{
1639 if (insn_info->insn_tokens[1] != NULL
1640 && insn_info->insn_tokens[2] != NULL
1641 && insn_info->insn_tokens[3] != NULL)
1642 {
1643 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[1]);
1644 struct nios2_reg *addr_src = nios2_reg_lookup (insn_info->insn_tokens[3]);
1645 unsigned long immed
1646 = nios2_assemble_expression (insn_info->insn_tokens[2], insn_info,
1647 insn_info->insn_reloc, BFD_RELOC_NIOS2_S16,
1648 0);
1649
1650 if (addr_src == NULL)
1651 as_bad (_("unknown register %s"), insn_info->insn_tokens[3]);
1652 else
1653 SET_INSN_FIELD (RRS, insn_info->insn_code, addr_src->index);
1654
1655 if (dst == NULL)
1656 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1657 else
1658 SET_INSN_FIELD (RRT, insn_info->insn_code, dst->index);
1659
1660 SET_INSN_FIELD (IMM16, insn_info->insn_code, immed);
1661 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[4]);
1662 SET_INSN_FIELD (IMM16, insn_info->insn_code, 0);
1663 }
1664}
1665
1666static void
1667nios2_assemble_args_dc (nios2_insn_infoS *insn_info)
1668{
1669 if (insn_info->insn_tokens[1] != NULL && insn_info->insn_tokens[2] != NULL)
1670 {
1671 struct nios2_reg *ctl = nios2_reg_lookup (insn_info->insn_tokens[2]);
1672 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[1]);
1673
1674 if (ctl == NULL)
1675 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1676 else
1677 SET_INSN_FIELD (RCTL, insn_info->insn_code, ctl->index);
1678
1679 if (dst == NULL)
1680 as_bad (_("unknown register %s"), insn_info->insn_tokens[2]);
1681 else
1682 SET_INSN_FIELD (RRD, insn_info->insn_code, dst->index);
1683
1684 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[3]);
1685 }
1686}
1687
1688static void
1689nios2_assemble_args_cs (nios2_insn_infoS *insn_info)
1690{
1691 if (insn_info->insn_tokens[1] != NULL && insn_info->insn_tokens[2] != NULL)
1692 {
1693 struct nios2_reg *ctl = nios2_reg_lookup (insn_info->insn_tokens[1]);
1694 struct nios2_reg *src = nios2_reg_lookup (insn_info->insn_tokens[2]);
1695
1696 if (ctl == NULL)
1697 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1698 else if (ctl->index == 4)
1699 as_bad (_("ipending control register (ctl4) is read-only\n"));
1700 else
1701 SET_INSN_FIELD (RCTL, insn_info->insn_code, ctl->index);
1702
1703 if (src == NULL)
1704 as_bad (_("unknown register %s"), insn_info->insn_tokens[2]);
1705 else
1706 SET_INSN_FIELD (RRS, insn_info->insn_code, src->index);
1707
1708 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[3]);
1709 }
1710}
1711
dad60f8e
SL
1712static void
1713nios2_assemble_args_ds (nios2_insn_infoS * insn_info)
1714{
1715 if (insn_info->insn_tokens[1] != NULL && insn_info->insn_tokens[2] != NULL)
1716 {
1717 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[1]);
1718 struct nios2_reg *src = nios2_reg_lookup (insn_info->insn_tokens[2]);
1719
1720 if (dst == NULL)
1721 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1722 else
1723 SET_INSN_FIELD (RRD, insn_info->insn_code, dst->index);
1724
1725 if (src == NULL)
1726 as_bad (_("unknown register %s"), insn_info->insn_tokens[2]);
1727 else
1728 SET_INSN_FIELD (RRS, insn_info->insn_code, src->index);
1729
1730 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[3]);
1731 }
1732}
1733
36591ba1
SL
1734static void
1735nios2_assemble_args_ldst (nios2_insn_infoS *insn_info)
1736{
1737 if (insn_info->insn_tokens[1] != NULL
1738 && insn_info->insn_tokens[2] != NULL
1739 && insn_info->insn_tokens[3] != NULL
1740 && insn_info->insn_tokens[4] != NULL)
1741 {
1742 unsigned long custom_n
1743 = nios2_assemble_expression (insn_info->insn_tokens[1], insn_info,
1744 insn_info->insn_reloc,
1745 BFD_RELOC_NIOS2_IMM8, 0);
1746
1747 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[2]);
1748 struct nios2_reg *src1 = nios2_reg_lookup (insn_info->insn_tokens[3]);
1749 struct nios2_reg *src2 = nios2_reg_lookup (insn_info->insn_tokens[4]);
1750
1751 SET_INSN_FIELD (CUSTOM_N, insn_info->insn_code, custom_n);
1752
1753 if (dst == NULL)
1754 as_bad (_("unknown register %s"), insn_info->insn_tokens[2]);
1755 else
1756 SET_INSN_FIELD (RRD, insn_info->insn_code, dst->index);
1757
1758 if (src1 == NULL)
1759 as_bad (_("unknown register %s"), insn_info->insn_tokens[3]);
1760 else
1761 SET_INSN_FIELD (RRS, insn_info->insn_code, src1->index);
1762
1763 if (src2 == NULL)
1764 as_bad (_("unknown register %s"), insn_info->insn_tokens[4]);
1765 else
1766 SET_INSN_FIELD (RRT, insn_info->insn_code, src2->index);
1767
1768 /* Set or clear the bits to indicate whether coprocessor registers are
1769 used. */
1770 if (nios2_coproc_reg (insn_info->insn_tokens[2]))
1771 SET_INSN_FIELD (CUSTOM_C, insn_info->insn_code, 0);
1772 else
1773 SET_INSN_FIELD (CUSTOM_C, insn_info->insn_code, 1);
1774
1775 if (nios2_coproc_reg (insn_info->insn_tokens[3]))
1776 SET_INSN_FIELD (CUSTOM_A, insn_info->insn_code, 0);
1777 else
1778 SET_INSN_FIELD (CUSTOM_A, insn_info->insn_code, 1);
1779
1780 if (nios2_coproc_reg (insn_info->insn_tokens[4]))
1781 SET_INSN_FIELD (CUSTOM_B, insn_info->insn_code, 0);
1782 else
1783 SET_INSN_FIELD (CUSTOM_B, insn_info->insn_code, 1);
1784
1785 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[5]);
1786 }
1787}
1788
1789static void
1790nios2_assemble_args_none (nios2_insn_infoS *insn_info ATTRIBUTE_UNUSED)
1791{
1792 /* Nothing to do. */
1793}
1794
1795static void
1796nios2_assemble_args_dsj (nios2_insn_infoS *insn_info)
1797{
1798 if (insn_info->insn_tokens[1] != NULL
1799 && insn_info->insn_tokens[2] != NULL
1800 && insn_info->insn_tokens[3] != NULL)
1801 {
1802 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[1]);
1803 struct nios2_reg *src1 = nios2_reg_lookup (insn_info->insn_tokens[2]);
1804
1805 /* A 5-bit constant expression. */
1806 unsigned int src2 =
1807 nios2_assemble_expression (insn_info->insn_tokens[3], insn_info,
1808 insn_info->insn_reloc,
1809 BFD_RELOC_NIOS2_IMM5, 0);
1810
1811 if (dst == NULL)
1812 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1813 else
1814 SET_INSN_FIELD (RRD, insn_info->insn_code, dst->index);
1815
1816 if (src1 == NULL)
1817 as_bad (_("unknown register %s"), insn_info->insn_tokens[2]);
1818 else
1819 SET_INSN_FIELD (RRS, insn_info->insn_code, src1->index);
1820
1821 SET_INSN_FIELD (IMM5, insn_info->insn_code, src2);
1822 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[4]);
1823 SET_INSN_FIELD (IMM5, insn_info->insn_code, 0);
1824 }
1825}
1826
1827static void
1828nios2_assemble_args_d (nios2_insn_infoS *insn_info)
1829{
1830 if (insn_info->insn_tokens[1] != NULL)
1831 {
1832 struct nios2_reg *dst = nios2_reg_lookup (insn_info->insn_tokens[1]);
1833
1834 if (dst == NULL)
1835 as_bad (_("unknown register %s"), insn_info->insn_tokens[1]);
1836 else
1837 SET_INSN_FIELD (RRD, insn_info->insn_code, dst->index);
1838
1839 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[2]);
1840 }
1841}
1842
1843static void
1844nios2_assemble_args_b (nios2_insn_infoS *insn_info)
1845{
1846 unsigned int imm5 = 0;
1847
1848 if (insn_info->insn_tokens[1] != NULL)
1849 {
1850 /* A 5-bit constant expression. */
1851 imm5 = nios2_assemble_expression (insn_info->insn_tokens[1],
1852 insn_info, insn_info->insn_reloc,
1853 BFD_RELOC_NIOS2_IMM5, 0);
1854 SET_INSN_FIELD (TRAP_IMM5, insn_info->insn_code, imm5);
1855 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[2]);
1856 }
1857
1858 SET_INSN_FIELD (TRAP_IMM5, insn_info->insn_code, imm5);
1859
1860 nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[2]);
1861}
1862
1863/* This table associates pointers to functions that parse the arguments to an
1864 instruction and fill in the relevant fields of the instruction. */
1865const nios2_arg_infoS nios2_arg_info_structs[] = {
1866 /* args, assemble_args_func */
1867 {"d,s,t", nios2_assemble_args_dst},
1868 {"d,s,t,E", nios2_assemble_args_dst},
1869 {"t,s,i", nios2_assemble_args_tsi},
1870 {"t,s,i,E", nios2_assemble_args_tsi},
1871 {"t,s,u", nios2_assemble_args_tsu},
1872 {"t,s,u,E", nios2_assemble_args_tsu},
1873 {"s,t,o", nios2_assemble_args_sto},
1874 {"s,t,o,E", nios2_assemble_args_sto},
1875 {"o", nios2_assemble_args_o},
1876 {"o,E", nios2_assemble_args_o},
1877 {"s", nios2_assemble_args_s},
1878 {"s,E", nios2_assemble_args_s},
1879 {"", nios2_assemble_args_none},
1880 {"E", nios2_assemble_args_none},
1881 {"i(s)", nios2_assemble_args_is},
1882 {"i(s)E", nios2_assemble_args_is},
1883 {"m", nios2_assemble_args_m},
1884 {"m,E", nios2_assemble_args_m},
1885 {"t,i(s)", nios2_assemble_args_tis},
1886 {"t,i(s)E", nios2_assemble_args_tis},
1887 {"d,c", nios2_assemble_args_dc},
1888 {"d,c,E", nios2_assemble_args_dc},
1889 {"c,s", nios2_assemble_args_cs},
1890 {"c,s,E", nios2_assemble_args_cs},
dad60f8e
SL
1891 {"d,s", nios2_assemble_args_ds},
1892 {"d,s,E", nios2_assemble_args_ds},
36591ba1
SL
1893 {"l,d,s,t", nios2_assemble_args_ldst},
1894 {"l,d,s,t,E", nios2_assemble_args_ldst},
1895 {"d,s,j", nios2_assemble_args_dsj},
1896 {"d,s,j,E", nios2_assemble_args_dsj},
1897 {"d", nios2_assemble_args_d},
1898 {"d,E", nios2_assemble_args_d},
1899 {"b", nios2_assemble_args_b},
1900 {"b,E", nios2_assemble_args_b}
1901};
1902
1903#define NIOS2_NUM_ARGS \
1904 ((sizeof(nios2_arg_info_structs)/sizeof(nios2_arg_info_structs[0])))
1905const int nios2_num_arg_info_structs = NIOS2_NUM_ARGS;
1906
1907/* The function consume_arg takes a pointer into a string
1908 of instruction tokens (args) and a pointer into a string
1909 representing the expected sequence of tokens and separators.
1910 It checks whether the first argument in argstr is of the
1911 expected type, throwing an error if it is not, and returns
1912 the pointer argstr. */
1913static char *
1914nios2_consume_arg (nios2_insn_infoS *insn, char *argstr, const char *parsestr)
1915{
1916 char *temp;
1917 int regno = -1;
1918
1919 switch (*parsestr)
1920 {
1921 case 'c':
1922 if (!nios2_control_register_arg_p (argstr))
1923 as_bad (_("expecting control register"));
1924 break;
1925 case 'd':
1926 case 's':
1927 case 't':
1928
1929 /* We check to make sure we don't have a control register. */
1930 if (nios2_control_register_arg_p (argstr))
1931 as_bad (_("illegal use of control register"));
1932
1933 /* And whether coprocessor registers are valid here. */
1934 if (nios2_coproc_reg (argstr)
1935 && insn->insn_nios2_opcode->match != OP_MATCH_CUSTOM)
1936 as_bad (_("illegal use of coprocessor register\n"));
1937
1938 /* Extract a register number if the register is of the
1939 form r[0-9]+, if it is a normal register, set
1940 regno to its number (0-31), else set regno to -1. */
1941 if (argstr[0] == 'r' && ISDIGIT (argstr[1]))
1942 {
1943 char *p = argstr;
1944
1945 ++p;
1946 regno = 0;
1947 do
1948 {
1949 regno *= 10;
1950 regno += *p - '0';
1951 ++p;
1952 }
1953 while (ISDIGIT (*p));
1954 }
1955 else
1956 regno = -1;
1957
1958 /* And whether we are using at. */
1959 if (!nios2_as_options.noat
1960 && (regno == 1 || strprefix (argstr, "at")))
1961 as_warn (_("Register at (r1) can sometimes be corrupted by assembler "
1962 "optimizations.\n"
1963 "Use .set noat to turn off those optimizations (and this "
1964 "warning)."));
1965
1966 /* And whether we are using oci registers. */
1967 if (!nios2_as_options.nobreak
1968 && (regno == 25 || strprefix (argstr, "bt")))
ae335a4e
SL
1969 as_warn (_("The debugger will corrupt bt (r25).\n"
1970 "If you don't need to debug this "
1971 "code use .set nobreak to turn off this warning."));
36591ba1
SL
1972
1973 if (!nios2_as_options.nobreak
ae335a4e
SL
1974 && (regno == 30
1975 || strprefix (argstr, "ba")
1976 || strprefix (argstr, "sstatus")))
1977 as_warn (_("The debugger will corrupt sstatus/ba (r30).\n"
1978 "If you don't need to debug this "
1979 "code use .set nobreak to turn off this warning."));
36591ba1
SL
1980 break;
1981 case 'i':
1982 case 'u':
1983 if (*argstr == '%')
1984 {
1985 if (nios2_special_relocation_p (argstr))
1986 {
1987 /* We zap the parentheses because we don't want them confused
1988 with separators. */
1989 temp = strchr (argstr, '(');
1990 if (temp != NULL)
1991 *temp = ' ';
1992 temp = strchr (argstr, ')');
1993 if (temp != NULL)
1994 *temp = ' ';
1995 }
1996 else
1997 as_bad (_("badly formed expression near %s"), argstr);
1998 }
1999 break;
2000 case 'm':
2001 case 'j':
36591ba1
SL
2002 case 'l':
2003 case 'b':
2004 /* We can't have %hi, %lo or %hiadj here. */
2005 if (*argstr == '%')
2006 as_bad (_("badly formed expression near %s"), argstr);
2007 break;
531a94fd
SL
2008 case 'o':
2009 break;
36591ba1 2010 default:
531a94fd 2011 BAD_CASE (*parsestr);
36591ba1
SL
2012 break;
2013 }
2014
2015 return argstr;
2016}
2017
2018/* The function consume_separator takes a pointer into a string
2019 of instruction tokens (args) and a pointer into a string representing
2020 the expected sequence of tokens and separators. It finds the first
2021 instance of the character pointed to by separator in argstr, and
2022 returns a pointer to the next element of argstr, which is the
2023 following token in the sequence. */
2024static char *
2025nios2_consume_separator (char *argstr, const char *separator)
2026{
2027 char *p;
2028
2029 /* If we have a opcode reg, expr(reg) type instruction, and
2030 * we are separating the expr from the (reg), we find the last
2031 * (, just in case the expression has parentheses. */
2032
2033 if (*separator == '(')
2034 p = strrchr (argstr, *separator);
2035 else
2036 p = strchr (argstr, *separator);
2037
2038 if (p != NULL)
2039 *p++ = 0;
2040 else
2041 as_bad (_("expecting %c near %s"), *separator, argstr);
2042 return p;
2043}
2044
2045
2046/* The principal argument parsing function which takes a string argstr
2047 representing the instruction arguments for insn, and extracts the argument
2048 tokens matching parsestr into parsed_args. */
2049static void
2050nios2_parse_args (nios2_insn_infoS *insn, char *argstr,
2051 const char *parsestr, char **parsed_args)
2052{
2053 char *p;
2054 char *end = NULL;
2055 int i;
2056 p = argstr;
2057 i = 0;
2058 bfd_boolean terminate = FALSE;
2059
2060 /* This rest of this function is it too fragile and it mostly works,
2061 therefore special case this one. */
2062 if (*parsestr == 0 && argstr != 0)
2063 {
2064 as_bad (_("too many arguments"));
2065 parsed_args[0] = NULL;
2066 return;
2067 }
2068
2069 while (p != NULL && !terminate && i < NIOS2_MAX_INSN_TOKENS)
2070 {
2071 parsed_args[i] = nios2_consume_arg (insn, p, parsestr);
2072 ++parsestr;
2073 if (*parsestr != '\0')
2074 {
2075 p = nios2_consume_separator (p, parsestr);
2076 ++parsestr;
2077 }
2078 else
2079 {
2080 /* Check that the argument string has no trailing arguments. */
2081 /* If we've got a %lo etc relocation, we've zapped the parens with
2082 spaces. */
2083 if (nios2_special_relocation_p (p))
2084 end = strpbrk (p, ",");
2085 else
2086 end = strpbrk (p, " ,");
2087
2088 if (end != NULL)
2089 as_bad (_("too many arguments"));
2090 }
2091
2092 if (*parsestr == '\0' || (p != NULL && *p == '\0'))
2093 terminate = TRUE;
2094 ++i;
2095 }
2096
2097 parsed_args[i] = NULL;
2098
9daf7bab
SL
2099 /* The argument to break and trap instructions is optional; complain
2100 for other cases of missing arguments. */
2101 if (*parsestr != '\0'
2102 && insn->insn_nios2_opcode->match != OP_MATCH_BREAK
2103 && insn->insn_nios2_opcode->match != OP_MATCH_TRAP)
36591ba1
SL
2104 as_bad (_("missing argument"));
2105}
2106
2107
2108\f
2109/** Support for pseudo-op parsing. These are macro-like opcodes that
2110 expand into real insns by suitable fiddling with the operands. */
2111
2112/* Append the string modifier to the string contained in the argument at
2113 parsed_args[ndx]. */
2114static void
2115nios2_modify_arg (char **parsed_args, const char *modifier,
2116 int unused ATTRIBUTE_UNUSED, int ndx)
2117{
2118 char *tmp = parsed_args[ndx];
2119
2120 parsed_args[ndx]
2121 = (char *) malloc (strlen (parsed_args[ndx]) + strlen (modifier) + 1);
2122 strcpy (parsed_args[ndx], tmp);
2123 strcat (parsed_args[ndx], modifier);
2124}
2125
2126/* Modify parsed_args[ndx] by negating that argument. */
2127static void
2128nios2_negate_arg (char **parsed_args, const char *modifier ATTRIBUTE_UNUSED,
2129 int unused ATTRIBUTE_UNUSED, int ndx)
2130{
2131 char *tmp = parsed_args[ndx];
2132
2133 parsed_args[ndx]
2134 = (char *) malloc (strlen ("~(") + strlen (parsed_args[ndx]) +
2135 strlen (")+1") + 1);
2136
2137 strcpy (parsed_args[ndx], "~(");
2138 strcat (parsed_args[ndx], tmp);
2139 strcat (parsed_args[ndx], ")+1");
2140}
2141
2142/* The function nios2_swap_args swaps the pointers at indices index_1 and
2143 index_2 in the array parsed_args[] - this is used for operand swapping
2144 for comparison operations. */
2145static void
2146nios2_swap_args (char **parsed_args, const char *unused ATTRIBUTE_UNUSED,
2147 int index_1, int index_2)
2148{
2149 char *tmp;
2150 gas_assert (index_1 < NIOS2_MAX_INSN_TOKENS
2151 && index_2 < NIOS2_MAX_INSN_TOKENS);
2152 tmp = parsed_args[index_1];
2153 parsed_args[index_1] = parsed_args[index_2];
2154 parsed_args[index_2] = tmp;
2155}
2156
2157/* This function appends the string appnd to the array of strings in
2158 parsed_args num times starting at index start in the array. */
2159static void
2160nios2_append_arg (char **parsed_args, const char *appnd, int num,
2161 int start)
2162{
2163 int i, count;
2164 char *tmp;
2165
2166 gas_assert ((start + num) < NIOS2_MAX_INSN_TOKENS);
2167
2168 if (nios2_mode == NIOS2_MODE_TEST)
2169 tmp = parsed_args[start];
2170 else
2171 tmp = NULL;
2172
2173 for (i = start, count = num; count > 0; ++i, --count)
2174 parsed_args[i] = (char *) appnd;
2175
2176 gas_assert (i == (start + num));
2177 parsed_args[i] = tmp;
2178 parsed_args[i + 1] = NULL;
2179}
2180
2181/* This function inserts the string insert num times in the array
2182 parsed_args, starting at the index start. */
2183static void
2184nios2_insert_arg (char **parsed_args, const char *insert, int num,
2185 int start)
2186{
2187 int i, count;
2188
2189 gas_assert ((start + num) < NIOS2_MAX_INSN_TOKENS);
2190
2191 /* Move the existing arguments up to create space. */
2192 for (i = NIOS2_MAX_INSN_TOKENS; i - num >= start; --i)
2193 parsed_args[i] = parsed_args[i - num];
2194
2195 for (i = start, count = num; count > 0; ++i, --count)
2196 parsed_args[i] = (char *) insert;
2197}
2198
2199/* Cleanup function to free malloc'ed arg strings. */
2200static void
2201nios2_free_arg (char **parsed_args, int num ATTRIBUTE_UNUSED, int start)
2202{
2203 if (parsed_args[start])
2204 {
2205 free (parsed_args[start]);
2206 parsed_args[start] = NULL;
2207 }
2208}
2209
2210/* This function swaps the pseudo-op for a real op. */
2211static nios2_ps_insn_infoS*
2212nios2_translate_pseudo_insn (nios2_insn_infoS *insn)
2213{
2214
2215 nios2_ps_insn_infoS *ps_insn;
2216
2217 /* Find which real insn the pseudo-op transates to and
2218 switch the insn_info ptr to point to it. */
2219 ps_insn = nios2_ps_lookup (insn->insn_nios2_opcode->name);
2220
2221 if (ps_insn != NULL)
2222 {
2223 insn->insn_nios2_opcode = nios2_opcode_lookup (ps_insn->insn);
2224 insn->insn_tokens[0] = insn->insn_nios2_opcode->name;
2225 /* Modify the args so they work with the real insn. */
2226 ps_insn->arg_modifer_func ((char **) insn->insn_tokens,
2227 ps_insn->arg_modifier, ps_insn->num,
2228 ps_insn->index);
2229 }
2230 else
2231 /* we cannot recover from this. */
2232 as_fatal (_("unrecognized pseudo-instruction %s"),
2233 ps_insn->pseudo_insn);
2234 return ps_insn;
2235}
2236
2237/* Invoke the cleanup handler for pseudo-insn ps_insn on insn. */
2238static void
2239nios2_cleanup_pseudo_insn (nios2_insn_infoS *insn,
2240 nios2_ps_insn_infoS *ps_insn)
2241{
2242 if (ps_insn->arg_cleanup_func)
2243 (ps_insn->arg_cleanup_func) ((char **) insn->insn_tokens,
2244 ps_insn->num, ps_insn->index);
2245}
2246
2247const nios2_ps_insn_infoS nios2_ps_insn_info_structs[] = {
2248 /* pseudo-op, real-op, arg, arg_modifier_func, num, index, arg_cleanup_func */
2249 {"mov", "add", nios2_append_arg, "zero", 1, 3, NULL},
2250 {"movi", "addi", nios2_insert_arg, "zero", 1, 2, NULL},
2251 {"movhi", "orhi", nios2_insert_arg, "zero", 1, 2, NULL},
2252 {"movui", "ori", nios2_insert_arg, "zero", 1, 2, NULL},
2253 {"movia", "orhi", nios2_insert_arg, "zero", 1, 2, NULL},
2254 {"nop", "add", nios2_append_arg, "zero", 3, 1, NULL},
2255 {"bgt", "blt", nios2_swap_args, "", 1, 2, NULL},
2256 {"bgtu", "bltu", nios2_swap_args, "", 1, 2, NULL},
2257 {"ble", "bge", nios2_swap_args, "", 1, 2, NULL},
2258 {"bleu", "bgeu", nios2_swap_args, "", 1, 2, NULL},
2259 {"cmpgt", "cmplt", nios2_swap_args, "", 2, 3, NULL},
2260 {"cmpgtu", "cmpltu", nios2_swap_args, "", 2, 3, NULL},
2261 {"cmple", "cmpge", nios2_swap_args, "", 2, 3, NULL},
2262 {"cmpleu", "cmpgeu", nios2_swap_args, "", 2, 3, NULL},
2263 {"cmpgti", "cmpgei", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
2264 {"cmpgtui", "cmpgeui", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
2265 {"cmplei", "cmplti", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
2266 {"cmpleui", "cmpltui", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
2267 {"subi", "addi", nios2_negate_arg, "", 0, 3, nios2_free_arg}
2268 /* Add further pseudo-ops here. */
2269};
2270
2271#define NIOS2_NUM_PSEUDO_INSNS \
2272 ((sizeof(nios2_ps_insn_info_structs)/ \
2273 sizeof(nios2_ps_insn_info_structs[0])))
2274const int nios2_num_ps_insn_info_structs = NIOS2_NUM_PSEUDO_INSNS;
2275
2276\f
2277/** Assembler output support. */
2278
2279static int
2280can_evaluate_expr (nios2_insn_infoS *insn)
2281{
2282 /* Remove this check for null and the invalid insn "ori r9, 1234" seg faults. */
2283 if (!insn->insn_reloc)
2284 /* ??? Ideally we should do something other than as_fatal here as we can
2285 continue to assemble.
2286 However this function (actually the output_* functions) should not
2287 have been called in the first place once an illegal instruction had
2288 been encountered. */
2289 as_fatal (_("Invalid instruction encountered, cannot recover. No assembly attempted."));
2290
2291 if (insn->insn_reloc->reloc_expression.X_op == O_constant)
2292 return 1;
2293
2294 return 0;
2295}
2296
2297static int
2298get_expr_value (nios2_insn_infoS *insn)
2299{
2300 int value = 0;
2301
2302 if (insn->insn_reloc->reloc_expression.X_op == O_constant)
2303 value = insn->insn_reloc->reloc_expression.X_add_number;
2304 return value;
2305}
2306
2307/* Output a normal instruction. */
2308static void
2309output_insn (nios2_insn_infoS *insn)
2310{
2311 char *f;
2312 nios2_insn_relocS *reloc;
2313
2314 f = frag_more (4);
2315 /* This allocates enough space for the instruction
2316 and puts it in the current frag. */
2317 md_number_to_chars (f, insn->insn_code, 4);
2318 /* Emit debug info. */
2319 dwarf2_emit_insn (4);
2320 /* Create any fixups to be acted on later. */
2321 for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next)
2322 fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
2323 &reloc->reloc_expression, reloc->reloc_pcrel,
2324 reloc->reloc_type);
2325}
2326
2327/* Output an unconditional branch. */
2328static void
2329output_ubranch (nios2_insn_infoS *insn)
2330{
2331 nios2_insn_relocS *reloc = insn->insn_reloc;
2332
2333 /* If the reloc is NULL, there was an error assembling the branch. */
2334 if (reloc != NULL)
2335 {
2336 symbolS *symp = reloc->reloc_expression.X_add_symbol;
2337 offsetT offset = reloc->reloc_expression.X_add_number;
2338 char *f;
2339
2340 /* Tag dwarf2 debug info to the address at the start of the insn.
2341 We must do it before frag_var() below closes off the frag. */
2342 dwarf2_emit_insn (0);
2343
2344 /* We create a machine dependent frag which can grow
2345 to accommodate the largest possible instruction sequence
2346 this may generate. */
2347 f = frag_var (rs_machine_dependent,
2348 UBRANCH_MAX_SIZE, 4, UBRANCH_SUBTYPE (0),
2349 symp, offset, NULL);
2350
2351 md_number_to_chars (f, insn->insn_code, 4);
2352
2353 /* We leave fixup generation to md_convert_frag. */
2354 }
2355}
2356
2357/* Output a conditional branch. */
2358static void
2359output_cbranch (nios2_insn_infoS *insn)
2360{
2361 nios2_insn_relocS *reloc = insn->insn_reloc;
2362
2363 /* If the reloc is NULL, there was an error assembling the branch. */
2364 if (reloc != NULL)
2365 {
2366 symbolS *symp = reloc->reloc_expression.X_add_symbol;
2367 offsetT offset = reloc->reloc_expression.X_add_number;
2368 char *f;
2369
2370 /* Tag dwarf2 debug info to the address at the start of the insn.
2371 We must do it before frag_var() below closes off the frag. */
2372 dwarf2_emit_insn (0);
2373
2374 /* We create a machine dependent frag which can grow
2375 to accommodate the largest possible instruction sequence
2376 this may generate. */
2377 f = frag_var (rs_machine_dependent,
2378 CBRANCH_MAX_SIZE, 4, CBRANCH_SUBTYPE (0),
2379 symp, offset, NULL);
2380
2381 md_number_to_chars (f, insn->insn_code, 4);
2382
2383 /* We leave fixup generation to md_convert_frag. */
2384 }
2385}
2386
2387/* Output a call sequence. Since calls are not pc-relative for NIOS2,
2388 but are page-relative, we cannot tell at any stage in assembly
2389 whether a call will be out of range since a section may be linked
2390 at any address. So if we are relaxing, we convert all call instructions
2391 to long call sequences, and rely on the linker to relax them back to
2392 short calls. */
2393static void
2394output_call (nios2_insn_infoS *insn)
2395{
2396 /* This allocates enough space for the instruction
2397 and puts it in the current frag. */
2398 char *f = frag_more (12);
2399 nios2_insn_relocS *reloc = insn->insn_reloc;
2400
2401 md_number_to_chars (f, OP_MATCH_ORHI | 0x00400000, 4);
2402 dwarf2_emit_insn (4);
2403 fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
2404 &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_HI16);
2405 md_number_to_chars (f + 4, OP_MATCH_ORI | 0x08400000, 4);
2406 dwarf2_emit_insn (4);
2407 fix_new_exp (frag_now, f - frag_now->fr_literal + 4, 4,
2408 &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_LO16);
2409 md_number_to_chars (f + 8, OP_MATCH_CALLR | 0x08000000, 4);
2410 dwarf2_emit_insn (4);
2411}
2412
2413/* Output an addi - will silently convert to
2414 orhi if rA = r0 and (expr & 0xffff0000) == 0. */
2415static void
2416output_addi (nios2_insn_infoS *insn)
2417{
2418 if (can_evaluate_expr (insn))
2419 {
2420 int expr_val = get_expr_value (insn);
2421 if (GET_INSN_FIELD (RRS, insn->insn_code) == 0
2422 && (expr_val & 0xffff) == 0
2423 && expr_val != 0)
2424 {
2425 /* We really want a movhi (orhi) here. */
2426 insn->insn_code = (insn->insn_code & ~OP_MATCH_ADDI) | OP_MATCH_ORHI;
2427 insn->insn_reloc->reloc_expression.X_add_number =
2428 (insn->insn_reloc->reloc_expression.X_add_number >> 16) & 0xffff;
2429 insn->insn_reloc->reloc_type = BFD_RELOC_NIOS2_U16;
2430 }
2431 }
2432
2433 /* Output an instruction. */
2434 output_insn (insn);
2435}
2436
2437static void
2438output_andi (nios2_insn_infoS *insn)
2439{
2440 if (can_evaluate_expr (insn))
2441 {
2442 int expr_val = get_expr_value (insn);
2443 if (expr_val != 0 && (expr_val & 0xffff) == 0)
2444 {
2445 /* We really want a movhi (orhi) here. */
2446 insn->insn_code = (insn->insn_code & ~OP_MATCH_ANDI) | OP_MATCH_ANDHI;
2447 insn->insn_reloc->reloc_expression.X_add_number =
2448 (insn->insn_reloc->reloc_expression.X_add_number >> 16) & 0xffff;
2449 insn->insn_reloc->reloc_type = BFD_RELOC_NIOS2_U16;
2450 }
2451 }
2452
2453 /* Output an instruction. */
2454 output_insn (insn);
2455}
2456
2457static void
2458output_ori (nios2_insn_infoS *insn)
2459{
2460 if (can_evaluate_expr (insn))
2461 {
2462 int expr_val = get_expr_value (insn);
2463 if (expr_val != 0 && (expr_val & 0xffff) == 0)
2464 {
2465 /* We really want a movhi (orhi) here. */
2466 insn->insn_code = (insn->insn_code & ~OP_MATCH_ORI) | OP_MATCH_ORHI;
2467 insn->insn_reloc->reloc_expression.X_add_number =
2468 (insn->insn_reloc->reloc_expression.X_add_number >> 16) & 0xffff;
2469 insn->insn_reloc->reloc_type = BFD_RELOC_NIOS2_U16;
2470 }
2471 }
2472
2473 /* Output an instruction. */
2474 output_insn (insn);
2475}
2476
2477static void
2478output_xori (nios2_insn_infoS *insn)
2479{
2480 if (can_evaluate_expr (insn))
2481 {
2482 int expr_val = get_expr_value (insn);
2483 if (expr_val != 0 && (expr_val & 0xffff) == 0)
2484 {
2485 /* We really want a movhi (orhi) here. */
2486 insn->insn_code = (insn->insn_code & ~OP_MATCH_XORI) | OP_MATCH_XORHI;
2487 insn->insn_reloc->reloc_expression.X_add_number =
2488 (insn->insn_reloc->reloc_expression.X_add_number >> 16) & 0xffff;
2489 insn->insn_reloc->reloc_type = BFD_RELOC_NIOS2_U16;
2490 }
2491 }
2492
2493 /* Output an instruction. */
2494 output_insn (insn);
2495}
2496
2497
2498/* Output a movhi/addi pair for the movia pseudo-op. */
2499static void
2500output_movia (nios2_insn_infoS *insn)
2501{
2502 /* This allocates enough space for the instruction
2503 and puts it in the current frag. */
2504 char *f = frag_more (8);
2505 nios2_insn_relocS *reloc = insn->insn_reloc;
2506 unsigned long reg_index = GET_INSN_FIELD (IRT, insn->insn_code);
2507
2508 /* If the reloc is NULL, there was an error assembling the movia. */
2509 if (reloc != NULL)
2510 {
2511 md_number_to_chars (f, insn->insn_code, 4);
2512 dwarf2_emit_insn (4);
2513 md_number_to_chars (f + 4,
2514 (OP_MATCH_ADDI | (reg_index << OP_SH_IRT)
2515 | (reg_index << OP_SH_IRS)),
2516 4);
2517 dwarf2_emit_insn (4);
2518 fix_new (frag_now, f - frag_now->fr_literal, 4,
2519 reloc->reloc_expression.X_add_symbol,
2520 reloc->reloc_expression.X_add_number, 0,
2521 BFD_RELOC_NIOS2_HIADJ16);
2522 fix_new (frag_now, f + 4 - frag_now->fr_literal, 4,
2523 reloc->reloc_expression.X_add_symbol,
2524 reloc->reloc_expression.X_add_number, 0, BFD_RELOC_NIOS2_LO16);
2525 }
2526}
2527
2528
2529\f
2530/** External interfaces. */
2531
2532/* The following functions are called by machine-independent parts of
2533 the assembler. */
2534int
2535md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
2536{
2537 switch (c)
2538 {
2539 case 'r':
2540 /* Hidden option for self-test mode. */
2541 nios2_mode = NIOS2_MODE_TEST;
2542 break;
2543 case OPTION_RELAX_ALL:
2544 nios2_as_options.relax = relax_all;
2545 break;
2546 case OPTION_NORELAX:
2547 nios2_as_options.relax = relax_none;
2548 break;
2549 case OPTION_RELAX_SECTION:
2550 nios2_as_options.relax = relax_section;
2551 break;
2552 case OPTION_EB:
2553 target_big_endian = 1;
2554 break;
2555 case OPTION_EL:
2556 target_big_endian = 0;
2557 break;
2558 default:
2559 return 0;
2560 break;
2561 }
2562
2563 return 1;
2564}
2565
2566/* Implement TARGET_FORMAT. We can choose to be big-endian or
2567 little-endian at runtime based on a switch. */
2568const char *
2569nios2_target_format (void)
2570{
2571 return target_big_endian ? "elf32-bignios2" : "elf32-littlenios2";
2572}
2573
2574/* Machine-dependent usage message. */
2575void
2576md_show_usage (FILE *stream)
2577{
2578 fprintf (stream, " NIOS2 options:\n"
2579 " -relax-all replace all branch and call "
2580 "instructions with jmp and callr sequences\n"
2581 " -relax-section replace identified out of range "
2582 "branches with jmp sequences (default)\n"
2583 " -no-relax do not replace any branches or calls\n"
2584 " -EB force big-endian byte ordering\n"
2585 " -EL force little-endian byte ordering\n");
2586}
2587
2588/* This function is called once, at assembler startup time.
2589 It should set up all the tables, etc. that the MD part of the
2590 assembler will need. */
2591void
2592md_begin (void)
2593{
2594 int i;
2595 const char *inserted;
2596
2597 /* Create and fill a hashtable for the Nios II opcodes, registers and
2598 arguments. */
2599 nios2_opcode_hash = hash_new ();
2600 nios2_reg_hash = hash_new ();
2601 nios2_arg_hash = hash_new ();
2602 nios2_ps_hash = hash_new ();
2603
2604 for (i = 0; i < NUMOPCODES; ++i)
2605 {
2606 inserted
2607 = hash_insert (nios2_opcode_hash, nios2_opcodes[i].name,
2608 (PTR) & nios2_opcodes[i]);
2609 if (inserted != NULL)
2610 {
2611 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2612 nios2_opcodes[i].name, inserted);
2613 /* Probably a memory allocation problem? Give up now. */
2614 as_fatal (_("Broken assembler. No assembly attempted."));
2615 }
2616 }
2617
2618 for (i = 0; i < nios2_num_regs; ++i)
2619 {
2620 inserted
2621 = hash_insert (nios2_reg_hash, nios2_regs[i].name,
2622 (PTR) & nios2_regs[i]);
2623 if (inserted != NULL)
2624 {
2625 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2626 nios2_regs[i].name, inserted);
2627 /* Probably a memory allocation problem? Give up now. */
2628 as_fatal (_("Broken assembler. No assembly attempted."));
2629 }
2630
2631 }
2632
2633 for (i = 0; i < nios2_num_arg_info_structs; ++i)
2634 {
2635 inserted
2636 = hash_insert (nios2_arg_hash, nios2_arg_info_structs[i].args,
2637 (PTR) & nios2_arg_info_structs[i]);
2638 if (inserted != NULL)
2639 {
2640 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2641 nios2_arg_info_structs[i].args, inserted);
2642 /* Probably a memory allocation problem? Give up now. */
2643 as_fatal (_("Broken assembler. No assembly attempted."));
2644 }
2645 }
2646
2647 for (i = 0; i < nios2_num_ps_insn_info_structs; ++i)
2648 {
2649 inserted
2650 = hash_insert (nios2_ps_hash, nios2_ps_insn_info_structs[i].pseudo_insn,
2651 (PTR) & nios2_ps_insn_info_structs[i]);
2652 if (inserted != NULL)
2653 {
2654 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2655 nios2_ps_insn_info_structs[i].pseudo_insn, inserted);
2656 /* Probably a memory allocation problem? Give up now. */
2657 as_fatal (_("Broken assembler. No assembly attempted."));
2658 }
2659 }
2660
2661 /* Assembler option defaults. */
2662 nios2_as_options.noat = FALSE;
2663 nios2_as_options.nobreak = FALSE;
2664
2665 /* Debug information is incompatible with relaxation. */
2666 if (debug_type != DEBUG_UNSPECIFIED)
2667 nios2_as_options.relax = relax_none;
2668
2669 /* Initialize the alignment data. */
2670 nios2_current_align_seg = now_seg;
2671 nios2_last_label = NULL;
2672 nios2_current_align = 0;
2673}
2674
2675
2676/* Assembles a single line of Nios II assembly language. */
2677void
2678md_assemble (char *op_str)
2679{
2680 char *argstr;
2681 char *op_strdup = NULL;
2682 nios2_arg_infoS *arg_info;
2683 unsigned long saved_pinfo = 0;
2684 nios2_insn_infoS thisinsn;
2685 nios2_insn_infoS *insn = &thisinsn;
2686
2687 /* Make sure we are aligned on a 4-byte boundary. */
2688 if (nios2_current_align < 2)
2689 nios2_align (2, NULL, nios2_last_label);
2690 else if (nios2_current_align > 2)
2691 nios2_current_align = 2;
2692 nios2_last_label = NULL;
2693
2694 /* We don't want to clobber to op_str
2695 because we want to be able to use it in messages. */
2696 op_strdup = strdup (op_str);
2697 insn->insn_tokens[0] = strtok (op_strdup, " ");
2698 argstr = strtok (NULL, "");
2699
2700 /* Assemble the opcode. */
2701 insn->insn_nios2_opcode = nios2_opcode_lookup (insn->insn_tokens[0]);
2702 insn->insn_reloc = NULL;
2703
2704 if (insn->insn_nios2_opcode != NULL)
2705 {
2706 nios2_ps_insn_infoS *ps_insn = NULL;
2707 /* Set the opcode for the instruction. */
2708 insn->insn_code = insn->insn_nios2_opcode->match;
2709
2710 /* Parse the arguments pointed to by argstr. */
2711 if (nios2_mode == NIOS2_MODE_ASSEMBLE)
2712 nios2_parse_args (insn, argstr, insn->insn_nios2_opcode->args,
2713 (char **) &insn->insn_tokens[1]);
2714 else
2715 nios2_parse_args (insn, argstr, insn->insn_nios2_opcode->args_test,
2716 (char **) &insn->insn_tokens[1]);
2717
2718 /* We need to preserve the MOVIA macro as this is clobbered by
2719 translate_pseudo_insn. */
2720 if (insn->insn_nios2_opcode->pinfo == NIOS2_INSN_MACRO_MOVIA)
2721 saved_pinfo = NIOS2_INSN_MACRO_MOVIA;
2722 /* If the instruction is an pseudo-instruction, we want to replace it
2723 with its real equivalent, and then continue. */
2724 if ((insn->insn_nios2_opcode->pinfo & NIOS2_INSN_MACRO)
2725 == NIOS2_INSN_MACRO)
2726 ps_insn = nios2_translate_pseudo_insn (insn);
2727
2728 /* Find the assemble function, and call it. */
2729 arg_info = nios2_arg_lookup (insn->insn_nios2_opcode->args);
2730 if (arg_info != NULL)
2731 {
2732 arg_info->assemble_args_func (insn);
2733
2734 if (nios2_as_options.relax != relax_none
2735 && !nios2_as_options.noat
2736 && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_UBRANCH)
2737 output_ubranch (insn);
2738 else if (nios2_as_options.relax != relax_none
2739 && !nios2_as_options.noat
2740 && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_CBRANCH)
2741 output_cbranch (insn);
2742 else if (nios2_as_options.relax == relax_all
2743 && !nios2_as_options.noat
2744 && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_CALL
2745 && insn->insn_reloc
78058a5e
SL
2746 && ((insn->insn_reloc->reloc_type
2747 == BFD_RELOC_NIOS2_CALL26)
2748 || (insn->insn_reloc->reloc_type
2749 == BFD_RELOC_NIOS2_CALL26_NOAT)))
36591ba1
SL
2750 output_call (insn);
2751 else if (insn->insn_nios2_opcode->pinfo & NIOS2_INSN_ANDI)
2752 output_andi (insn);
2753 else if (insn->insn_nios2_opcode->pinfo & NIOS2_INSN_ORI)
2754 output_ori (insn);
2755 else if (insn->insn_nios2_opcode->pinfo & NIOS2_INSN_XORI)
2756 output_xori (insn);
2757 else if (insn->insn_nios2_opcode->pinfo & NIOS2_INSN_ADDI)
2758 output_addi (insn);
2759 else if (saved_pinfo == NIOS2_INSN_MACRO_MOVIA)
2760 output_movia (insn);
2761 else
2762 output_insn (insn);
2763 if (ps_insn)
2764 nios2_cleanup_pseudo_insn (insn, ps_insn);
2765 }
2766 else
2767 {
2768 /* The assembler is broken. */
2769 fprintf (stderr,
2770 _("internal error: %s is not a valid argument syntax\n"),
2771 insn->insn_nios2_opcode->args);
2772 /* Probably a memory allocation problem. Give up now. */
2773 as_fatal (_("Broken assembler. No assembly attempted."));
2774 }
2775 }
2776 else
2777 /* Unrecognised instruction - error. */
2778 as_bad (_("unrecognised instruction %s"), insn->insn_tokens[0]);
2779
2780 /* Don't leak memory. */
2781 free (op_strdup);
2782}
2783
2784/* Round up section size. */
2785valueT
2786md_section_align (asection *seg ATTRIBUTE_UNUSED, valueT size)
2787{
2788 /* I think byte alignment is fine here. */
2789 return size;
2790}
2791
2792/* Implement TC_FORCE_RELOCATION. */
2793int
2794nios2_force_relocation (fixS *fixp)
2795{
2796 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2797 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
2798 || fixp->fx_r_type == BFD_RELOC_NIOS2_ALIGN)
2799 return 1;
2800
2801 return generic_force_reloc (fixp);
2802}
2803
2804/* Implement tc_fix_adjustable. */
2805int
2806nios2_fix_adjustable (fixS *fixp)
2807{
2808 if (fixp->fx_addsy == NULL)
2809 return 1;
2810
2811#ifdef OBJ_ELF
2812 /* Prevent all adjustments to global symbols. */
2813 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
2814 && (S_IS_EXTERNAL (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)))
2815 return 0;
2816#endif
2817 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2818 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2819 return 0;
2820
2821 /* Preserve relocations against symbols with function type. */
2822 if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION)
2823 return 0;
2824
2825 /* Don't allow symbols to be discarded on GOT related relocs. */
2826 if (fixp->fx_r_type == BFD_RELOC_NIOS2_GOT16
2827 || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL16
2828 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_LO
2829 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_HA
2830 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_GD16
2831 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LDM16
2832 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LDO16
2833 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_IE16
2834 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LE16
2835 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPMOD
2836 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL
2837 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_TPREL
1c2de463
SL
2838 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF
2839 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_LO
2840 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_HA
2841 || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_LO
2842 || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_HA
2843 )
36591ba1
SL
2844 return 0;
2845
2846 return 1;
2847}
2848
2849/* Implement tc_frob_symbol. This is called in adjust_reloc_syms;
2850 it is used to remove *ABS* references from the symbol table. */
2851int
2852nios2_frob_symbol (symbolS *symp)
2853{
2854 if ((OUTPUT_FLAVOR == bfd_target_elf_flavour
2855 && symp == section_symbol (absolute_section))
2856 || !S_IS_DEFINED (symp))
2857 return 1;
2858 else
2859 return 0;
2860}
2861
2862/* The function tc_gen_reloc creates a relocation structure for the
2863 fixup fixp, and returns a pointer to it. This structure is passed
2864 to bfd_install_relocation so that it can be written to the object
2865 file for linking. */
2866arelent *
2867tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2868{
2869 arelent *reloc = (arelent *) xmalloc (sizeof (arelent));
2870 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2871 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2872
2873 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2874 reloc->addend = fixp->fx_offset; /* fixp->fx_addnumber; */
2875
2876 if (fixp->fx_pcrel)
2877 {
2878 switch (fixp->fx_r_type)
2879 {
2880 case BFD_RELOC_16:
2881 fixp->fx_r_type = BFD_RELOC_16_PCREL;
2882 break;
2883 case BFD_RELOC_NIOS2_LO16:
2884 fixp->fx_r_type = BFD_RELOC_NIOS2_PCREL_LO;
2885 break;
2886 case BFD_RELOC_NIOS2_HIADJ16:
2887 fixp->fx_r_type = BFD_RELOC_NIOS2_PCREL_HA;
2888 break;
2889 default:
2890 break;
2891 }
2892 }
2893
2894 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2895 if (reloc->howto == NULL)
2896 {
2897 as_bad_where (fixp->fx_file, fixp->fx_line,
2898 _("can't represent relocation type %s"),
2899 bfd_get_reloc_code_name (fixp->fx_r_type));
2900
2901 /* Set howto to a garbage value so that we can keep going. */
2902 reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
2903 gas_assert (reloc->howto != NULL);
2904 }
2905 return reloc;
2906}
2907
2908long
2909md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
2910{
2911 return 0;
2912}
2913
2914/* Called just before the assembler exits. */
2915void
2916md_end ()
2917{
2918 /* FIXME - not yet implemented */
2919}
2920
2921/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
2922 Otherwise we have no need to default values of symbols. */
2923symbolS *
2924md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2925{
2926#ifdef OBJ_ELF
2927 if (name[0] == '_' && name[1] == 'G'
2928 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
2929 {
2930 if (!GOT_symbol)
2931 {
2932 if (symbol_find (name))
2933 as_bad ("GOT already in the symbol table");
2934
2935 GOT_symbol = symbol_new (name, undefined_section,
2936 (valueT) 0, &zero_address_frag);
2937 }
2938
2939 return GOT_symbol;
2940 }
2941#endif
2942
2943 return 0;
2944}
2945
2946/* Implement tc_frob_label. */
2947void
2948nios2_frob_label (symbolS *lab)
2949{
2950 /* Emit dwarf information. */
2951 dwarf2_emit_label (lab);
2952
2953 /* Update the label's address with the current output pointer. */
2954 symbol_set_frag (lab, frag_now);
2955 S_SET_VALUE (lab, (valueT) frag_now_fix ());
2956
2957 /* Record this label for future adjustment after we find out what
2958 kind of data it references, and the required alignment therewith. */
2959 nios2_last_label = lab;
2960}
2961
2962/* Implement md_cons_align. */
2963void
2964nios2_cons_align (int size)
2965{
2966 int log_size = 0;
2967 const char *pfill = NULL;
2968
2969 while ((size >>= 1) != 0)
2970 ++log_size;
2971
2972 if (subseg_text_p (now_seg))
2973 pfill = (const char *) &nop;
2974 else
2975 pfill = NULL;
2976
2977 if (nios2_auto_align_on)
2978 nios2_align (log_size, pfill, NULL);
2979
2980 nios2_last_label = NULL;
2981}
2982
2983/* Map 's' to SHF_NIOS2_GPREL. */
2984/* This is from the Alpha code tc-alpha.c. */
2985int
2986nios2_elf_section_letter (int letter, char **ptr_msg)
2987{
2988 if (letter == 's')
2989 return SHF_NIOS2_GPREL;
2990
2991 *ptr_msg = _("Bad .section directive: want a,s,w,x,M,S,G,T in string");
2992 return -1;
2993}
2994
2995/* Map SHF_ALPHA_GPREL to SEC_SMALL_DATA. */
2996/* This is from the Alpha code tc-alpha.c. */
2997flagword
2998nios2_elf_section_flags (flagword flags, int attr, int type ATTRIBUTE_UNUSED)
2999{
3000 if (attr & SHF_NIOS2_GPREL)
3001 flags |= SEC_SMALL_DATA;
3002 return flags;
3003}
3004
3005/* Implement TC_PARSE_CONS_EXPRESSION to handle %tls_ldo(...) */
3006static int nios2_tls_ldo_reloc;
3007
3008void
3009nios2_cons (expressionS *exp, int size)
3010{
3011 nios2_tls_ldo_reloc = 0;
3012
3013 SKIP_WHITESPACE ();
3014 if (input_line_pointer[0] == '%')
3015 {
3016 if (strprefix (input_line_pointer + 1, "tls_ldo"))
3017 {
3018 if (size != 4)
3019 as_bad (_("Illegal operands: %%tls_ldo in %d-byte data field"),
3020 size);
3021 else
3022 {
3023 input_line_pointer += 8;
3024 nios2_tls_ldo_reloc = 1;
3025 }
3026 }
3027 if (nios2_tls_ldo_reloc)
3028 {
3029 SKIP_WHITESPACE ();
3030 if (input_line_pointer[0] != '(')
3031 as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
3032 else
3033 {
3034 int c;
3035 char *end = ++input_line_pointer;
3036 int npar = 0;
3037
3038 for (c = *end; !is_end_of_line[c]; end++, c = *end)
3039 if (c == '(')
3040 npar++;
3041 else if (c == ')')
3042 {
3043 if (!npar)
3044 break;
3045 npar--;
3046 }
3047
3048 if (c != ')')
3049 as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
3050 else
3051 {
3052 *end = '\0';
3053 expression (exp);
3054 *end = c;
3055 if (input_line_pointer != end)
3056 as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
3057 else
3058 {
3059 input_line_pointer++;
3060 SKIP_WHITESPACE ();
3061 c = *input_line_pointer;
3062 if (! is_end_of_line[c] && c != ',')
3063 as_bad (_("Illegal operands: garbage after %%tls_ldo()"));
3064 }
3065 }
3066 }
3067 }
3068 }
3069 if (!nios2_tls_ldo_reloc)
3070 expression (exp);
3071}
3072
3073/* Implement TC_CONS_FIX_NEW. */
3074void
3075nios2_cons_fix_new (fragS *frag, int where, unsigned int nbytes,
3076 expressionS *exp)
3077{
3078 bfd_reloc_code_real_type r;
3079
3080 r = (nbytes == 1 ? BFD_RELOC_8
3081 : (nbytes == 2 ? BFD_RELOC_16
3082 : (nbytes == 4 ? BFD_RELOC_32 : BFD_RELOC_64)));
3083
3084 if (nios2_tls_ldo_reloc)
3085 r = BFD_RELOC_NIOS2_TLS_DTPREL;
3086
3087 fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
3088 nios2_tls_ldo_reloc = 0;
3089}
3090
3091/* Implement HANDLE_ALIGN. */
3092void
3093nios2_handle_align (fragS *fragp)
3094{
3095 /* If we are expecting to relax in the linker, then we must output a
3096 relocation to tell the linker we are aligning code. */
3097 if (nios2_as_options.relax == relax_all
3098 && (fragp->fr_type == rs_align || fragp->fr_type == rs_align_code)
3099 && fragp->fr_address + fragp->fr_fix > 0
3100 && fragp->fr_offset > 1
3101 && now_seg != bss_section)
3102 fix_new (fragp, fragp->fr_fix, 0, &abs_symbol, fragp->fr_offset, 0,
3103 BFD_RELOC_NIOS2_ALIGN);
3104}
3105
3106/* Implement tc_regname_to_dw2regnum, to convert REGNAME to a DWARF-2
3107 register number. */
3108int
3109nios2_regname_to_dw2regnum (char *regname)
3110{
3111 struct nios2_reg *r = nios2_reg_lookup (regname);
3112 if (r == NULL)
3113 return -1;
3114 return r->index;
3115}
3116
3117/* Implement tc_cfi_frame_initial_instructions, to initialize the DWARF-2
3118 unwind information for this procedure. */
3119void
3120nios2_frame_initial_instructions (void)
3121{
3122 cfi_add_CFA_def_cfa (27, 0);
3123}