1 /* tc-rl78.c -- Assembler for the Renesas RL78
2 Copyright (C) 2011-2014 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
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 3, or (at your option)
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.
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 the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
22 #include "struc-symbol.h"
24 #include "safe-ctype.h"
25 #include "dwarf2dbg.h"
27 #include "elf/common.h"
29 #include "rl78-defs.h"
30 #include "filenames.h"
35 const char comment_chars
[] = ";";
36 /* Note that input_file.c hand checks for '#' at the beginning of the
37 first line of the input file. This is because the compiler outputs
38 #NO_APP at the beginning of its output. */
39 const char line_comment_chars
[] = "#";
40 /* Use something that isn't going to be needed by any expressions or
42 const char line_separator_chars
[] = "@";
44 const char EXP_CHARS
[] = "eE";
45 const char FLT_CHARS
[] = "dD";
47 /* ELF flags to set in the output file header. */
48 static int elf_flags
= 0;
50 /*------------------------------------------------------------------*/
52 char * rl78_lex_start
;
55 typedef struct rl78_bytesT
68 char type
; /* RL78REL_*. */
81 fixS
*link_relax_fixP
;
86 static rl78_bytesT rl78_bytes
;
89 rl78_relax (int type
, int pos
)
91 rl78_bytes
.relax
[rl78_bytes
.n_relax
].type
= type
;
92 rl78_bytes
.relax
[rl78_bytes
.n_relax
].field_pos
= pos
;
93 rl78_bytes
.relax
[rl78_bytes
.n_relax
].val_ofs
= rl78_bytes
.n_base
+ rl78_bytes
.n_ops
;
94 rl78_bytes
.n_relax
++;
98 rl78_linkrelax_addr16 (void)
100 rl78_bytes
.link_relax
|= RL78_RELAXA_ADDR16
;
104 rl78_linkrelax_branch (void)
106 rl78_bytes
.link_relax
|= RL78_RELAXA_BRA
;
110 rl78_fixup (expressionS exp
, int offsetbits
, int nbits
, int type
)
112 rl78_bytes
.fixups
[rl78_bytes
.n_fixups
].exp
= exp
;
113 rl78_bytes
.fixups
[rl78_bytes
.n_fixups
].offset
= offsetbits
;
114 rl78_bytes
.fixups
[rl78_bytes
.n_fixups
].nbits
= nbits
;
115 rl78_bytes
.fixups
[rl78_bytes
.n_fixups
].type
= type
;
116 rl78_bytes
.fixups
[rl78_bytes
.n_fixups
].reloc
= exp
.X_md
;
117 rl78_bytes
.n_fixups
++;
120 #define rl78_field_fixup(exp, offset, nbits, type) \
121 rl78_fixup (exp, offset + 8 * rl78_bytes.n_prefix), nbits, type)
123 #define rl78_op_fixup(exp, offset, nbits, type) \
124 rl78_fixup (exp, offset + 8 * (rl78_bytes.n_prefix + rl78_bytes.n_base), nbits, type)
129 rl78_bytes
.prefix
[0] = p
;
130 rl78_bytes
.n_prefix
= 1;
136 return rl78_bytes
.n_prefix
;
142 rl78_bytes
.base
[0] = b1
;
143 rl78_bytes
.n_base
= 1;
147 rl78_base2 (int b1
, int b2
)
149 rl78_bytes
.base
[0] = b1
;
150 rl78_bytes
.base
[1] = b2
;
151 rl78_bytes
.n_base
= 2;
155 rl78_base3 (int b1
, int b2
, int b3
)
157 rl78_bytes
.base
[0] = b1
;
158 rl78_bytes
.base
[1] = b2
;
159 rl78_bytes
.base
[2] = b3
;
160 rl78_bytes
.n_base
= 3;
164 rl78_base4 (int b1
, int b2
, int b3
, int b4
)
166 rl78_bytes
.base
[0] = b1
;
167 rl78_bytes
.base
[1] = b2
;
168 rl78_bytes
.base
[2] = b3
;
169 rl78_bytes
.base
[3] = b4
;
170 rl78_bytes
.n_base
= 4;
173 #define F_PRECISION 2
176 rl78_op (expressionS exp
, int nbytes
, int type
)
180 if ((exp
.X_op
== O_constant
|| exp
.X_op
== O_big
)
181 && type
!= RL78REL_PCREL
)
183 if (exp
.X_op
== O_big
&& exp
.X_add_number
<= 0)
186 char * ip
= rl78_bytes
.ops
+ rl78_bytes
.n_ops
;
188 gen_to_words (w
, F_PRECISION
, 8);
193 rl78_bytes
.n_ops
+= 4;
197 v
= exp
.X_add_number
;
200 rl78_bytes
.ops
[rl78_bytes
.n_ops
++] =v
& 0xff;
209 && exp
.X_md
== BFD_RELOC_RL78_CODE
)
211 rl78_op_fixup (exp
, rl78_bytes
.n_ops
* 8, nbytes
* 8, type
);
212 memset (rl78_bytes
.ops
+ rl78_bytes
.n_ops
, 0, nbytes
);
213 rl78_bytes
.n_ops
+= nbytes
;
217 /* This gets complicated when the field spans bytes, because fields
218 are numbered from the MSB of the first byte as zero, and bits are
219 stored LSB towards the LSB of the byte. Thus, a simple four-bit
220 insertion of 12 at position 4 of 0x00 yields: 0x0b. A three-bit
221 insertion of b'MXL at position 7 is like this:
223 - - - - - - - - - - - - - - - -
227 rl78_field (int val
, int pos
, int sz
)
234 if (val
< 0 || val
>= (1 << sz
))
235 as_bad (_("Value %d doesn't fit in unsigned %d-bit field"), val
, sz
);
240 if (val
< -(1 << (sz
- 1)) || val
>= (1 << (sz
- 1)))
241 as_bad (_("Value %d doesn't fit in signed %d-bit field"), val
, sz
);
244 /* This code points at 'M' in the above example. */
248 while (bitp
+ sz
> 8)
253 svalm
= val
>> (sz
- ssz
);
254 svalm
= svalm
& ((1 << ssz
) - 1);
255 svalm
= svalm
<< (8 - bitp
- ssz
);
256 gas_assert (bytep
< rl78_bytes
.n_base
);
257 rl78_bytes
.base
[bytep
] |= svalm
;
263 valm
= val
& ((1 << sz
) - 1);
264 valm
= valm
<< (8 - bitp
- sz
);
265 gas_assert (bytep
< rl78_bytes
.n_base
);
266 rl78_bytes
.base
[bytep
] |= valm
;
269 /*------------------------------------------------------------------*/
273 OPTION_RELAX
= OPTION_MD_BASE
,
277 #define RL78_SHORTOPTS ""
278 const char * md_shortopts
= RL78_SHORTOPTS
;
280 /* Assembler options. */
281 struct option md_longopts
[] =
283 {"relax", no_argument
, NULL
, OPTION_RELAX
},
284 {"mg10", no_argument
, NULL
, OPTION_G10
},
285 {NULL
, no_argument
, NULL
, 0}
287 size_t md_longopts_size
= sizeof (md_longopts
);
290 md_parse_option (int c
, char * arg ATTRIBUTE_UNUSED
)
299 elf_flags
|= E_FLAG_RL78_G10
;
306 md_show_usage (FILE * stream ATTRIBUTE_UNUSED
)
312 s_bss (int ignore ATTRIBUTE_UNUSED
)
316 temp
= get_absolute_expression ();
317 subseg_set (bss_section
, (subsegT
) temp
);
318 demand_empty_rest_of_line ();
321 /* The target specific pseudo-ops which we support. */
322 const pseudo_typeS md_pseudo_table
[] =
324 /* Our "standard" pseudos. */
325 { "double", float_cons
, 'd' },
327 { "3byte", cons
, 3 },
331 /* End of list marker. */
345 /* Set the ELF specific flags. */
347 rl78_elf_final_processing (void)
349 elf_elfheader (stdoutput
)->e_flags
|= elf_flags
;
352 /* Write a value out to the object file, using the appropriate endianness. */
354 md_number_to_chars (char * buf
, valueT val
, int n
)
356 number_to_chars_littleendian (buf
, val
, n
);
360 require_end_of_expr (char *fname
)
362 while (* input_line_pointer
== ' '
363 || * input_line_pointer
== '\t')
364 input_line_pointer
++;
366 if (! * input_line_pointer
367 || strchr ("\n\r,", * input_line_pointer
)
368 || strchr (comment_chars
, * input_line_pointer
)
369 || strchr (line_comment_chars
, * input_line_pointer
)
370 || strchr (line_separator_chars
, * input_line_pointer
))
373 as_bad (_("%%%s() must be outermost term in expression"), fname
);
383 { "code", BFD_RELOC_RL78_CODE
},
384 { "lo16", BFD_RELOC_RL78_LO16
},
385 { "hi16", BFD_RELOC_RL78_HI16
},
386 { "hi8", BFD_RELOC_RL78_HI8
},
391 md_operand (expressionS
* exp ATTRIBUTE_UNUSED
)
396 for (i
= 0; reloc_functions
[i
].fname
; i
++)
398 int flen
= strlen (reloc_functions
[i
].fname
);
400 if (input_line_pointer
[0] == '%'
401 && strncasecmp (input_line_pointer
+ 1, reloc_functions
[i
].fname
, flen
) == 0
402 && input_line_pointer
[flen
+ 1] == '(')
404 reloc
= reloc_functions
[i
].reloc
;
405 input_line_pointer
+= flen
+ 2;
413 if (* input_line_pointer
== ')')
414 input_line_pointer
++;
418 require_end_of_expr (reloc_functions
[i
].fname
);
422 rl78_frag_init (fragS
* fragP
)
424 if (rl78_bytes
.n_relax
|| rl78_bytes
.link_relax
)
426 fragP
->tc_frag_data
= malloc (sizeof (rl78_bytesT
));
427 memcpy (fragP
->tc_frag_data
, & rl78_bytes
, sizeof (rl78_bytesT
));
430 fragP
->tc_frag_data
= 0;
433 /* When relaxing, we need to output a reloc for any .align directive
434 so that we can retain this alignment as we adjust opcode sizes. */
436 rl78_handle_align (fragS
* frag
)
439 && (frag
->fr_type
== rs_align
440 || frag
->fr_type
== rs_align_code
)
441 && frag
->fr_address
+ frag
->fr_fix
> 0
442 && frag
->fr_offset
> 0
443 && now_seg
!= bss_section
)
445 fix_new (frag
, frag
->fr_fix
, 0,
446 &abs_symbol
, RL78_RELAXA_ALIGN
+ frag
->fr_offset
,
447 0, BFD_RELOC_RL78_RELAX
);
448 /* For the purposes of relaxation, this relocation is attached
449 to the byte *after* the alignment - i.e. the byte that must
451 fix_new (frag
->fr_next
, 0, 0,
452 &abs_symbol
, RL78_RELAXA_ELIGN
+ frag
->fr_offset
,
453 0, BFD_RELOC_RL78_RELAX
);
458 md_atof (int type
, char * litP
, int * sizeP
)
460 return ieee_md_atof (type
, litP
, sizeP
, target_big_endian
);
464 md_undefined_symbol (char * name ATTRIBUTE_UNUSED
)
469 #define APPEND(B, N_B) \
470 if (rl78_bytes.N_B) \
472 memcpy (bytes + idx, rl78_bytes.B, rl78_bytes.N_B); \
473 idx += rl78_bytes.N_B; \
478 md_assemble (char * str
)
481 fragS
* frag_then
= frag_now
;
487 /*printf("\033[32mASM: %s\033[0m\n", str);*/
489 dwarf2_emit_insn (0);
491 memset (& rl78_bytes
, 0, sizeof (rl78_bytes
));
493 rl78_lex_init (str
, str
+ strlen (str
));
497 /* This simplifies the relaxation code. */
498 if (rl78_bytes
.n_relax
|| rl78_bytes
.link_relax
)
500 int olen
= rl78_bytes
.n_prefix
+ rl78_bytes
.n_base
+ rl78_bytes
.n_ops
;
501 /* We do it this way because we want the frag to have the
502 rl78_bytes in it, which we initialize above. The extra bytes
504 bytes
= frag_more (olen
+ 3);
505 frag_then
= frag_now
;
506 frag_variant (rs_machine_dependent
,
507 olen
/* max_chars */,
513 frag_then
->fr_opcode
= bytes
;
514 frag_then
->fr_fix
= olen
+ (bytes
- frag_then
->fr_literal
);
515 frag_then
->fr_subtype
= olen
;
516 frag_then
->fr_var
= 0;
520 bytes
= frag_more (rl78_bytes
.n_prefix
+ rl78_bytes
.n_base
+ rl78_bytes
.n_ops
);
521 frag_then
= frag_now
;
524 APPEND (prefix
, n_prefix
);
525 APPEND (base
, n_base
);
528 if (rl78_bytes
.link_relax
)
532 f
= fix_new (frag_then
,
533 (char *) bytes
- frag_then
->fr_literal
,
536 rl78_bytes
.link_relax
| rl78_bytes
.n_fixups
,
538 BFD_RELOC_RL78_RELAX
);
539 frag_then
->tc_frag_data
->link_relax_fixP
= f
;
542 for (i
= 0; i
< rl78_bytes
.n_fixups
; i
++)
544 /* index: [nbytes][type] */
545 static int reloc_map
[5][4] =
548 { BFD_RELOC_8
, BFD_RELOC_8_PCREL
},
549 { BFD_RELOC_16
, BFD_RELOC_16_PCREL
},
550 { BFD_RELOC_24
, BFD_RELOC_24_PCREL
},
551 { BFD_RELOC_32
, BFD_RELOC_32_PCREL
},
555 idx
= rl78_bytes
.fixups
[i
].offset
/ 8;
556 rel
= reloc_map
[rl78_bytes
.fixups
[i
].nbits
/ 8][(int) rl78_bytes
.fixups
[i
].type
];
558 if (rl78_bytes
.fixups
[i
].reloc
)
559 rel
= rl78_bytes
.fixups
[i
].reloc
;
561 if (frag_then
->tc_frag_data
)
562 exp
= & frag_then
->tc_frag_data
->fixups
[i
].exp
;
564 exp
= & rl78_bytes
.fixups
[i
].exp
;
566 f
= fix_new_exp (frag_then
,
567 (char *) bytes
+ idx
- frag_then
->fr_literal
,
568 rl78_bytes
.fixups
[i
].nbits
/ 8,
570 rl78_bytes
.fixups
[i
].type
== RL78REL_PCREL
? 1 : 0,
572 if (frag_then
->tc_frag_data
)
573 frag_then
->tc_frag_data
->fixups
[i
].fixP
= f
;
578 rl78_cons_fix_new (fragS
* frag
,
583 bfd_reloc_code_real_type type
;
601 as_bad (_("unsupported constant size %d\n"), size
);
607 case BFD_RELOC_RL78_CODE
:
611 case BFD_RELOC_RL78_LO16
:
612 case BFD_RELOC_RL78_HI16
:
614 as_bad (_("%%hi16/%%lo16 only applies to .short or .hword"));
617 case BFD_RELOC_RL78_HI8
:
619 as_bad (_("%%hi8 only applies to .byte"));
626 if (exp
->X_op
== O_subtract
&& exp
->X_op_symbol
)
628 if (size
!= 4 && size
!= 2 && size
!= 1)
629 as_bad (_("difference of two symbols only supported with .long, .short, or .byte"));
631 type
= BFD_RELOC_RL78_DIFF
;
634 fixP
= fix_new_exp (frag
, where
, (int) size
, exp
, 0, type
);
637 /* These are intended to have values larger than the container,
638 since the backend puts only the portion we need in it.
639 However, we don't have a backend-specific reloc for them as
640 they're handled with complex relocations. */
641 case BFD_RELOC_RL78_LO16
:
642 case BFD_RELOC_RL78_HI16
:
643 case BFD_RELOC_RL78_HI8
:
644 fixP
->fx_no_overflow
= 1;
652 /*----------------------------------------------------------------------*/
653 /* To recap: we estimate everything based on md_estimate_size, then
654 adjust based on rl78_relax_frag. When it all settles, we call
655 md_convert frag to update the bytes. The relaxation types and
656 relocations are in fragP->tc_frag_data, which is a copy of that
659 Our scheme is as follows: fr_fix has the size of the smallest
660 opcode (like BRA.S). We store the number of total bytes we need in
661 fr_subtype. When we're done relaxing, we use fr_subtype and the
662 existing opcode bytes to figure out what actual opcode we need to
663 put in there. If the fixup isn't resolvable now, we use the
666 #define TRACE_RELAX 0
667 #define tprintf if (TRACE_RELAX) printf
680 /* We're looking for these types of relaxations:
682 BT 00110001 sbit0cc1 addr---- (cc is 10 (BF) or 01 (BT))
683 B~T 00110001 sbit0cc1 00000011 11101110 pcrel16- -------- (BR $!pcrel20)
685 BT sfr 00110001 sbit0cc0 sfr----- addr----
686 BT ES: 00010001 00101110 sbit0cc1 addr----
689 B~C 110111cc 00000011 11101110 pcrel16- -------- (BR $!pcrel20)
691 BH 01100001 110c0011 00000011 11101110 pcrel16- -------- (BR $!pcrel20)
692 B~H 01100001 110c0011 00000011 11101110 pcrel16- -------- (BR $!pcrel20)
695 /* Given the opcode bytes at OP, figure out which opcode it is and
696 return the type of opcode. We use this to re-encode the opcode as
697 a different size later. */
700 rl78_opcode_type (char * op
)
703 && ((op
[1] & 0x0f) == 0x05
704 || (op
[1] & 0x0f) == 0x03))
708 && ((op
[1] & 0x0f) == 0x04
709 || (op
[1] & 0x0f) == 0x02))
714 && ((op
[2] & 0x0f) == 0x05
715 || (op
[2] & 0x0f) == 0x03))
718 if ((op
[0] & 0xfc) == 0xdc)
722 && (op
[1] & 0xef) == 0xc3)
728 /* Returns zero if *addrP has the target address. Else returns nonzero
729 if we cannot compute the target address yet. */
732 rl78_frag_fix_value (fragS
* fragP
,
740 rl78_bytesT
* b
= fragP
->tc_frag_data
;
741 expressionS
* exp
= & b
->fixups
[which
].exp
;
743 if (need_diff
&& exp
->X_op
!= O_subtract
)
746 if (exp
->X_add_symbol
)
748 if (S_FORCE_RELOC (exp
->X_add_symbol
, 1))
750 if (S_GET_SEGMENT (exp
->X_add_symbol
) != segment
)
752 addr
+= S_GET_VALUE (exp
->X_add_symbol
);
755 if (exp
->X_op_symbol
)
757 if (exp
->X_op
!= O_subtract
)
759 if (S_FORCE_RELOC (exp
->X_op_symbol
, 1))
761 if (S_GET_SEGMENT (exp
->X_op_symbol
) != segment
)
763 addr
-= S_GET_VALUE (exp
->X_op_symbol
);
767 addr
+= exp
->X_add_number
;
772 /* Estimate how big the opcode is after this relax pass. The return
773 value is the difference between fr_fix and the actual size. We
774 compute the total size in rl78_relax_frag and store it in fr_subtype,
775 sowe only need to subtract fx_fix and return it. */
778 md_estimate_size_before_relax (fragS
* fragP ATTRIBUTE_UNUSED
, segT segment ATTRIBUTE_UNUSED
)
783 /* This is the size of the opcode that's accounted for in fr_fix. */
784 opfixsize
= fragP
->fr_fix
- (fragP
->fr_opcode
- fragP
->fr_literal
);
785 /* This is the size of the opcode that isn't. */
786 delta
= (fragP
->fr_subtype
- opfixsize
);
788 tprintf (" -> opfixsize %d delta %d\n", opfixsize
, delta
);
792 /* Given the new addresses for this relax pass, figure out how big
793 each opcode must be. We store the total number of bytes needed in
794 fr_subtype. The return value is the difference between the size
795 after the last pass and the size after this pass, so we use the old
796 fr_subtype to calculate the difference. */
799 rl78_relax_frag (segT segment ATTRIBUTE_UNUSED
, fragS
* fragP
, long stretch
)
801 addressT addr0
, sym_addr
;
804 int oldsize
= fragP
->fr_subtype
;
805 int newsize
= oldsize
;
809 mypc
= fragP
->fr_address
+ (fragP
->fr_opcode
- fragP
->fr_literal
);
811 /* If we ever get more than one reloc per opcode, this is the one
815 optype
= rl78_opcode_type (fragP
->fr_opcode
);
816 /* Try to get the target address. */
817 if (rl78_frag_fix_value (fragP
, segment
, ri
, & addr0
,
818 fragP
->tc_frag_data
->relax
[ri
].type
!= RL78_RELAX_BRANCH
,
821 /* If we don't, we must use the maximum size for the linker. */
822 switch (fragP
->tc_frag_data
->relax
[ri
].type
)
824 case RL78_RELAX_BRANCH
:
847 fragP
->fr_subtype
= newsize
;
848 tprintf (" -> new %d old %d delta %d (external)\n", newsize
, oldsize
, newsize
-oldsize
);
849 return newsize
- oldsize
;
855 switch (fragP
->tc_frag_data
->relax
[ri
].type
)
857 case RL78_RELAX_BRANCH
:
858 disp
= (int) addr0
- (int) mypc
;
863 if (disp
>= -128 && (disp
- (oldsize
-2)) <= 127)
870 if (disp
>= -128 && (disp
- (oldsize
-3)) <= 127)
876 if (disp
>= -128 && (disp
- (oldsize
-1)) <= 127)
882 if (disp
>= -128 && (disp
- (oldsize
-2)) <= 127)
894 /* This prevents infinite loops in align-heavy sources. */
895 if (newsize
< oldsize
)
897 if (fragP
->tc_frag_data
->times_shrank
> 10
898 && fragP
->tc_frag_data
->times_grown
> 10)
900 if (fragP
->tc_frag_data
->times_shrank
< 20)
901 fragP
->tc_frag_data
->times_shrank
++;
903 else if (newsize
> oldsize
)
905 if (fragP
->tc_frag_data
->times_grown
< 20)
906 fragP
->tc_frag_data
->times_grown
++;
909 fragP
->fr_subtype
= newsize
;
910 tprintf (" -> new %d old %d delta %d\n", newsize
, oldsize
, newsize
-oldsize
);
911 return newsize
- oldsize
;
914 /* This lets us test for the opcode type and the desired size in a
916 #define OPCODE(type,size) ((type) * 16 + (size))
918 /* Given the opcode stored in fr_opcode and the number of bytes we
919 think we need, encode a new opcode. We stored a pointer to the
920 fixup for this opcode in the tc_frag_data structure. If we can do
921 the fixup here, we change the relocation type to "none" (we test
922 for that in tc_gen_reloc) else we change it to the right type for
923 the new (biggest) opcode. */
926 md_convert_frag (bfd
* abfd ATTRIBUTE_UNUSED
,
927 segT segment ATTRIBUTE_UNUSED
,
928 fragS
* fragP ATTRIBUTE_UNUSED
)
930 rl78_bytesT
* rl78b
= fragP
->tc_frag_data
;
931 addressT addr0
, mypc
;
933 int reloc_type
, reloc_adjust
;
934 char * op
= fragP
->fr_opcode
;
937 int fi
= (rl78b
->n_fixups
> 1) ? 1 : 0;
938 fixS
* fix
= rl78b
->fixups
[fi
].fixP
;
940 /* If we ever get more than one reloc per opcode, this is the one
944 /* We used a new frag for this opcode, so the opcode address should
945 be the frag address. */
946 mypc
= fragP
->fr_address
+ (fragP
->fr_opcode
- fragP
->fr_literal
);
947 tprintf("\033[32mmypc: 0x%x\033[0m\n", (int)mypc
);
949 /* Try to get the target address. If we fail here, we just use the
951 if (rl78_frag_fix_value (fragP
, segment
, 0, & addr0
,
952 fragP
->tc_frag_data
->relax
[ri
].type
!= RL78_RELAX_BRANCH
, 0))
954 /* We don't know the target address. */
958 tprintf ("unknown addr ? - %x = ?\n", (int)mypc
);
962 /* We know the target address, and it's in addr0. */
963 disp
= (int) addr0
- (int) mypc
;
964 tprintf ("known addr %x - %x = %d\n", (int)addr0
, (int)mypc
, disp
);
970 reloc_type
= BFD_RELOC_NONE
;
973 switch (fragP
->tc_frag_data
->relax
[ri
].type
)
975 case RL78_RELAX_BRANCH
:
976 switch (OPCODE (rl78_opcode_type (fragP
->fr_opcode
), fragP
->fr_subtype
))
979 case OPCODE (OT_bt
, 3): /* BT A,$ - no change. */
984 case OPCODE (OT_bt
, 6): /* BT A,$ - long version. */
986 op
[1] ^= 0x06; /* toggle conditional. */
987 op
[2] = 3; /* displacement over long branch. */
989 op
[3] = 0xEE; /* BR $!addr20 */
992 reloc_type
= keep_reloc
? BFD_RELOC_16_PCREL
: BFD_RELOC_NONE
;
996 case OPCODE (OT_bt_sfr
, 4): /* BT PSW,$ - no change. */
1001 case OPCODE (OT_bt_sfr
, 7): /* BT PSW,$ - long version. */
1003 op
[1] ^= 0x06; /* toggle conditional. */
1004 op
[3] = 3; /* displacement over long branch. */
1006 op
[4] = 0xEE; /* BR $!addr20 */
1007 op
[5] = disp
& 0xff;
1009 reloc_type
= keep_reloc
? BFD_RELOC_16_PCREL
: BFD_RELOC_NONE
;
1013 case OPCODE (OT_bt_es
, 4): /* BT ES:[HL],$ - no change. */
1018 case OPCODE (OT_bt_es
, 7): /* BT PSW,$ - long version. */
1020 op
[2] ^= 0x06; /* toggle conditional. */
1021 op
[3] = 3; /* displacement over long branch. */
1023 op
[4] = 0xEE; /* BR $!addr20 */
1024 op
[5] = disp
& 0xff;
1026 reloc_type
= keep_reloc
? BFD_RELOC_16_PCREL
: BFD_RELOC_NONE
;
1030 case OPCODE (OT_bc
, 2): /* BC $ - no change. */
1035 case OPCODE (OT_bc
, 5): /* BC $ - long version. */
1037 op
[0] ^= 0x02; /* toggle conditional. */
1040 op
[2] = 0xEE; /* BR $!addr20 */
1041 op
[3] = disp
& 0xff;
1043 reloc_type
= keep_reloc
? BFD_RELOC_16_PCREL
: BFD_RELOC_NONE
;
1047 case OPCODE (OT_bh
, 3): /* BH $ - no change. */
1052 case OPCODE (OT_bh
, 6): /* BC $ - long version. */
1054 op
[1] ^= 0x10; /* toggle conditional. */
1057 op
[3] = 0xEE; /* BR $!addr20 */
1058 op
[4] = disp
& 0xff;
1060 reloc_type
= keep_reloc
? BFD_RELOC_16_PCREL
: BFD_RELOC_NONE
;
1065 fprintf(stderr
, "Missed case %d %d at 0x%lx\n",
1066 rl78_opcode_type (fragP
->fr_opcode
), fragP
->fr_subtype
, mypc
);
1073 if (rl78b
->n_fixups
)
1075 reloc_type
= fix
->fx_r_type
;
1081 if (rl78b
->n_fixups
)
1084 fix
->fx_r_type
= reloc_type
;
1085 fix
->fx_where
+= reloc_adjust
;
1088 case BFD_RELOC_NONE
:
1094 case BFD_RELOC_16_PCREL
:
1100 fragP
->fr_fix
= fragP
->fr_subtype
+ (fragP
->fr_opcode
- fragP
->fr_literal
);
1101 tprintf ("fragP->fr_fix now %ld (%d + (%p - %p)\n", (long) fragP
->fr_fix
,
1102 fragP
->fr_subtype
, fragP
->fr_opcode
, fragP
->fr_literal
);
1105 tprintf ("compare 0x%lx vs 0x%lx - 0x%lx = 0x%lx (%p)\n",
1106 (long)fragP
->fr_fix
,
1107 (long)fragP
->fr_next
->fr_address
, (long)fragP
->fr_address
,
1108 (long)(fragP
->fr_next
->fr_address
- fragP
->fr_address
),
1111 if (fragP
->fr_next
!= NULL
1112 && ((offsetT
) (fragP
->fr_next
->fr_address
- fragP
->fr_address
)
1114 as_bad (_("bad frag at %p : fix %ld addr %ld %ld \n"), fragP
,
1115 (long) fragP
->fr_fix
,
1116 (long) fragP
->fr_address
, (long) fragP
->fr_next
->fr_address
);
1119 /* End of relaxation code.
1120 ----------------------------------------------------------------------*/
1124 tc_gen_reloc (asection
* seg ATTRIBUTE_UNUSED
, fixS
* fixp
)
1126 static arelent
* reloc
[8];
1129 if (fixp
->fx_r_type
== BFD_RELOC_NONE
)
1136 && S_GET_SEGMENT (fixp
->fx_subsy
) == absolute_section
)
1138 fixp
->fx_offset
-= S_GET_VALUE (fixp
->fx_subsy
);
1139 fixp
->fx_subsy
= NULL
;
1142 reloc
[0] = (arelent
*) xmalloc (sizeof (arelent
));
1143 reloc
[0]->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1144 * reloc
[0]->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1145 reloc
[0]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1146 reloc
[0]->addend
= fixp
->fx_offset
;
1148 if (fixp
->fx_r_type
== BFD_RELOC_RL78_32_OP
1151 fixp
->fx_r_type
= BFD_RELOC_RL78_DIFF
;
1154 #define OPX(REL,SYM,ADD) \
1155 reloc[rp] = (arelent *) xmalloc (sizeof (arelent)); \
1156 reloc[rp]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); \
1157 reloc[rp]->howto = bfd_reloc_type_lookup (stdoutput, REL); \
1158 reloc[rp]->addend = ADD; \
1159 * reloc[rp]->sym_ptr_ptr = SYM; \
1160 reloc[rp]->address = fixp->fx_frag->fr_address + fixp->fx_where; \
1162 #define OPSYM(SYM) OPX(BFD_RELOC_RL78_SYM, SYM, 0)
1163 #define OPIMM(IMM) OPX(BFD_RELOC_RL78_SYM, abs_symbol.bsym, IMM)
1164 #define OP(OP) OPX(BFD_RELOC_RL78_##OP, *reloc[0]->sym_ptr_ptr, 0)
1165 #define SYM0() reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RL78_SYM)
1169 /* Certain BFD relocations cannot be translated directly into
1170 a single (non-Red Hat) RL78 relocation, but instead need
1171 multiple RL78 relocations - handle them here. */
1172 switch (fixp
->fx_r_type
)
1174 case BFD_RELOC_RL78_DIFF
:
1176 OPSYM (symbol_get_bfdsym (fixp
->fx_subsy
));
1179 switch (fixp
->fx_size
)
1193 case BFD_RELOC_RL78_NEG32
:
1199 case BFD_RELOC_RL78_CODE
:
1204 case BFD_RELOC_RL78_LO16
:
1211 case BFD_RELOC_RL78_HI16
:
1218 case BFD_RELOC_RL78_HI8
:
1228 reloc
[0]->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1237 rl78_validate_fix_sub (struct fix
* f
)
1239 /* We permit the subtraction of two symbols in a few cases. */
1240 /* mov #sym1-sym2, R3 */
1241 if (f
->fx_r_type
== BFD_RELOC_RL78_32_OP
)
1243 /* .long sym1-sym2 */
1244 if (f
->fx_r_type
== BFD_RELOC_RL78_DIFF
1246 && (f
->fx_size
== 4 || f
->fx_size
== 2 || f
->fx_size
== 1))
1252 md_pcrel_from_section (fixS
* fixP
, segT sec
)
1256 if (fixP
->fx_addsy
!= NULL
1257 && (! S_IS_DEFINED (fixP
->fx_addsy
)
1258 || S_GET_SEGMENT (fixP
->fx_addsy
) != sec
))
1259 /* The symbol is undefined (or is defined but not in this section).
1260 Let the linker figure it out. */
1263 rv
= fixP
->fx_frag
->fr_address
+ fixP
->fx_where
;
1264 switch (fixP
->fx_r_type
)
1266 case BFD_RELOC_8_PCREL
:
1269 case BFD_RELOC_16_PCREL
:
1279 md_apply_fix (struct fix
* f ATTRIBUTE_UNUSED
,
1280 valueT
* t ATTRIBUTE_UNUSED
,
1281 segT s ATTRIBUTE_UNUSED
)
1286 if (f
->fx_addsy
&& S_FORCE_RELOC (f
->fx_addsy
, 1))
1288 if (f
->fx_subsy
&& S_FORCE_RELOC (f
->fx_subsy
, 1))
1291 op
= f
->fx_frag
->fr_literal
+ f
->fx_where
;
1292 val
= (unsigned long) * t
;
1294 switch (f
->fx_r_type
)
1296 case BFD_RELOC_NONE
:
1299 case BFD_RELOC_RL78_RELAX
:
1304 case BFD_RELOC_8_PCREL
:
1309 case BFD_RELOC_16_PCREL
:
1310 case BFD_RELOC_RL78_CODE
:
1322 case BFD_RELOC_RL78_DIFF
:
1330 as_bad (_("Unknown reloc in md_apply_fix: %s"),
1331 bfd_get_reloc_code_name (f
->fx_r_type
));
1335 if (f
->fx_addsy
== NULL
)
1340 md_section_align (segT segment
, valueT size
)
1342 int align
= bfd_get_section_alignment (stdoutput
, segment
);
1343 return ((size
+ (1 << align
) - 1) & (-1 << align
));