I found that the relax failure for execute/930628-1.c is due to gas
[external/binutils.git] / gas / config / tc-sh.c
1 /* tc-sh.c -- Assemble code for the Hitachi Super-H
2    Copyright (C) 1993, 94, 95, 96, 97, 1998 Free Software Foundation.
3
4    This file is part of GAS, the GNU Assembler.
5
6    GAS is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    GAS is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GAS; see the file COPYING.  If not, write to
18    the Free Software Foundation, 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 /*
22    Written By Steve Chamberlain
23    sac@cygnus.com
24  */
25
26 #include <stdio.h>
27 #include "as.h"
28 #include "bfd.h"
29 #include "subsegs.h"
30 #define DEFINE_TABLE
31 #include "opcodes/sh-opc.h"
32 #include <ctype.h>
33 const char comment_chars[] = "!";
34 const char line_separator_chars[] = ";";
35 const char line_comment_chars[] = "!#";
36
37 static void s_uses PARAMS ((int));
38
39 static void sh_count_relocs PARAMS ((bfd *, segT, PTR));
40 static void sh_frob_section PARAMS ((bfd *, segT, PTR));
41
42 /* This table describes all the machine specific pseudo-ops the assembler
43    has to support.  The fields are:
44    pseudo-op name without dot
45    function to call to execute this pseudo-op
46    Integer arg to pass to the function
47  */
48
49 void cons ();
50 void s_align_bytes ();
51 static void s_uacons PARAMS ((int));
52
53 int shl = 0;
54
55 static void
56 little (ignore)
57      int ignore;
58 {
59   shl = 1;
60   target_big_endian = 0;
61 }
62
63 const pseudo_typeS md_pseudo_table[] =
64 {
65   {"int", cons, 4},
66   {"word", cons, 2},
67   {"form", listing_psize, 0},
68   {"little", little, 0},
69   {"heading", listing_title, 0},
70   {"import", s_ignore, 0},
71   {"page", listing_eject, 0},
72   {"program", s_ignore, 0},
73   {"uses", s_uses, 0},
74   {"uaword", s_uacons, 2},
75   {"ualong", s_uacons, 4},
76   {0, 0, 0}
77 };
78
79 /*int md_reloc_size; */
80
81 int sh_relax;           /* set if -relax seen */
82
83 /* Whether -small was seen.  */
84
85 int sh_small;
86
87 const char EXP_CHARS[] = "eE";
88
89 /* Chars that mean this number is a floating point constant */
90 /* As in 0f12.456 */
91 /* or    0d1.2345e12 */
92 const char FLT_CHARS[] = "rRsSfFdDxXpP";
93
94 #define C(a,b) ENCODE_RELAX(a,b)
95
96 #define JREG 14                 /* Register used as a temp when relaxing */
97 #define ENCODE_RELAX(what,length) (((what) << 4) + (length))
98 #define GET_WHAT(x) ((x>>4))
99
100 /* These are the three types of relaxable instrction */
101 #define COND_JUMP 1
102 #define COND_JUMP_DELAY 2
103 #define UNCOND_JUMP  3
104 #define END 4
105
106 #define UNDEF_DISP 0
107 #define COND8  1
108 #define COND12 2
109 #define COND32 3
110 #define UNCOND12 1
111 #define UNCOND32 2
112 #define UNDEF_WORD_DISP 4
113
114 #define UNCOND12 1
115 #define UNCOND32 2
116
117 /* Branch displacements are from the address of the branch plus
118    four, thus all minimum and maximum values have 4 added to them.  */
119 #define COND8_F 258
120 #define COND8_M -252
121 #define COND8_LENGTH 2
122
123 /* There is one extra instruction before the branch, so we must add
124    two more bytes to account for it.  */
125 #define COND12_F 4100
126 #define COND12_M -4090
127 #define COND12_LENGTH 6
128
129 #define COND12_DELAY_LENGTH 4
130
131 /* ??? The minimum and maximum values are wrong, but this does not matter
132    since this relocation type is not supported yet.  */
133 #define COND32_F (1<<30)
134 #define COND32_M -(1<<30)
135 #define COND32_LENGTH 14
136
137 #define UNCOND12_F 4098
138 #define UNCOND12_M -4092
139 #define UNCOND12_LENGTH 2
140
141 /* ??? The minimum and maximum values are wrong, but this does not matter
142    since this relocation type is not supported yet.  */
143 #define UNCOND32_F (1<<30)
144 #define UNCOND32_M -(1<<30)
145 #define UNCOND32_LENGTH 14
146
147 const relax_typeS md_relax_table[C (END, 0)] = {
148   { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
149   { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
150
151   { 0 },
152   /* C (COND_JUMP, COND8) */
153   { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP, COND12) },
154   /* C (COND_JUMP, COND12) */
155   { COND12_F, COND12_M, COND12_LENGTH, C (COND_JUMP, COND32), },
156   /* C (COND_JUMP, COND32) */
157   { COND32_F, COND32_M, COND32_LENGTH, 0, },
158   { 0 }, { 0 }, { 0 }, { 0 },
159   { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
160
161   { 0 },
162   /* C (COND_JUMP_DELAY, COND8) */
163   { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP_DELAY, COND12) },
164   /* C (COND_JUMP_DELAY, COND12) */
165   { COND12_F, COND12_M, COND12_DELAY_LENGTH, C (COND_JUMP_DELAY, COND32), },
166   /* C (COND_JUMP_DELAY, COND32) */
167   { COND32_F, COND32_M, COND32_LENGTH, 0, },
168   { 0 }, { 0 }, { 0 }, { 0 },
169   { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
170
171   { 0 },
172   /* C (UNCOND_JUMP, UNCOND12) */
173   { UNCOND12_F, UNCOND12_M, UNCOND12_LENGTH, C (UNCOND_JUMP, UNCOND32), },
174   /* C (UNCOND_JUMP, UNCOND32) */
175   { UNCOND32_F, UNCOND32_M, UNCOND32_LENGTH, 0, },
176   { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
177   { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
178 };
179
180 static struct hash_control *opcode_hash_control;        /* Opcode mnemonics */
181
182 /*
183    This function is called once, at assembler startup time.  This should
184    set up all the tables, etc that the MD part of the assembler needs
185  */
186
187 void
188 md_begin ()
189 {
190   sh_opcode_info *opcode;
191   char *prev_name = "";
192
193   if (! shl)
194     target_big_endian = 1;
195
196   opcode_hash_control = hash_new ();
197
198   /* Insert unique names into hash table */
199   for (opcode = sh_table; opcode->name; opcode++)
200     {
201       if (strcmp (prev_name, opcode->name))
202         {
203           prev_name = opcode->name;
204           hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
205         }
206       else
207         {
208           /* Make all the opcodes with the same name point to the same
209              string */
210           opcode->name = prev_name;
211         }
212     }
213 }
214
215 static int reg_m;
216 static int reg_n;
217 static int reg_b;
218
219 static expressionS immediate;   /* absolute expression */
220
221 typedef struct
222   {
223     sh_arg_type type;
224     int reg;
225   }
226
227 sh_operand_info;
228
229 /* try and parse a reg name, returns number of chars consumed */
230 static int
231 parse_reg (src, mode, reg)
232      char *src;
233      int *mode;
234      int *reg;
235 {
236   /* We use !isalnum for the next character after the register name, to
237      make sure that we won't accidentally recognize a symbol name such as
238      'sram' as being a reference to the register 'sr'.  */
239
240   if (src[0] == 'r')
241     {
242       if (src[1] >= '0' && src[1] <= '7' && strncmp(&src[2], "_bank", 5) == 0
243           && ! isalnum ((unsigned char) src[7]))
244         {
245           *mode = A_REG_B;
246           *reg  = (src[1] - '0');
247           return 7;
248         }
249     }
250
251   if (src[0] == 'r')
252     {
253       if (src[1] == '1')
254         {
255           if (src[2] >= '0' && src[2] <= '5'
256               && ! isalnum ((unsigned char) src[3]))
257             {
258               *mode = A_REG_N;
259               *reg = 10 + src[2] - '0';
260               return 3;
261             }
262         }
263       if (src[1] >= '0' && src[1] <= '9'
264           && ! isalnum ((unsigned char) src[2]))
265         {
266           *mode = A_REG_N;
267           *reg = (src[1] - '0');
268           return 2;
269         }
270     }
271
272   if (src[0] == 's'
273       && src[1] == 's'
274       && src[2] == 'r' && ! isalnum ((unsigned char) src[3]))
275     {
276       *mode = A_SSR;
277       return 3;
278     }
279
280   if (src[0] == 's' && src[1] == 'p' && src[2] == 'c'
281       && ! isalnum ((unsigned char) src[3]))
282     {
283       *mode = A_SPC;
284       return 3;
285     }
286
287   if (src[0] == 's' && src[1] == 'g' && src[2] == 'r'
288       && ! isalnum ((unsigned char) src[3]))
289     {
290       *mode = A_SGR;
291       return 3;
292     }
293
294   if (src[0] == 'd' && src[1] == 'b' && src[2] == 'r'
295       && ! isalnum ((unsigned char) src[3]))
296     {
297       *mode = A_DBR;
298       return 3;
299     }
300
301   if (src[0] == 's' && src[1] == 'r' && ! isalnum ((unsigned char) src[2]))
302     {
303       *mode = A_SR;
304       return 2;
305     }
306
307   if (src[0] == 's' && src[1] == 'p' && ! isalnum ((unsigned char) src[2]))
308     {
309       *mode = A_REG_N;
310       *reg = 15;
311       return 2;
312     }
313
314   if (src[0] == 'p' && src[1] == 'r' && ! isalnum ((unsigned char) src[2]))
315     {
316       *mode = A_PR;
317       return 2;
318     }
319   if (src[0] == 'p' && src[1] == 'c' && ! isalnum ((unsigned char) src[2]))
320     {
321       *mode = A_DISP_PC;
322       return 2;
323     }
324   if (src[0] == 'g' && src[1] == 'b' && src[2] == 'r'
325       && ! isalnum ((unsigned char) src[3]))
326     {
327       *mode = A_GBR;
328       return 3;
329     }
330   if (src[0] == 'v' && src[1] == 'b' && src[2] == 'r'
331       && ! isalnum ((unsigned char) src[3]))
332     {
333       *mode = A_VBR;
334       return 3;
335     }
336
337   if (src[0] == 'm' && src[1] == 'a' && src[2] == 'c'
338       && ! isalnum ((unsigned char) src[4]))
339     {
340       if (src[3] == 'l')
341         {
342           *mode = A_MACL;
343           return 4;
344         }
345       if (src[3] == 'h')
346         {
347           *mode = A_MACH;
348           return 4;
349         }
350     }
351   if (src[0] == 'f' && src[1] == 'r')
352     {
353       if (src[2] == '1')
354         {
355           if (src[3] >= '0' && src[3] <= '5'
356               && ! isalnum ((unsigned char) src[4]))
357             {
358               *mode = F_REG_N;
359               *reg = 10 + src[3] - '0';
360               return 4;
361             }
362         }
363       if (src[2] >= '0' && src[2] <= '9'
364           && ! isalnum ((unsigned char) src[3]))
365         {
366           *mode = F_REG_N;
367           *reg = (src[2] - '0');
368           return 3;
369         }
370     }
371   if (src[0] == 'd' && src[1] == 'r')
372     {
373       if (src[2] == '1')
374         {
375           if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
376               && ! isalnum ((unsigned char) src[4]))
377             {
378               *mode = D_REG_N;
379               *reg = 10 + src[3] - '0';
380               return 4;
381             }
382         }
383       if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
384           && ! isalnum ((unsigned char) src[3]))
385         {
386           *mode = D_REG_N;
387           *reg = (src[2] - '0');
388           return 3;
389         }
390     }
391   if (src[0] == 'x' && src[1] == 'd')
392     {
393       if (src[2] == '1')
394         {
395           if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
396               && ! isalnum ((unsigned char) src[4]))
397             {
398               *mode = X_REG_N;
399               *reg = 11 + src[3] - '0';
400               return 4;
401             }
402         }
403       if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
404           && ! isalnum ((unsigned char) src[3]))
405         {
406           *mode = X_REG_N;
407           *reg = (src[2] - '0') + 1;
408           return 3;
409         }
410     }
411   if (src[0] == 'f' && src[1] == 'v')
412     {
413       if (src[2] == '1'&& src[3] == '2' && ! isalnum ((unsigned char) src[4]))
414         {
415           *mode = V_REG_N;
416           *reg = 12;
417           return 4;
418         }
419       if ((src[2] == '0' || src[2] == '4' || src[2] == '8')
420           && ! isalnum ((unsigned char) src[3]))
421         {
422           *mode = V_REG_N;
423           *reg = (src[2] - '0');
424           return 3;
425         }
426     }
427   if (src[0] == 'f' && src[1] == 'p' && src[2] == 'u' && src[3] == 'l'
428       && ! isalnum ((unsigned char) src[4]))
429     {
430       *mode = FPUL_N;
431       return 4;
432     }
433
434   if (src[0] == 'f' && src[1] == 'p' && src[2] == 's' && src[3] == 'c'
435       && src[4] == 'r' && ! isalnum ((unsigned char) src[5]))
436     {
437       *mode = FPSCR_N;
438       return 5;
439     }
440
441   if (src[0] == 'x' && src[1] == 'm' && src[2] == 't' && src[3] == 'r'
442       && src[4] == 'x' && ! isalnum ((unsigned char) src[5]))
443     {
444       *mode = XMTRX_M4;
445       return 5;
446     }
447
448   return 0;
449 }
450
451 static symbolS *dot()
452 {
453   const char *fake;
454
455   /* JF: '.' is pseudo symbol with value of current location
456      in current segment.  */
457   fake = FAKE_LABEL_NAME;
458   return  symbol_new (fake,
459                       now_seg,
460                       (valueT) frag_now_fix (),
461                       frag_now);
462
463 }
464
465
466 static
467 char *
468 parse_exp (s)
469      char *s;
470 {
471   char *save;
472   char *new;
473
474   save = input_line_pointer;
475   input_line_pointer = s;
476   expression (&immediate);
477   if (immediate.X_op == O_absent)
478     as_bad (_("missing operand"));
479   new = input_line_pointer;
480   input_line_pointer = save;
481   return new;
482 }
483
484
485 /* The many forms of operand:
486
487    Rn                   Register direct
488    @Rn                  Register indirect
489    @Rn+                 Autoincrement
490    @-Rn                 Autodecrement
491    @(disp:4,Rn)
492    @(disp:8,GBR)
493    @(disp:8,PC)
494
495    @(R0,Rn)
496    @(R0,GBR)
497
498    disp:8
499    disp:12
500    #imm8
501    pr, gbr, vbr, macl, mach
502
503  */
504
505 static
506 char *
507 parse_at (src, op)
508      char *src;
509      sh_operand_info *op;
510 {
511   int len;
512   int mode;
513   src++;
514   if (src[0] == '-')
515     {
516       /* Must be predecrement */
517       src++;
518
519       len = parse_reg (src, &mode, &(op->reg));
520       if (mode != A_REG_N)
521         as_bad (_("illegal register after @-"));
522
523       op->type = A_DEC_N;
524       src += len;
525     }
526   else if (src[0] == '(')
527     {
528       /* Could be @(disp, rn), @(disp, gbr), @(disp, pc),  @(r0, gbr) or
529          @(r0, rn) */
530       src++;
531       len = parse_reg (src, &mode, &(op->reg));
532       if (len && mode == A_REG_N)
533         {
534           src += len;
535           if (op->reg != 0)
536             {
537               as_bad (_("must be @(r0,...)"));
538             }
539           if (src[0] == ',')
540             src++;
541           /* Now can be rn or gbr */
542           len = parse_reg (src, &mode, &(op->reg));
543           if (mode == A_GBR)
544             {
545               op->type = A_R0_GBR;
546             }
547           else if (mode == A_REG_N)
548             {
549               op->type = A_IND_R0_REG_N;
550             }
551           else
552             {
553               as_bad (_("syntax error in @(r0,...)"));
554             }
555         }
556       else
557         {
558           /* Must be an @(disp,.. thing) */
559           src = parse_exp (src);
560           if (src[0] == ',')
561             src++;
562           /* Now can be rn, gbr or pc */
563           len = parse_reg (src, &mode, &op->reg);
564           if (len)
565             {
566               if (mode == A_REG_N)
567                 {
568                   op->type = A_DISP_REG_N;
569                 }
570               else if (mode == A_GBR)
571                 {
572                   op->type = A_DISP_GBR;
573                 }
574               else if (mode == A_DISP_PC)
575                 {
576                   /* Turn a plain @(4,pc) into @(.+4,pc) */
577                   if (immediate.X_op == O_constant) { 
578                     immediate.X_add_symbol = dot();
579                     immediate.X_op = O_symbol;
580                   }
581                   op->type = A_DISP_PC;
582                 }
583               else
584                 {
585                   as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
586                 }
587             }
588           else
589             {
590               as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
591             }
592         }
593       src += len;
594       if (src[0] != ')')
595         as_bad (_("expecting )"));
596       else
597         src++;
598     }
599   else
600     {
601       src += parse_reg (src, &mode, &(op->reg));
602       if (mode != A_REG_N)
603         {
604           as_bad (_("illegal register after @"));
605         }
606       if (src[0] == '+')
607         {
608           op->type = A_INC_N;
609           src++;
610         }
611       else
612         {
613           op->type = A_IND_N;
614         }
615     }
616   return src;
617 }
618
619 static void
620 get_operand (ptr, op)
621      char **ptr;
622      sh_operand_info *op;
623 {
624   char *src = *ptr;
625   int mode = -1;
626   unsigned int len;
627
628   if (src[0] == '#')
629     {
630       src++;
631       *ptr = parse_exp (src);
632       op->type = A_IMM;
633       return;
634     }
635
636   else if (src[0] == '@')
637     {
638       *ptr = parse_at (src, op);
639       return;
640     }
641   len = parse_reg (src, &mode, &(op->reg));
642   if (len)
643     {
644       *ptr = src + len;
645       op->type = mode;
646       return;
647     }
648   else
649     {
650       /* Not a reg, the only thing left is a displacement */
651       *ptr = parse_exp (src);
652       op->type = A_DISP_PC;
653       return;
654     }
655 }
656
657 static
658 char *
659 get_operands (info, args, operand)
660      sh_opcode_info *info;
661      char *args;
662      sh_operand_info *operand;
663
664 {
665   char *ptr = args;
666   if (info->arg[0])
667     {
668       ptr++;
669
670       get_operand (&ptr, operand + 0);
671       if (info->arg[1])
672         {
673           if (*ptr == ',')
674             {
675               ptr++;
676             }
677           get_operand (&ptr, operand + 1);
678           if (info->arg[2])
679             {
680               if (*ptr == ',')
681                 {
682                   ptr++;
683                 }
684               get_operand (&ptr, operand + 2);
685             }
686           else
687             {
688               operand[2].type = 0;
689             }
690         }
691       else
692         {
693           operand[1].type = 0;
694           operand[2].type = 0;
695         }
696     }
697   else
698     {
699       operand[0].type = 0;
700       operand[1].type = 0;
701       operand[2].type = 0;
702     }
703   return ptr;
704 }
705
706 /* Passed a pointer to a list of opcodes which use different
707    addressing modes, return the opcode which matches the opcodes
708    provided
709  */
710
711 static
712 sh_opcode_info *
713 get_specific (opcode, operands)
714      sh_opcode_info *opcode;
715      sh_operand_info *operands;
716 {
717   sh_opcode_info *this_try = opcode;
718   char *name = opcode->name;
719   int n = 0;
720   while (opcode->name)
721     {
722       this_try = opcode++;
723       if (this_try->name != name)
724         {
725           /* We've looked so far down the table that we've run out of
726              opcodes with the same name */
727           return 0;
728         }
729       /* look at both operands needed by the opcodes and provided by
730          the user - since an arg test will often fail on the same arg
731          again and again, we'll try and test the last failing arg the
732          first on each opcode try */
733
734       for (n = 0; this_try->arg[n]; n++)
735         {
736           sh_operand_info *user = operands + n;
737           sh_arg_type arg = this_try->arg[n];
738           switch (arg)
739             {
740             case A_IMM:
741             case A_BDISP12:
742             case A_BDISP8:
743             case A_DISP_GBR:
744             case A_DISP_PC:
745             case A_MACH:
746             case A_PR:
747             case A_MACL:
748               if (user->type != arg)
749                 goto fail;
750               break;
751             case A_R0:
752               /* opcode needs r0 */
753               if (user->type != A_REG_N || user->reg != 0)
754                 goto fail;
755               break;
756             case A_R0_GBR:
757               if (user->type != A_R0_GBR || user->reg != 0)
758                 goto fail;
759               break;
760             case F_FR0:
761               if (user->type != F_REG_N || user->reg != 0)
762                 goto fail;
763               break;
764
765             case A_REG_N:
766             case A_INC_N:
767             case A_DEC_N:
768             case A_IND_N:
769             case A_IND_R0_REG_N:
770             case A_DISP_REG_N:
771             case F_REG_N:
772             case D_REG_N:
773             case X_REG_N:
774             case V_REG_N:
775             case FPUL_N:
776             case FPSCR_N:
777               /* Opcode needs rn */
778               if (user->type != arg)
779                 goto fail;
780               reg_n = user->reg;
781               break;
782             case FD_REG_N:
783               if (user->type != F_REG_N && user->type != D_REG_N)
784                 goto fail;
785               reg_n = user->reg;
786               break;
787             case DX_REG_N:
788               if (user->type != D_REG_N && user->type != X_REG_N)
789                 goto fail;
790               reg_n = user->reg;
791               break;
792             case A_GBR:
793             case A_SR:
794             case A_VBR:
795             case A_SSR:
796             case A_SPC:
797             case A_SGR:
798             case A_DBR:
799               if (user->type != arg)
800                 goto fail;
801               break;
802
803             case A_REG_B:
804               if (user->type != arg)
805                 goto fail;
806               reg_b = user->reg;
807               break;
808
809             case A_REG_M:
810             case A_INC_M:
811             case A_DEC_M:
812             case A_IND_M:
813             case A_IND_R0_REG_M:
814             case A_DISP_REG_M:
815               /* Opcode needs rn */
816               if (user->type != arg - A_REG_M + A_REG_N)
817                 goto fail;
818               reg_m = user->reg;
819               break;
820
821             case F_REG_M:
822             case D_REG_M:
823             case X_REG_M:
824             case V_REG_M:
825             case FPUL_M:
826             case FPSCR_M:
827               /* Opcode needs rn */
828               if (user->type != arg - F_REG_M + F_REG_N)
829                 goto fail;
830               reg_m = user->reg;
831               break;
832             case DX_REG_M:
833               if (user->type != D_REG_N && user->type != X_REG_N)
834                 goto fail;
835               reg_m = user->reg;
836               break;
837             case XMTRX_M4:
838               if (user->type != XMTRX_M4)
839                 goto fail;
840               reg_m = 4;
841               break;
842         
843             default:
844               printf (_("unhandled %d\n"), arg);
845               goto fail;
846             }
847         }
848       return this_try;
849     fail:;
850     }
851
852   return 0;
853 }
854
855 int
856 check (operand, low, high)
857      expressionS *operand;
858      int low;
859      int high;
860 {
861   if (operand->X_op != O_constant
862       || operand->X_add_number < low
863       || operand->X_add_number > high)
864     {
865       as_bad (_("operand must be absolute in range %d..%d"), low, high);
866     }
867   return operand->X_add_number;
868 }
869
870
871 static void
872 insert (where, how, pcrel)
873      char *where;
874      int how;
875      int pcrel;
876 {
877   fix_new_exp (frag_now,
878                where - frag_now->fr_literal,
879                2,
880                &immediate,
881                pcrel,
882                how);
883 }
884
885 static void
886 build_relax (opcode)
887      sh_opcode_info *opcode;
888 {
889   int high_byte = target_big_endian ? 0 : 1;
890   char *p;
891
892   if (opcode->arg[0] == A_BDISP8)
893     {
894       int what = (opcode->nibbles[1] & 4) ? COND_JUMP_DELAY : COND_JUMP;
895       p = frag_var (rs_machine_dependent,
896                     md_relax_table[C (what, COND32)].rlx_length,
897                     md_relax_table[C (what, COND8)].rlx_length,
898                     C (what, 0),
899                     immediate.X_add_symbol,
900                     immediate.X_add_number,
901                     0);
902       p[high_byte] = (opcode->nibbles[0] << 4) | (opcode->nibbles[1]);
903     }
904   else if (opcode->arg[0] == A_BDISP12)
905     {
906       p = frag_var (rs_machine_dependent,
907                     md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length,
908                     md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length,
909                     C (UNCOND_JUMP, 0),
910                     immediate.X_add_symbol,
911                     immediate.X_add_number,
912                     0);
913       p[high_byte] = (opcode->nibbles[0] << 4);
914     }
915
916 }
917
918 /* Now we know what sort of opcodes it is, lets build the bytes -
919  */
920 static void
921 build_Mytes (opcode, operand)
922      sh_opcode_info *opcode;
923      sh_operand_info *operand;
924
925 {
926   int index;
927   char nbuf[4];
928   char *output = frag_more (2);
929   int low_byte = target_big_endian ? 1 : 0;
930   nbuf[0] = 0;
931   nbuf[1] = 0;
932   nbuf[2] = 0;
933   nbuf[3] = 0;
934
935   for (index = 0; index < 4; index++)
936     {
937       sh_nibble_type i = opcode->nibbles[index];
938       if (i < 16)
939         {
940           nbuf[index] = i;
941         }
942       else
943         {
944           switch (i)
945             {
946             case REG_N:
947               nbuf[index] = reg_n;
948               break;
949             case REG_M:
950               nbuf[index] = reg_m;
951               break;
952             case REG_NM:
953               nbuf[index] = reg_n | (reg_m >> 2);
954               break;
955             case REG_B:
956               nbuf[index] = reg_b | 0x08;
957               break;
958             case DISP_4:
959               insert (output + low_byte, BFD_RELOC_SH_IMM4, 0);
960               break;
961             case IMM_4BY4:
962               insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0);
963               break;
964             case IMM_4BY2:
965               insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0);
966               break;
967             case IMM_4:
968               insert (output + low_byte, BFD_RELOC_SH_IMM4, 0);
969               break;
970             case IMM_8BY4:
971               insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0);
972               break;
973             case IMM_8BY2:
974               insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0);
975               break;
976             case IMM_8:
977               insert (output + low_byte, BFD_RELOC_SH_IMM8, 0);
978               break;
979             case PCRELIMM_8BY4:
980               insert (output, BFD_RELOC_SH_PCRELIMM8BY4, 1);
981               break;
982             case PCRELIMM_8BY2:
983               insert (output, BFD_RELOC_SH_PCRELIMM8BY2, 1);
984               break;
985             default:
986               printf (_("failed for %d\n"), i);
987             }
988         }
989     }
990   if (! target_big_endian) {
991     output[1] = (nbuf[0] << 4) | (nbuf[1]);
992     output[0] = (nbuf[2] << 4) | (nbuf[3]);
993   }
994   else {
995     output[0] = (nbuf[0] << 4) | (nbuf[1]);
996     output[1] = (nbuf[2] << 4) | (nbuf[3]);
997   }
998 }
999
1000 /* This is the guts of the machine-dependent assembler.  STR points to a
1001    machine dependent instruction.  This function is supposed to emit
1002    the frags/bytes it assembles to.
1003  */
1004
1005 void
1006 md_assemble (str)
1007      char *str;
1008 {
1009   unsigned char *op_start;
1010   unsigned char *op_end;
1011   sh_operand_info operand[3];
1012   sh_opcode_info *opcode;
1013   char name[20];
1014   int nlen = 0;
1015   /* Drop leading whitespace */
1016   while (*str == ' ')
1017     str++;
1018
1019   /* find the op code end */
1020   for (op_start = op_end = (unsigned char *) (str);
1021        *op_end
1022        && nlen < 20
1023        && !is_end_of_line[*op_end] && *op_end != ' ';
1024        op_end++)
1025     {
1026       name[nlen] = op_start[nlen];
1027       nlen++;
1028     }
1029   name[nlen] = 0;
1030
1031   if (nlen == 0)
1032     {
1033       as_bad (_("can't find opcode "));
1034     }
1035
1036   opcode = (sh_opcode_info *) hash_find (opcode_hash_control, name);
1037
1038   if (opcode == NULL)
1039     {
1040       as_bad (_("unknown opcode"));
1041       return;
1042     }
1043
1044   if (sh_relax
1045       && ! seg_info (now_seg)->tc_segment_info_data.in_code)
1046     {
1047       /* Output a CODE reloc to tell the linker that the following
1048          bytes are instructions, not data.  */
1049       fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
1050                BFD_RELOC_SH_CODE);
1051       seg_info (now_seg)->tc_segment_info_data.in_code = 1;
1052     }
1053
1054   if (opcode->arg[0] == A_BDISP12
1055       || opcode->arg[0] == A_BDISP8)
1056     {
1057       parse_exp (op_end + 1);
1058       build_relax (opcode);
1059     }
1060   else
1061     {
1062       if (opcode->arg[0] != A_END)
1063         {
1064           get_operands (opcode, op_end, operand);
1065         }
1066       opcode = get_specific (opcode, operand);
1067
1068       if (opcode == 0)
1069         {
1070           /* Couldn't find an opcode which matched the operands */
1071           char *where = frag_more (2);
1072
1073           where[0] = 0x0;
1074           where[1] = 0x0;
1075           as_bad (_("invalid operands for opcode"));
1076           return;
1077         }
1078
1079       build_Mytes (opcode, operand);
1080     }
1081
1082 }
1083
1084 /* This routine is called each time a label definition is seen.  It
1085    emits a BFD_RELOC_SH_LABEL reloc if necessary.  */
1086
1087 void
1088 sh_frob_label ()
1089 {
1090   static fragS *last_label_frag;
1091   static int last_label_offset;
1092
1093   if (sh_relax
1094       && seg_info (now_seg)->tc_segment_info_data.in_code)
1095     {
1096       int offset;
1097
1098       offset = frag_now_fix ();
1099       if (frag_now != last_label_frag
1100           || offset != last_label_offset)
1101         {       
1102           fix_new (frag_now, offset, 2, &abs_symbol, 0, 0, BFD_RELOC_SH_LABEL);
1103           last_label_frag = frag_now;
1104           last_label_offset = offset;
1105         }
1106     }
1107 }
1108
1109 /* This routine is called when the assembler is about to output some
1110    data.  It emits a BFD_RELOC_SH_DATA reloc if necessary.  */
1111
1112 void
1113 sh_flush_pending_output ()
1114 {
1115   if (sh_relax
1116       && seg_info (now_seg)->tc_segment_info_data.in_code)
1117     {
1118       fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
1119                BFD_RELOC_SH_DATA);
1120       seg_info (now_seg)->tc_segment_info_data.in_code = 0;
1121     }
1122 }
1123
1124 symbolS *
1125 DEFUN (md_undefined_symbol, (name),
1126        char *name)
1127 {
1128   return 0;
1129 }
1130
1131 #ifdef OBJ_COFF
1132
1133 void
1134 DEFUN (tc_crawl_symbol_chain, (headers),
1135        object_headers * headers)
1136 {
1137   printf (_("call to tc_crawl_symbol_chain \n"));
1138 }
1139
1140 void
1141 DEFUN (tc_headers_hook, (headers),
1142        object_headers * headers)
1143 {
1144   printf (_("call to tc_headers_hook \n"));
1145 }
1146
1147 #endif
1148
1149 /* Various routines to kill one day */
1150 /* Equal to MAX_PRECISION in atof-ieee.c */
1151 #define MAX_LITTLENUMS 6
1152
1153 /* Turn a string in input_line_pointer into a floating point constant of type
1154    type, and store the appropriate bytes in *litP.  The number of LITTLENUMS
1155    emitted is stored in *sizeP .  An error message is returned, or NULL on OK.
1156  */
1157 char *
1158 md_atof (type, litP, sizeP)
1159      int type;
1160      char *litP;
1161      int *sizeP;
1162 {
1163   int prec;
1164   LITTLENUM_TYPE words[4];
1165   char *t;
1166   int i;
1167
1168   switch (type)
1169     {
1170     case 'f':
1171       prec = 2;
1172       break;
1173
1174     case 'd':
1175       prec = 4;
1176       break;
1177
1178     default:
1179       *sizeP = 0;
1180       return _("bad call to md_atof");
1181     }
1182
1183   t = atof_ieee (input_line_pointer, type, words);
1184   if (t)
1185     input_line_pointer = t;
1186
1187   *sizeP = prec * 2;
1188
1189   if (! target_big_endian)
1190     {
1191       for (i = prec - 1; i >= 0; i--)
1192         {
1193           md_number_to_chars (litP, (valueT) words[i], 2);
1194           litP += 2;
1195         }
1196     }
1197   else
1198     {
1199       for (i = 0; i < prec; i++)
1200         {
1201           md_number_to_chars (litP, (valueT) words[i], 2);
1202           litP += 2;
1203         }
1204     }
1205      
1206   return NULL;
1207 }
1208
1209 /* Handle the .uses pseudo-op.  This pseudo-op is used just before a
1210    call instruction.  It refers to a label of the instruction which
1211    loads the register which the call uses.  We use it to generate a
1212    special reloc for the linker.  */
1213
1214 static void
1215 s_uses (ignore)
1216      int ignore;
1217 {
1218   expressionS ex;
1219
1220   if (! sh_relax)
1221     as_warn (_(".uses pseudo-op seen when not relaxing"));
1222
1223   expression (&ex);
1224
1225   if (ex.X_op != O_symbol || ex.X_add_number != 0)
1226     {
1227       as_bad (_("bad .uses format"));
1228       ignore_rest_of_line ();
1229       return;
1230     }
1231
1232   fix_new_exp (frag_now, frag_now_fix (), 2, &ex, 1, BFD_RELOC_SH_USES);
1233
1234   demand_empty_rest_of_line ();
1235 }
1236 \f
1237 CONST char *md_shortopts = "";
1238 struct option md_longopts[] = {
1239
1240 #define OPTION_RELAX  (OPTION_MD_BASE)
1241 #define OPTION_LITTLE (OPTION_MD_BASE + 1)
1242 #define OPTION_SMALL (OPTION_LITTLE + 1)
1243
1244   {"relax", no_argument, NULL, OPTION_RELAX},
1245   {"little", no_argument, NULL, OPTION_LITTLE},
1246   {"small", no_argument, NULL, OPTION_SMALL},
1247   {NULL, no_argument, NULL, 0}
1248 };
1249 size_t md_longopts_size = sizeof(md_longopts);
1250
1251 int
1252 md_parse_option (c, arg)
1253      int c;
1254      char *arg;
1255 {
1256   switch (c)
1257     {
1258     case OPTION_RELAX:
1259       sh_relax = 1;
1260       break;
1261
1262     case OPTION_LITTLE:
1263       shl = 1;
1264       target_big_endian = 0;
1265       break;
1266
1267     case OPTION_SMALL:
1268       sh_small = 1;
1269       break;
1270
1271     default:
1272       return 0;
1273     }
1274
1275   return 1;
1276 }
1277
1278 void
1279 md_show_usage (stream)
1280      FILE *stream;
1281 {
1282   fprintf(stream, _("\
1283 SH options:\n\
1284 -little                 generate little endian code\n\
1285 -relax                  alter jump instructions for long displacements\n\
1286 -small                  align sections to 4 byte boundaries, not 16\n"));
1287 }
1288 \f
1289 void
1290 tc_Nout_fix_to_chars ()
1291 {
1292   printf (_("call to tc_Nout_fix_to_chars \n"));
1293   abort ();
1294 }
1295
1296 /* This struct is used to pass arguments to sh_count_relocs through
1297    bfd_map_over_sections.  */
1298
1299 struct sh_count_relocs
1300 {
1301   /* Symbol we are looking for.  */
1302   symbolS *sym;
1303   /* Count of relocs found.  */
1304   int count;
1305 };
1306
1307 /* Count the number of fixups in a section which refer to a particular
1308    symbol.  When using BFD_ASSEMBLER, this is called via
1309    bfd_map_over_sections.  */
1310
1311 /*ARGSUSED*/
1312 static void
1313 sh_count_relocs (abfd, sec, data)
1314      bfd *abfd;
1315      segT sec;
1316      PTR data;
1317 {
1318   struct sh_count_relocs *info = (struct sh_count_relocs *) data;
1319   segment_info_type *seginfo;
1320   symbolS *sym;
1321   fixS *fix;
1322
1323   seginfo = seg_info (sec);
1324   if (seginfo == NULL)
1325     return;
1326
1327   sym = info->sym;
1328   for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
1329     {
1330       if (fix->fx_addsy == sym)
1331         {
1332           ++info->count;
1333           fix->fx_tcbit = 1;
1334         }
1335     }
1336 }
1337
1338 /* Handle the count relocs for a particular section.  When using
1339    BFD_ASSEMBLER, this is called via bfd_map_over_sections.  */
1340
1341 /*ARGSUSED*/
1342 static void
1343 sh_frob_section (abfd, sec, ignore)
1344      bfd *abfd;
1345      segT sec;
1346      PTR ignore;
1347 {
1348   segment_info_type *seginfo;
1349   fixS *fix;
1350
1351   seginfo = seg_info (sec);
1352   if (seginfo == NULL)
1353     return;
1354
1355   for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
1356     {
1357       symbolS *sym;
1358       bfd_vma val;
1359       fixS *fscan;
1360       struct sh_count_relocs info;
1361
1362       if (fix->fx_r_type != BFD_RELOC_SH_USES)
1363         continue;
1364
1365       /* The BFD_RELOC_SH_USES reloc should refer to a defined local
1366          symbol in the same section.  */
1367       sym = fix->fx_addsy;
1368       if (sym == NULL
1369           || fix->fx_subsy != NULL
1370           || fix->fx_addnumber != 0
1371           || S_GET_SEGMENT (sym) != sec
1372 #if ! defined (BFD_ASSEMBLER) && defined (OBJ_COFF)
1373           || S_GET_STORAGE_CLASS (sym) == C_EXT
1374 #endif
1375           || S_IS_EXTERNAL (sym))
1376         {
1377           as_warn_where (fix->fx_file, fix->fx_line,
1378                          _(".uses does not refer to a local symbol in the same section"));
1379           continue;
1380         }
1381
1382       /* Look through the fixups again, this time looking for one
1383          at the same location as sym.  */
1384       val = S_GET_VALUE (sym);
1385       for (fscan = seginfo->fix_root;
1386            fscan != NULL;
1387            fscan = fscan->fx_next)
1388         if (val == fscan->fx_frag->fr_address + fscan->fx_where
1389             && fscan->fx_r_type != BFD_RELOC_SH_ALIGN
1390             && fscan->fx_r_type != BFD_RELOC_SH_CODE
1391             && fscan->fx_r_type != BFD_RELOC_SH_DATA
1392             && fscan->fx_r_type != BFD_RELOC_SH_LABEL)
1393           break;
1394       if (fscan == NULL)
1395         {
1396           as_warn_where (fix->fx_file, fix->fx_line,
1397                          _("can't find fixup pointed to by .uses"));
1398           continue;
1399         }
1400
1401       if (fscan->fx_tcbit)
1402         {
1403           /* We've already done this one.  */
1404           continue;
1405         }
1406
1407       /* fscan should also be a fixup to a local symbol in the same
1408          section.  */
1409       sym = fscan->fx_addsy;
1410       if (sym == NULL
1411           || fscan->fx_subsy != NULL
1412           || fscan->fx_addnumber != 0
1413           || S_GET_SEGMENT (sym) != sec
1414 #if ! defined (BFD_ASSEMBLER) && defined (OBJ_COFF)
1415           || S_GET_STORAGE_CLASS (sym) == C_EXT
1416 #endif
1417           || S_IS_EXTERNAL (sym))
1418         {
1419           as_warn_where (fix->fx_file, fix->fx_line,
1420                          _(".uses target does not refer to a local symbol in the same section"));
1421           continue;
1422         }
1423
1424       /* Now we look through all the fixups of all the sections,
1425          counting the number of times we find a reference to sym.  */
1426       info.sym = sym;
1427       info.count = 0;
1428 #ifdef BFD_ASSEMBLER
1429       bfd_map_over_sections (stdoutput, sh_count_relocs, (PTR) &info);
1430 #else
1431       {
1432         int iscan;
1433
1434         for (iscan = SEG_E0; iscan < SEG_UNKNOWN; iscan++)
1435           sh_count_relocs ((bfd *) NULL, iscan, (PTR) &info);
1436       }
1437 #endif
1438
1439       if (info.count < 1)
1440         abort ();
1441
1442       /* Generate a BFD_RELOC_SH_COUNT fixup at the location of sym.
1443          We have already adjusted the value of sym to include the
1444          fragment address, so we undo that adjustment here.  */
1445       subseg_change (sec, 0);
1446       fix_new (sym->sy_frag, S_GET_VALUE (sym) - sym->sy_frag->fr_address,
1447                4, &abs_symbol, info.count, 0, BFD_RELOC_SH_COUNT);
1448     }
1449 }
1450
1451 /* This function is called after the symbol table has been completed,
1452    but before the relocs or section contents have been written out.
1453    If we have seen any .uses pseudo-ops, they point to an instruction
1454    which loads a register with the address of a function.  We look
1455    through the fixups to find where the function address is being
1456    loaded from.  We then generate a COUNT reloc giving the number of
1457    times that function address is referred to.  The linker uses this
1458    information when doing relaxing, to decide when it can eliminate
1459    the stored function address entirely.  */
1460
1461 void
1462 sh_frob_file ()
1463 {
1464   if (! sh_relax)
1465     return;
1466
1467 #ifdef BFD_ASSEMBLER
1468   bfd_map_over_sections (stdoutput, sh_frob_section, (PTR) NULL);
1469 #else
1470   {
1471     int iseg;
1472
1473     for (iseg = SEG_E0; iseg < SEG_UNKNOWN; iseg++)
1474       sh_frob_section ((bfd *) NULL, iseg, (PTR) NULL);
1475   }
1476 #endif
1477 }
1478
1479 /* Called after relaxing.  Set the correct sizes of the fragments, and
1480    create relocs so that md_apply_fix will fill in the correct values.  */
1481
1482 void
1483 md_convert_frag (headers, seg, fragP)
1484 #ifdef BFD_ASSEMBLER
1485      bfd *headers;
1486 #else
1487      object_headers *headers;
1488 #endif
1489      segT seg;
1490      fragS *fragP;
1491 {
1492   int donerelax = 0;
1493
1494   switch (fragP->fr_subtype)
1495     {
1496     case C (COND_JUMP, COND8):
1497     case C (COND_JUMP_DELAY, COND8):
1498       subseg_change (seg, 0);
1499       fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
1500                1, BFD_RELOC_SH_PCDISP8BY2);
1501       fragP->fr_fix += 2;
1502       fragP->fr_var = 0;
1503       break;
1504
1505     case C (UNCOND_JUMP, UNCOND12):
1506       subseg_change (seg, 0);
1507       fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
1508                1, BFD_RELOC_SH_PCDISP12BY2);
1509       fragP->fr_fix += 2;
1510       fragP->fr_var = 0;
1511       break;
1512
1513     case C (UNCOND_JUMP, UNCOND32):
1514     case C (UNCOND_JUMP, UNDEF_WORD_DISP):
1515       if (fragP->fr_symbol == NULL)
1516         as_bad (_("at 0x%lx, displacement overflows 12-bit field"),
1517                 (unsigned long) fragP->fr_address);
1518       else if (S_IS_DEFINED (fragP->fr_symbol))
1519         as_bad (_("at 0x%lx, displacement to defined symbol %s overflows 12-bit field"),
1520                 (unsigned long) fragP->fr_address,              
1521                 S_GET_NAME (fragP->fr_symbol));
1522       else
1523         as_bad (_("at 0x%lx, displacement to undefined symbol %s overflows 12-bit field"),
1524                 (unsigned long) fragP->fr_address,              
1525                 S_GET_NAME (fragP->fr_symbol));
1526
1527 #if 0                           /* This code works, but generates poor code and the compiler
1528                                    should never produce a sequence that requires it to be used.  */
1529
1530       /* A jump wont fit in 12 bits, make code which looks like
1531          bra foo
1532          mov.w @(0, PC), r14
1533          .long disp
1534          foo: bra @r14
1535          */
1536       int t = buffer[0] & 0x10;
1537
1538       buffer[highbyte] = 0xa0;  /* branch over move and disp */
1539       buffer[lowbyte] = 3;
1540       buffer[highbyte+2] = 0xd0 | JREG; /* Build mov insn */
1541       buffer[lowbyte+2] = 0x00;
1542
1543       buffer[highbyte+4] = 0;   /* space for 32 bit jump disp */
1544       buffer[lowbyte+4] = 0;
1545       buffer[highbyte+6] = 0;
1546       buffer[lowbyte+6] = 0;
1547
1548       buffer[highbyte+8] = 0x40 | JREG; /* Build jmp @JREG */
1549       buffer[lowbyte+8] = t ? 0xb : 0x2b;
1550
1551       buffer[highbyte+10] = 0x20; /* build nop */
1552       buffer[lowbyte+10] = 0x0b;
1553
1554       /* Make reloc for the long disp */
1555       fix_new (fragP,
1556                fragP->fr_fix + 4,
1557                4,
1558                fragP->fr_symbol,
1559                fragP->fr_offset,
1560                0,
1561                BFD_RELOC_32);
1562       fragP->fr_fix += UNCOND32_LENGTH;
1563       fragP->fr_var = 0;
1564       donerelax = 1;
1565 #endif
1566
1567       break;
1568
1569     case C (COND_JUMP, COND12):
1570     case C (COND_JUMP_DELAY, COND12):
1571       /* A bcond won't fit, so turn it into a b!cond; bra disp; nop */
1572       {
1573         unsigned char *buffer =
1574           (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1575         int highbyte = target_big_endian ? 0 : 1;
1576         int lowbyte = target_big_endian ? 1 : 0;
1577         int delay = fragP->fr_subtype == C (COND_JUMP_DELAY, COND12);
1578
1579         /* Toggle the true/false bit of the bcond.  */
1580         buffer[highbyte] ^= 0x2;
1581
1582         /* If this is a dalayed branch, we may not put the the bra in the
1583            slot.  So we change it to a non-delayed branch, like that:
1584            b! cond slot_label; bra disp; slot_label: slot_insn
1585            ??? We should try if swapping the conditional branch and
1586            its delay-slot insn already makes the branch reach.  */
1587
1588         /* Build a relocation to six / four bytes farther on.  */
1589         subseg_change (seg, 0);
1590         fix_new (fragP, fragP->fr_fix, 2,
1591 #ifdef BFD_ASSEMBLER
1592                  section_symbol (seg),
1593 #else
1594                  seg_info (seg)->dot,
1595 #endif
1596                  fragP->fr_address + fragP->fr_fix + (delay ? 4 : 6),
1597                  1, BFD_RELOC_SH_PCDISP8BY2);
1598
1599         /* Set up a jump instruction.  */
1600         buffer[highbyte + 2] = 0xa0;
1601         buffer[lowbyte + 2] = 0;
1602         fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
1603                  fragP->fr_offset, 1, BFD_RELOC_SH_PCDISP12BY2);
1604
1605         if (delay)
1606           {
1607             buffer[highbyte] &= ~0x4; /* Removes delay slot from branch.  */
1608             fragP->fr_fix += 4;
1609           }
1610         else
1611           {
1612             /* Fill in a NOP instruction.  */
1613             buffer[highbyte + 4] = 0x0;
1614             buffer[lowbyte + 4] = 0x9;
1615
1616             fragP->fr_fix += 6;
1617           }
1618         fragP->fr_var = 0;
1619         donerelax = 1;
1620       }
1621       break;
1622
1623     case C (COND_JUMP, COND32):
1624     case C (COND_JUMP_DELAY, COND32):
1625     case C (COND_JUMP, UNDEF_WORD_DISP):
1626     case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
1627       if (fragP->fr_symbol == NULL)
1628         as_bad (_("at 0x%lx, displacement overflows 8-bit field"), 
1629                 (unsigned long) fragP->fr_address);
1630       else if (S_IS_DEFINED (fragP->fr_symbol))
1631         as_bad (_("at 0x%lx, displacement to defined symbol %s overflows 8-bit field "),
1632                 (unsigned long) fragP->fr_address,              
1633                 S_GET_NAME (fragP->fr_symbol));
1634       else
1635         as_bad (_("at 0x%lx, displacement to undefined symbol %s overflows 8-bit field "),
1636                 (unsigned long) fragP->fr_address,              
1637                 S_GET_NAME (fragP->fr_symbol));
1638
1639 #if 0                           /* This code works, but generates poor code, and the compiler
1640                                    should never produce a sequence that requires it to be used.  */
1641
1642       /* A bcond won't fit and it won't go into a 12 bit
1643          displacement either, the code sequence looks like:
1644          b!cond foop
1645          mov.w @(n, PC), r14
1646          jmp  @r14
1647          nop
1648          .long where
1649          foop:
1650          */
1651
1652       buffer[0] ^= 0x2;         /* Toggle T/F bit */
1653 #define JREG 14
1654       buffer[1] = 5;            /* branch over mov, jump, nop and ptr */
1655       buffer[2] = 0xd0 | JREG;  /* Build mov insn */
1656       buffer[3] = 0x2;
1657       buffer[4] = 0x40 | JREG;  /* Build jmp @JREG */
1658       buffer[5] = 0x0b;
1659       buffer[6] = 0x20;         /* build nop */
1660       buffer[7] = 0x0b;
1661       buffer[8] = 0;            /* space for 32 bit jump disp */
1662       buffer[9] = 0;
1663       buffer[10] = 0;
1664       buffer[11] = 0;
1665       buffer[12] = 0;
1666       buffer[13] = 0;
1667       /* Make reloc for the long disp */
1668       fix_new (fragP,
1669                fragP->fr_fix + 8,
1670                4,
1671                fragP->fr_symbol,
1672                fragP->fr_offset,
1673                0,
1674                BFD_RELOC_32);
1675       fragP->fr_fix += COND32_LENGTH;
1676       fragP->fr_var = 0;
1677       donerelax = 1;
1678 #endif
1679
1680       break;
1681
1682     default:
1683       abort ();
1684     }
1685
1686   if (donerelax && !sh_relax)
1687     as_warn_where (fragP->fr_file, fragP->fr_line,
1688                    _("overflow in branch to %s; converted into longer instruction sequence"),
1689                    (fragP->fr_symbol != NULL
1690                     ? S_GET_NAME (fragP->fr_symbol)
1691                     : ""));
1692 }
1693
1694 valueT
1695 DEFUN (md_section_align, (seg, size),
1696        segT seg AND
1697        valueT size)
1698 {
1699 #ifdef BFD_ASSEMBLER
1700 #ifdef OBJ_ELF
1701   return size;
1702 #else /* ! OBJ_ELF */
1703   return ((size + (1 << bfd_get_section_alignment (stdoutput, seg)) - 1)
1704           & (-1 << bfd_get_section_alignment (stdoutput, seg)));
1705 #endif /* ! OBJ_ELF */
1706 #else /* ! BFD_ASSEMBLER */
1707   return ((size + (1 << section_alignment[(int) seg]) - 1)
1708           & (-1 << section_alignment[(int) seg]));
1709 #endif /* ! BFD_ASSEMBLER */
1710 }
1711
1712 /* This static variable is set by s_uacons to tell sh_cons_align that
1713    the expession does not need to be aligned.  */
1714
1715 static int sh_no_align_cons = 0;
1716
1717 /* This handles the unaligned space allocation pseudo-ops, such as
1718    .uaword.  .uaword is just like .word, but the value does not need
1719    to be aligned.  */
1720
1721 static void
1722 s_uacons (bytes)
1723      int bytes;
1724 {
1725   /* Tell sh_cons_align not to align this value.  */
1726   sh_no_align_cons = 1;
1727   cons (bytes);
1728 }
1729
1730 /* If a .word, et. al., pseud-op is seen, warn if the value is not
1731    aligned correctly.  Note that this can cause warnings to be issued
1732    when assembling initialized structured which were declared with the
1733    packed attribute.  FIXME: Perhaps we should require an option to
1734    enable this warning?  */
1735
1736 void
1737 sh_cons_align (nbytes)
1738      int nbytes;
1739 {
1740   int nalign;
1741   char *p;
1742
1743   if (sh_no_align_cons)
1744     {
1745       /* This is an unaligned pseudo-op.  */
1746       sh_no_align_cons = 0;
1747       return;
1748     }
1749
1750   nalign = 0;
1751   while ((nbytes & 1) == 0)
1752     {
1753       ++nalign;
1754       nbytes >>= 1;
1755     }
1756
1757   if (nalign == 0)
1758     return;
1759
1760   if (now_seg == absolute_section)
1761     {
1762       if ((abs_section_offset & ((1 << nalign) - 1)) != 0)
1763         as_warn (_("misaligned data"));
1764       return;
1765     }
1766
1767   p = frag_var (rs_align_code, 1, 1, (relax_substateT) 0,
1768                 (symbolS *) NULL, (offsetT) nalign, (char *) NULL);
1769
1770   record_alignment (now_seg, nalign);
1771 }
1772
1773 /* When relaxing, we need to output a reloc for any .align directive
1774    that requests alignment to a four byte boundary or larger.  This is
1775    also where we check for misaligned data.  */
1776
1777 void
1778 sh_handle_align (frag)
1779      fragS *frag;
1780 {
1781   if (sh_relax
1782       && frag->fr_type == rs_align
1783       && frag->fr_address + frag->fr_fix > 0
1784       && frag->fr_offset > 1
1785       && now_seg != bss_section)
1786     fix_new (frag, frag->fr_fix, 2, &abs_symbol, frag->fr_offset, 0,
1787              BFD_RELOC_SH_ALIGN);
1788
1789   if (frag->fr_type == rs_align_code
1790       && frag->fr_next->fr_address - frag->fr_address - frag->fr_fix != 0)
1791     as_warn_where (frag->fr_file, frag->fr_line, _("misaligned data"));
1792 }
1793
1794 /* This macro decides whether a particular reloc is an entry in a
1795    switch table.  It is used when relaxing, because the linker needs
1796    to know about all such entries so that it can adjust them if
1797    necessary.  */
1798
1799 #ifdef BFD_ASSEMBLER
1800 #define SWITCH_TABLE_CONS(fix) (0)
1801 #else
1802 #define SWITCH_TABLE_CONS(fix)                          \
1803   ((fix)->fx_r_type == 0                                \
1804    && ((fix)->fx_size == 2                              \
1805        || (fix)->fx_size == 1                           \
1806        || (fix)->fx_size == 4))
1807 #endif
1808
1809 #define SWITCH_TABLE(fix)                               \
1810   ((fix)->fx_addsy != NULL                              \
1811    && (fix)->fx_subsy != NULL                           \
1812    && S_GET_SEGMENT ((fix)->fx_addsy) == text_section   \
1813    && S_GET_SEGMENT ((fix)->fx_subsy) == text_section   \
1814    && ((fix)->fx_r_type == BFD_RELOC_32                 \
1815        || (fix)->fx_r_type == BFD_RELOC_16              \
1816        || (fix)->fx_r_type == BFD_RELOC_8               \
1817        || SWITCH_TABLE_CONS (fix)))
1818
1819 /* See whether we need to force a relocation into the output file.
1820    This is used to force out switch and PC relative relocations when
1821    relaxing.  */
1822
1823 int
1824 sh_force_relocation (fix)
1825      fixS *fix;
1826 {
1827   if (! sh_relax)
1828     return 0;
1829
1830   return (fix->fx_pcrel
1831           || SWITCH_TABLE (fix)
1832           || fix->fx_r_type == BFD_RELOC_SH_COUNT
1833           || fix->fx_r_type == BFD_RELOC_SH_ALIGN
1834           || fix->fx_r_type == BFD_RELOC_SH_CODE
1835           || fix->fx_r_type == BFD_RELOC_SH_DATA
1836           || fix->fx_r_type == BFD_RELOC_SH_LABEL);
1837 }
1838
1839 /* Apply a fixup to the object file.  */
1840
1841 #ifdef BFD_ASSEMBLER
1842 int
1843 md_apply_fix (fixP, valp)
1844      fixS *fixP;
1845      valueT *valp;
1846 #else
1847 void
1848 md_apply_fix (fixP, val)
1849      fixS *fixP;
1850      long val;
1851 #endif
1852 {
1853   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
1854   int lowbyte = target_big_endian ? 1 : 0;
1855   int highbyte = target_big_endian ? 0 : 1;
1856 #ifdef BFD_ASSEMBLER
1857   long val = *valp;
1858 #endif
1859   long max, min;
1860   int shift;
1861
1862 #ifdef BFD_ASSEMBLER
1863   /* adjust_reloc_syms won't convert a reloc against a weak symbol
1864      into a reloc against a section, but bfd_install_relocation will
1865      screw up if the symbol is defined, so we have to adjust val here
1866      to avoid the screw up later.  */
1867   if (fixP->fx_addsy != NULL
1868       && S_IS_WEAK (fixP->fx_addsy))
1869     val -= S_GET_VALUE  (fixP->fx_addsy);
1870 #endif
1871
1872 #ifndef BFD_ASSEMBLER
1873   if (fixP->fx_r_type == 0)
1874     {
1875       if (fixP->fx_size == 2)
1876         fixP->fx_r_type = BFD_RELOC_16;
1877       else if (fixP->fx_size == 4)
1878         fixP->fx_r_type = BFD_RELOC_32;
1879       else if (fixP->fx_size == 1)
1880         fixP->fx_r_type = BFD_RELOC_8;
1881       else
1882         abort ();
1883     }
1884 #endif
1885
1886   max = min = 0;
1887   shift = 0;
1888   switch (fixP->fx_r_type)
1889     {
1890     case BFD_RELOC_SH_IMM4:
1891       max = 0xf;
1892       *buf = (*buf & 0xf0) | (val & 0xf);
1893       break;
1894
1895     case BFD_RELOC_SH_IMM4BY2:
1896       max = 0xf;
1897       shift = 1;
1898       *buf = (*buf & 0xf0) | ((val >> 1) & 0xf);
1899       break;
1900
1901     case BFD_RELOC_SH_IMM4BY4:
1902       max = 0xf;
1903       shift = 2;
1904       *buf = (*buf & 0xf0) | ((val >> 2) & 0xf);
1905       break;
1906
1907     case BFD_RELOC_SH_IMM8BY2:
1908       max = 0xff;
1909       shift = 1;
1910       *buf = val >> 1;
1911       break;
1912
1913     case BFD_RELOC_SH_IMM8BY4:
1914       max = 0xff;
1915       shift = 2;
1916       *buf = val >> 2;
1917       break;
1918
1919     case BFD_RELOC_8:
1920     case BFD_RELOC_SH_IMM8:
1921       /* Sometimes the 8 bit value is sign extended (e.g., add) and
1922          sometimes it is not (e.g., and).  We permit any 8 bit value.
1923          Note that adding further restrictions may invalidate
1924          reasonable looking assembly code, such as ``and -0x1,r0''.  */
1925       max = 0xff;
1926       min = - 0xff;
1927       *buf++ = val;
1928       break;
1929
1930     case BFD_RELOC_SH_PCRELIMM8BY4:
1931       /* The lower two bits of the PC are cleared before the
1932          displacement is added in.  We can assume that the destination
1933          is on a 4 byte bounday.  If this instruction is also on a 4
1934          byte boundary, then we want
1935            (target - here) / 4
1936          and target - here is a multiple of 4.
1937          Otherwise, we are on a 2 byte boundary, and we want
1938            (target - (here - 2)) / 4
1939          and target - here is not a multiple of 4.  Computing
1940            (target - (here - 2)) / 4 == (target - here + 2) / 4
1941          works for both cases, since in the first case the addition of
1942          2 will be removed by the division.  target - here is in the
1943          variable val.  */
1944       val = (val + 2) / 4;
1945       if (val & ~0xff)
1946         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
1947       buf[lowbyte] = val;
1948       break;
1949
1950     case BFD_RELOC_SH_PCRELIMM8BY2:
1951       val /= 2;
1952       if (val & ~0xff)
1953         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
1954       buf[lowbyte] = val;
1955       break;
1956
1957     case BFD_RELOC_SH_PCDISP8BY2:
1958       val /= 2;
1959       if (val < -0x80 || val > 0x7f)
1960         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
1961       buf[lowbyte] = val;
1962       break;
1963
1964     case BFD_RELOC_SH_PCDISP12BY2:
1965       val /= 2;
1966       if (val < -0x800 || val >= 0x7ff)
1967         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
1968       buf[lowbyte] = val & 0xff;
1969       buf[highbyte] |= (val >> 8) & 0xf;
1970       break;
1971
1972     case BFD_RELOC_32:
1973       if (! target_big_endian) 
1974         {
1975           *buf++ = val >> 0;
1976           *buf++ = val >> 8;
1977           *buf++ = val >> 16;
1978           *buf++ = val >> 24;
1979         }
1980       else 
1981         {
1982           *buf++ = val >> 24;
1983           *buf++ = val >> 16;
1984           *buf++ = val >> 8;
1985           *buf++ = val >> 0;
1986         }
1987       break;
1988
1989     case BFD_RELOC_16:
1990       if (! target_big_endian)
1991         {
1992           *buf++ = val >> 0;
1993           *buf++ = val >> 8;
1994         } 
1995       else 
1996         {
1997           *buf++ = val >> 8;
1998           *buf++ = val >> 0;
1999         }
2000       break;
2001
2002     case BFD_RELOC_SH_USES:
2003       /* Pass the value into sh_coff_reloc_mangle.  */
2004       fixP->fx_addnumber = val;
2005       break;
2006
2007     case BFD_RELOC_SH_COUNT:
2008     case BFD_RELOC_SH_ALIGN:
2009     case BFD_RELOC_SH_CODE:
2010     case BFD_RELOC_SH_DATA:
2011     case BFD_RELOC_SH_LABEL:
2012       /* Nothing to do here.  */
2013       break;
2014
2015     default:
2016       abort ();
2017     }
2018
2019   if (shift != 0)
2020     {
2021       if ((val & ((1 << shift) - 1)) != 0)
2022         as_bad_where (fixP->fx_file, fixP->fx_line, _("misaligned offset"));
2023       if (val >= 0)
2024         val >>= shift;
2025       else
2026         val = ((val >> shift)
2027                | ((long) -1 & ~ ((long) -1 >> shift)));
2028     }
2029   if (max != 0 && (val < min || val > max))
2030     as_bad_where (fixP->fx_file, fixP->fx_line, _("offset out of range"));
2031
2032 #ifdef BFD_ASSEMBLER
2033   return 0;
2034 #endif
2035 }
2036
2037 /* Called just before address relaxation.  Return the length
2038    by which a fragment must grow to reach it's destination.  */
2039
2040 int
2041 md_estimate_size_before_relax (fragP, segment_type)
2042      register fragS *fragP;
2043      register segT segment_type;
2044 {
2045   switch (fragP->fr_subtype)
2046     {
2047     case C (UNCOND_JUMP, UNDEF_DISP):
2048       /* used to be a branch to somewhere which was unknown */
2049       if (!fragP->fr_symbol)
2050         {
2051           fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
2052           fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length;
2053         }
2054       else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
2055         {
2056           fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
2057           fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length;
2058         }
2059       else
2060         {
2061           fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP);
2062           fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length;
2063           return md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length;
2064         }
2065       break;
2066
2067     default:
2068       abort ();
2069     case C (COND_JUMP, UNDEF_DISP):
2070     case C (COND_JUMP_DELAY, UNDEF_DISP):
2071       /* used to be a branch to somewhere which was unknown */
2072       if (fragP->fr_symbol
2073           && S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
2074         {
2075           int what = GET_WHAT (fragP->fr_subtype);
2076           /* Got a symbol and it's defined in this segment, become byte
2077              sized - maybe it will fix up */
2078           fragP->fr_subtype = C (what, COND8);
2079           fragP->fr_var = md_relax_table[C (what, COND8)].rlx_length;
2080         }
2081       else if (fragP->fr_symbol)
2082         {
2083           int what = GET_WHAT (fragP->fr_subtype);
2084           /* Its got a segment, but its not ours, so it will always be long */
2085           fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
2086           fragP->fr_var = md_relax_table[C (what, COND32)].rlx_length;
2087           return md_relax_table[C (what, COND32)].rlx_length;
2088         }
2089       else
2090         {
2091           int what = GET_WHAT (fragP->fr_subtype);
2092           /* We know the abs value */
2093           fragP->fr_subtype = C (what, COND8);
2094           fragP->fr_var = md_relax_table[C (what, COND8)].rlx_length;
2095         }
2096
2097       break;
2098     }
2099   return fragP->fr_var;
2100 }
2101
2102 /* Put number into target byte order */
2103
2104 void
2105 md_number_to_chars (ptr, use, nbytes)
2106      char *ptr;
2107      valueT use;
2108      int nbytes;
2109 {
2110   if (! target_big_endian)
2111     number_to_chars_littleendian (ptr, use, nbytes);
2112   else
2113     number_to_chars_bigendian (ptr, use, nbytes);
2114 }
2115
2116 long
2117 md_pcrel_from (fixP)
2118      fixS *fixP;
2119 {
2120   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address + 2;
2121 }
2122
2123 #ifdef OBJ_COFF
2124
2125 int
2126 tc_coff_sizemachdep (frag)
2127      fragS *frag;
2128 {
2129   return md_relax_table[frag->fr_subtype].rlx_length;
2130 }
2131
2132 #endif /* OBJ_COFF */
2133
2134 /* When we align the .text section, insert the correct NOP pattern.  */
2135
2136 int
2137 sh_do_align (n, fill, len, max)
2138      int n;
2139      const char *fill;
2140      int len;
2141      int max;
2142 {
2143   if (fill == NULL
2144 #ifdef BFD_ASSEMBLER
2145       && (now_seg->flags & SEC_CODE) != 0
2146 #else
2147       && now_seg != data_section
2148       && now_seg != bss_section
2149 #endif
2150       && n > 1)
2151     {
2152       static const unsigned char big_nop_pattern[] = { 0x00, 0x09 };
2153       static const unsigned char little_nop_pattern[] = { 0x09, 0x00 };
2154
2155       /* First align to a 2 byte boundary, in case there is an odd
2156          .byte.  */
2157       frag_align (1, 0, 0);
2158       if (target_big_endian)
2159         frag_align_pattern (n, big_nop_pattern, sizeof big_nop_pattern, max);
2160       else
2161         frag_align_pattern (n, little_nop_pattern, sizeof little_nop_pattern,
2162                             max);
2163       return 1;
2164     }
2165
2166   return 0;
2167 }
2168
2169 #ifndef BFD_ASSEMBLER
2170 #ifdef OBJ_COFF
2171
2172 /* Map BFD relocs to SH COFF relocs.  */
2173
2174 struct reloc_map
2175 {
2176   bfd_reloc_code_real_type bfd_reloc;
2177   int sh_reloc;
2178 };
2179
2180 static const struct reloc_map coff_reloc_map[] =
2181 {
2182   { BFD_RELOC_32, R_SH_IMM32 },
2183   { BFD_RELOC_16, R_SH_IMM16 },
2184   { BFD_RELOC_8, R_SH_IMM8 },
2185   { BFD_RELOC_SH_PCDISP8BY2, R_SH_PCDISP8BY2 },
2186   { BFD_RELOC_SH_PCDISP12BY2, R_SH_PCDISP },
2187   { BFD_RELOC_SH_IMM4, R_SH_IMM4 },
2188   { BFD_RELOC_SH_IMM4BY2, R_SH_IMM4BY2 },
2189   { BFD_RELOC_SH_IMM4BY4, R_SH_IMM4BY4 },
2190   { BFD_RELOC_SH_IMM8, R_SH_IMM8 },
2191   { BFD_RELOC_SH_IMM8BY2, R_SH_IMM8BY2 },
2192   { BFD_RELOC_SH_IMM8BY4, R_SH_IMM8BY4 },
2193   { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_PCRELIMM8BY2 },
2194   { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_PCRELIMM8BY4 },
2195   { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
2196   { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
2197   { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
2198   { BFD_RELOC_SH_USES, R_SH_USES },
2199   { BFD_RELOC_SH_COUNT, R_SH_COUNT },
2200   { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
2201   { BFD_RELOC_SH_CODE, R_SH_CODE },
2202   { BFD_RELOC_SH_DATA, R_SH_DATA },
2203   { BFD_RELOC_SH_LABEL, R_SH_LABEL },
2204   { BFD_RELOC_UNUSED, 0 }
2205 };
2206
2207 /* Adjust a reloc for the SH.  This is similar to the generic code,
2208    but does some minor tweaking.  */
2209
2210 void
2211 sh_coff_reloc_mangle (seg, fix, intr, paddr)
2212      segment_info_type *seg;
2213      fixS *fix;
2214      struct internal_reloc *intr;
2215      unsigned int paddr;
2216 {
2217   symbolS *symbol_ptr = fix->fx_addsy;
2218   symbolS *dot;
2219
2220   intr->r_vaddr = paddr + fix->fx_frag->fr_address + fix->fx_where;
2221
2222   if (! SWITCH_TABLE (fix))
2223     {
2224       const struct reloc_map *rm;
2225
2226       for (rm = coff_reloc_map; rm->bfd_reloc != BFD_RELOC_UNUSED; rm++)
2227         if (rm->bfd_reloc == (bfd_reloc_code_real_type) fix->fx_r_type)
2228           break;
2229       if (rm->bfd_reloc == BFD_RELOC_UNUSED)
2230         as_bad_where (fix->fx_file, fix->fx_line,
2231                       _("Can not represent %s relocation in this object file format"),
2232                       bfd_get_reloc_code_name (fix->fx_r_type));
2233       intr->r_type = rm->sh_reloc;
2234       intr->r_offset = 0;
2235     }
2236   else
2237     {
2238       know (sh_relax);
2239
2240       if (fix->fx_r_type == BFD_RELOC_16)
2241         intr->r_type = R_SH_SWITCH16;
2242       else if (fix->fx_r_type == BFD_RELOC_8)
2243         intr->r_type = R_SH_SWITCH8;
2244       else if (fix->fx_r_type == BFD_RELOC_32)
2245         intr->r_type = R_SH_SWITCH32;
2246       else
2247         abort ();
2248
2249       /* For a switch reloc, we set r_offset to the difference between
2250          the reloc address and the subtrahend.  When the linker is
2251          doing relaxing, it can use the determine the starting and
2252          ending points of the switch difference expression.  */
2253       intr->r_offset = intr->r_vaddr - S_GET_VALUE (fix->fx_subsy);
2254     }
2255
2256   /* PC relative relocs are always against the current section.  */
2257   if (symbol_ptr == NULL)
2258     {
2259       switch (fix->fx_r_type)
2260         {
2261         case BFD_RELOC_SH_PCRELIMM8BY2:
2262         case BFD_RELOC_SH_PCRELIMM8BY4:
2263         case BFD_RELOC_SH_PCDISP8BY2:
2264         case BFD_RELOC_SH_PCDISP12BY2:
2265         case BFD_RELOC_SH_USES:
2266           symbol_ptr = seg->dot;
2267           break;
2268         default:
2269           break;
2270         }
2271     }
2272
2273   if (fix->fx_r_type == BFD_RELOC_SH_USES)
2274     {
2275       /* We can't store the offset in the object file, since this
2276          reloc does not take up any space, so we store it in r_offset.
2277          The fx_addnumber field was set in md_apply_fix.  */
2278       intr->r_offset = fix->fx_addnumber;
2279     }
2280   else if (fix->fx_r_type == BFD_RELOC_SH_COUNT)
2281     {
2282       /* We can't store the count in the object file, since this reloc
2283          does not take up any space, so we store it in r_offset.  The
2284          fx_offset field was set when the fixup was created in
2285          sh_coff_frob_file.  */
2286       intr->r_offset = fix->fx_offset;
2287       /* This reloc is always absolute.  */
2288       symbol_ptr = NULL;
2289     }
2290   else if (fix->fx_r_type == BFD_RELOC_SH_ALIGN)
2291     {
2292       /* Store the alignment in the r_offset field.  */
2293       intr->r_offset = fix->fx_offset;
2294       /* This reloc is always absolute.  */
2295       symbol_ptr = NULL;
2296     }
2297   else if (fix->fx_r_type == BFD_RELOC_SH_CODE
2298            || fix->fx_r_type == BFD_RELOC_SH_DATA
2299            || fix->fx_r_type == BFD_RELOC_SH_LABEL)
2300     {
2301       /* These relocs are always absolute.  */
2302       symbol_ptr = NULL;
2303     }
2304
2305   /* Turn the segment of the symbol into an offset.  */
2306   if (symbol_ptr != NULL)
2307     {
2308       dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot;
2309       if (dot != NULL)
2310         intr->r_symndx = dot->sy_number;
2311       else
2312         intr->r_symndx = symbol_ptr->sy_number;
2313     }
2314   else
2315     intr->r_symndx = -1;
2316 }
2317
2318 #endif /* OBJ_COFF */
2319 #endif /* ! BFD_ASSEMBLER */
2320
2321 #ifdef BFD_ASSEMBLER
2322
2323 /* Create a reloc.  */
2324
2325 arelent *
2326 tc_gen_reloc (section, fixp)
2327      asection *section;
2328      fixS *fixp;
2329 {
2330   arelent *rel;
2331   bfd_reloc_code_real_type r_type;
2332
2333   rel = (arelent *) xmalloc (sizeof (arelent));
2334   rel->sym_ptr_ptr = &fixp->fx_addsy->bsym;
2335   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2336
2337   r_type = fixp->fx_r_type;
2338
2339   if (SWITCH_TABLE (fixp))
2340     {
2341       rel->addend = rel->address - S_GET_VALUE (fixp->fx_subsy);
2342       if (r_type == BFD_RELOC_16)
2343         r_type = BFD_RELOC_SH_SWITCH16;
2344       else if (r_type == BFD_RELOC_8)
2345         r_type = BFD_RELOC_8_PCREL;
2346       else if (r_type == BFD_RELOC_32)
2347         r_type = BFD_RELOC_SH_SWITCH32;
2348       else
2349         abort ();
2350     }
2351   else if (r_type == BFD_RELOC_SH_USES)
2352     rel->addend = fixp->fx_addnumber;
2353   else if (r_type == BFD_RELOC_SH_COUNT)
2354     rel->addend = fixp->fx_offset;
2355   else if (r_type == BFD_RELOC_SH_ALIGN)
2356     rel->addend = fixp->fx_offset;
2357   else if (fixp->fx_pcrel)
2358     rel->addend = fixp->fx_addnumber;
2359   else
2360     rel->addend = 0;
2361
2362   rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
2363   if (rel->howto == NULL)
2364     {
2365       as_bad_where (fixp->fx_file, fixp->fx_line,
2366                     _("Cannot represent relocation type %s"),
2367                     bfd_get_reloc_code_name (r_type));
2368       /* Set howto to a garbage value so that we can keep going.  */
2369       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
2370       assert (rel->howto != NULL);
2371     }
2372
2373   return rel;
2374 }
2375
2376 #endif /* BFD_ASSEMBLER */