gas TC_PARSE_CONS_EXPRESSION communication with TC_CONS_FIX_NEW
[external/binutils.git] / gas / config / tc-nios2.c
1 /* Altera Nios II assembler.
2    Copyright (C) 2012-2014 Free Software Foundation, Inc.
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.  */
35 OBJ_ELF not defined
36 #endif
37
38 /* We can choose our endianness at run-time, regardless of configuration.  */
39 extern 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.  */
43 const 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.  */
52 const char line_comment_chars[] = "#";
53
54 /* This array holds machine specific line separator characters.  */
55 const char line_separator_chars[] = ";";
56
57 /* Chars that can be used to separate mant from exp in floating point nums.  */
58 const 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 */
63 const 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
71 const char *md_shortopts = "r";
72
73 struct 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
86 size_t md_longopts_size = sizeof (md_longopts);
87
88 /* The assembler supports three different relaxation modes, controlled by
89    command-line options.  */
90 typedef 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.  */
98 struct
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
121 typedef 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.  */
138 typedef 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.  */
159 typedef 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.  */
167 typedef 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.  */
190 static 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.  */
195 static 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.  */
200 static 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.  */
205 static 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.  */
210 static int nios2_current_align;
211 static segT nios2_current_align_seg;
212
213 static 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.  */
217 static symbolS *nios2_last_label;
218
219 #ifdef OBJ_ELF
220 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
221 symbolS *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.  */
229 static valueT
230 md_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.  */
251 void
252 md_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.  */
265 char *
266 md_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.  */
307 static int
308 nios2_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")
321           || strprefix (str, "eccinj")
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.  */
329 static int
330 nios2_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.  */
350 static bfd_boolean
351 nios2_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.  */
368 static char const nop[4] = { 0x3a, 0x88, 0x01, 0x00 };
369
370 /* Handles all machine-dependent alignment needs.  */
371 static void
372 nios2_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.  */
459 typedef enum
460 {
461   NIOS2_MODE_ASSEMBLE,          /* Ordinary operation.  */
462   NIOS2_MODE_TEST               /* Hidden mode used for self testing.  */
463 } NIOS2_MODE;
464
465 static 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.  */
471 static void
472 nios2_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.  */
488 static void
489 s_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.  */
536 static void
537 s_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.  */
547 static void
548 s_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.  */
558 static void
559 s_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.  */
568 static void
569 s_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.  */
579 static void
580 s_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 ).  */
589 static void
590 s_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 }  */
643 const 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.  */
769 static int
770 nios2_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.  */
787 int
788 md_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.  */
794 long
795 nios2_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. */
876 void
877 md_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. */
1010 static bfd_boolean
1011 nios2_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.  */
1052 static void
1053 nios2_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.  */
1129 void
1130 md_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
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
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:
1266               fixup = ((((fixup >> 16) & 0xFFFF) + ((fixup >> 15) & 0x01))
1267                        & 0xFFFF);
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
1302 struct nios2_special_relocS
1303 {
1304   const char *string;
1305   bfd_reloc_code_real_type reloc_type;
1306 };
1307
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
1311 struct 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},
1316   {"%call_lo", BFD_RELOC_NIOS2_CALL_LO},
1317   {"%call_hiadj", BFD_RELOC_NIOS2_CALL_HA},
1318   {"%call", BFD_RELOC_NIOS2_CALL16},
1319   {"%gotoff_lo", BFD_RELOC_NIOS2_GOTOFF_LO},
1320   {"%gotoff_hiadj", BFD_RELOC_NIOS2_GOTOFF_HA},
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},
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},
1330 };
1331
1332 #define NIOS2_NUM_SPECIAL_RELOCS \
1333         (sizeof(nios2_special_reloc)/sizeof(nios2_special_reloc[0]))
1334 const int nios2_num_special_relocs = NIOS2_NUM_SPECIAL_RELOCS;
1335
1336 /* Creates a new nios2_insn_relocS and returns a pointer to it.  */
1337 static nios2_insn_relocS *
1338 nios2_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
1358 static void
1359 nios2_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.  */
1371 static unsigned long
1372 nios2_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
1445 static void
1446 nios2_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
1475 static void
1476 nios2_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
1504 static void
1505 nios2_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
1534 static void
1535 nios2_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
1564 static void
1565 nios2_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
1579 static void
1580 nios2_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
1602 static void
1603 nios2_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,
1610                                      (nios2_as_options.noat
1611                                       ? BFD_RELOC_NIOS2_CALL26_NOAT
1612                                       : BFD_RELOC_NIOS2_CALL26),
1613                                      0);
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
1621 static void
1622 nios2_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
1636 static void
1637 nios2_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
1666 static void
1667 nios2_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
1688 static void
1689 nios2_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
1712 static void
1713 nios2_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
1734 static void
1735 nios2_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
1789 static void
1790 nios2_assemble_args_none (nios2_insn_infoS *insn_info ATTRIBUTE_UNUSED)
1791 {
1792   /* Nothing to do.  */
1793 }
1794
1795 static void
1796 nios2_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
1827 static void
1828 nios2_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
1843 static void
1844 nios2_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.  */
1865 const 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},
1891   {"d,s", nios2_assemble_args_ds},
1892   {"d,s,E", nios2_assemble_args_ds},
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])))
1905 const 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.  */
1913 static char *
1914 nios2_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")))
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."));
1972         
1973       if (!nios2_as_options.nobreak
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."));
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':
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;
2008     case 'o':
2009       break;
2010     default:
2011       BAD_CASE (*parsestr);
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.  */
2024 static char *
2025 nios2_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.  */
2049 static void
2050 nios2_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
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)
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].  */
2114 static void
2115 nios2_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.  */
2127 static void
2128 nios2_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.  */
2145 static void
2146 nios2_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.  */
2159 static void
2160 nios2_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.  */
2183 static void
2184 nios2_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.  */
2200 static void
2201 nios2_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.  */
2211 static nios2_ps_insn_infoS*
2212 nios2_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.  */
2238 static void
2239 nios2_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
2247 const 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])))
2274 const int nios2_num_ps_insn_info_structs = NIOS2_NUM_PSEUDO_INSNS;
2275
2276 \f
2277 /** Assembler output support.  */
2278
2279 static int
2280 can_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
2297 static int
2298 get_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.  */
2308 static void
2309 output_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.  */
2328 static void
2329 output_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.  */
2358 static void
2359 output_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.  */
2393 static void
2394 output_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.  */
2415 static void
2416 output_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
2437 static void
2438 output_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
2457 static void
2458 output_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
2477 static void
2478 output_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.  */
2499 static void
2500 output_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. */
2534 int
2535 md_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.  */
2568 const char *
2569 nios2_target_format (void)
2570 {
2571   return target_big_endian ? "elf32-bignios2" : "elf32-littlenios2";
2572 }
2573
2574 /* Machine-dependent usage message. */
2575 void
2576 md_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. */
2591 void
2592 md_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.  */
2677 void
2678 md_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
2746                    && ((insn->insn_reloc->reloc_type
2747                         == BFD_RELOC_NIOS2_CALL26)
2748                        || (insn->insn_reloc->reloc_type
2749                            == BFD_RELOC_NIOS2_CALL26_NOAT)))
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.  */
2785 valueT
2786 md_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.  */
2793 int
2794 nios2_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.  */
2805 int
2806 nios2_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
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       )
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.  */
2851 int
2852 nios2_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.  */
2866 arelent *
2867 tc_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
2908 long
2909 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
2910 {
2911   return 0;
2912 }
2913
2914 /* Called just before the assembler exits.  */
2915 void
2916 md_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.  */
2923 symbolS *
2924 md_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.  */
2947 void
2948 nios2_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.  */
2963 void
2964 nios2_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.  */
2985 int
2986 nios2_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.  */
2997 flagword
2998 nios2_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(...) */
3006 bfd_reloc_code_real_type
3007 nios2_cons (expressionS *exp, int size)
3008 {
3009   bfd_reloc_code_real_type nios2_tls_ldo_reloc = BFD_RELOC_NONE;
3010
3011   SKIP_WHITESPACE ();
3012   if (input_line_pointer[0] == '%')
3013     {
3014       if (strprefix (input_line_pointer + 1, "tls_ldo"))
3015         {
3016           if (size != 4)
3017             as_bad (_("Illegal operands: %%tls_ldo in %d-byte data field"),
3018                     size);
3019           else
3020             {
3021               input_line_pointer += 8;
3022               nios2_tls_ldo_reloc = BFD_RELOC_NIOS2_TLS_DTPREL;
3023             }
3024         }
3025       if (nios2_tls_ldo_reloc != BFD_RELOC_NONE)
3026         {
3027           SKIP_WHITESPACE ();
3028           if (input_line_pointer[0] != '(')
3029             as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
3030           else
3031             {
3032               int c;
3033               char *end = ++input_line_pointer;
3034               int npar = 0;
3035
3036               for (c = *end; !is_end_of_line[c]; end++, c = *end)
3037                 if (c == '(')
3038                   npar++;
3039                 else if (c == ')')
3040                   {
3041                     if (!npar)
3042                       break;
3043                     npar--;
3044                   }
3045
3046               if (c != ')')
3047                 as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
3048               else
3049                 {
3050                   *end = '\0';
3051                   expression (exp);
3052                   *end = c;
3053                   if (input_line_pointer != end)
3054                     as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
3055                   else
3056                     {
3057                       input_line_pointer++;
3058                       SKIP_WHITESPACE ();
3059                       c = *input_line_pointer;
3060                       if (! is_end_of_line[c] && c != ',')
3061                         as_bad (_("Illegal operands: garbage after %%tls_ldo()"));
3062                     }
3063                 }
3064             }
3065         }
3066     }
3067   if (nios2_tls_ldo_reloc == BFD_RELOC_NONE)
3068     expression (exp);
3069   return nios2_tls_ldo_reloc;
3070 }
3071
3072 /* Implement HANDLE_ALIGN.  */
3073 void
3074 nios2_handle_align (fragS *fragp)
3075 {
3076   /* If we are expecting to relax in the linker, then we must output a
3077      relocation to tell the linker we are aligning code.  */
3078   if (nios2_as_options.relax == relax_all
3079       && (fragp->fr_type == rs_align || fragp->fr_type == rs_align_code)
3080       && fragp->fr_address + fragp->fr_fix > 0
3081       && fragp->fr_offset > 1
3082       && now_seg != bss_section)
3083     fix_new (fragp, fragp->fr_fix, 0, &abs_symbol, fragp->fr_offset, 0,
3084              BFD_RELOC_NIOS2_ALIGN);
3085 }
3086
3087 /* Implement tc_regname_to_dw2regnum, to convert REGNAME to a DWARF-2
3088    register number.  */
3089 int
3090 nios2_regname_to_dw2regnum (char *regname)
3091 {
3092   struct nios2_reg *r = nios2_reg_lookup (regname);
3093   if (r == NULL)
3094     return -1;
3095   return r->index;
3096 }
3097
3098 /* Implement tc_cfi_frame_initial_instructions, to initialize the DWARF-2
3099    unwind information for this procedure.  */
3100 void
3101 nios2_frame_initial_instructions (void)
3102 {
3103   cfi_add_CFA_def_cfa (27, 0);
3104 }