Add support for the C_SKY series of processors.
[deliverable/binutils-gdb.git] / opcodes / disassemble.c
1 /* Select disassembly routine for specified architecture.
2 Copyright (C) 1994-2018 Free Software Foundation, Inc.
3
4 This file is part of the GNU opcodes library.
5
6 This library 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 of the License, or
9 (at your option) any later version.
10
11 This program 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 this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21 #include "sysdep.h"
22 #include "disassemble.h"
23 #include "safe-ctype.h"
24 #include <assert.h>
25
26 #ifdef ARCH_all
27 #define ARCH_aarch64
28 #define ARCH_alpha
29 #define ARCH_arc
30 #define ARCH_arm
31 #define ARCH_avr
32 #define ARCH_bfin
33 #define ARCH_cr16
34 #define ARCH_cris
35 #define ARCH_crx
36 #define ARCH_csky
37 #define ARCH_d10v
38 #define ARCH_d30v
39 #define ARCH_dlx
40 #define ARCH_epiphany
41 #define ARCH_fr30
42 #define ARCH_frv
43 #define ARCH_ft32
44 #define ARCH_h8300
45 #define ARCH_hppa
46 #define ARCH_i386
47 #define ARCH_ia64
48 #define ARCH_ip2k
49 #define ARCH_iq2000
50 #define ARCH_lm32
51 #define ARCH_m32c
52 #define ARCH_m32r
53 #define ARCH_m68hc11
54 #define ARCH_m68hc12
55 #define ARCH_m68k
56 #define ARCH_mcore
57 #define ARCH_mep
58 #define ARCH_metag
59 #define ARCH_microblaze
60 #define ARCH_mips
61 #define ARCH_mmix
62 #define ARCH_mn10200
63 #define ARCH_mn10300
64 #define ARCH_moxie
65 #define ARCH_mt
66 #define ARCH_msp430
67 #define ARCH_nds32
68 #define ARCH_nfp
69 #define ARCH_nios2
70 #define ARCH_ns32k
71 #define ARCH_or1k
72 #define ARCH_pdp11
73 #define ARCH_pj
74 #define ARCH_powerpc
75 #define ARCH_pru
76 #define ARCH_riscv
77 #define ARCH_rs6000
78 #define ARCH_rl78
79 #define ARCH_rx
80 #define ARCH_s390
81 #define ARCH_score
82 #define ARCH_sh
83 #define ARCH_sparc
84 #define ARCH_spu
85 #define ARCH_tic30
86 #define ARCH_tic4x
87 #define ARCH_tic54x
88 #define ARCH_tic6x
89 #define ARCH_tic80
90 #define ARCH_tilegx
91 #define ARCH_tilepro
92 #define ARCH_v850
93 #define ARCH_vax
94 #define ARCH_visium
95 #define ARCH_wasm32
96 #define ARCH_xstormy16
97 #define ARCH_xc16x
98 #define ARCH_xgate
99 #define ARCH_xtensa
100 #define ARCH_z80
101 #define ARCH_z8k
102 #endif
103
104 #ifdef ARCH_m32c
105 #include "m32c-desc.h"
106 #endif
107
108 disassembler_ftype
109 disassembler (enum bfd_architecture a,
110 bfd_boolean big ATTRIBUTE_UNUSED,
111 unsigned long mach ATTRIBUTE_UNUSED,
112 bfd *abfd ATTRIBUTE_UNUSED)
113 {
114 disassembler_ftype disassemble;
115
116 switch (a)
117 {
118 /* If you add a case to this table, also add it to the
119 ARCH_all definition right above this function. */
120 #ifdef ARCH_aarch64
121 case bfd_arch_aarch64:
122 disassemble = print_insn_aarch64;
123 break;
124 #endif
125 #ifdef ARCH_alpha
126 case bfd_arch_alpha:
127 disassemble = print_insn_alpha;
128 break;
129 #endif
130 #ifdef ARCH_arc
131 case bfd_arch_arc:
132 disassemble = arc_get_disassembler (abfd);
133 break;
134 #endif
135 #ifdef ARCH_arm
136 case bfd_arch_arm:
137 if (big)
138 disassemble = print_insn_big_arm;
139 else
140 disassemble = print_insn_little_arm;
141 break;
142 #endif
143 #ifdef ARCH_avr
144 case bfd_arch_avr:
145 disassemble = print_insn_avr;
146 break;
147 #endif
148 #ifdef ARCH_bfin
149 case bfd_arch_bfin:
150 disassemble = print_insn_bfin;
151 break;
152 #endif
153 #ifdef ARCH_cr16
154 case bfd_arch_cr16:
155 disassemble = print_insn_cr16;
156 break;
157 #endif
158 #ifdef ARCH_cris
159 case bfd_arch_cris:
160 disassemble = cris_get_disassembler (abfd);
161 break;
162 #endif
163 #ifdef ARCH_crx
164 case bfd_arch_crx:
165 disassemble = print_insn_crx;
166 break;
167 #endif
168 #ifdef ARCH_csky
169 case bfd_arch_csky:
170 disassemble = csky_get_disassembler (abfd);
171 break;
172 #endif
173
174 #ifdef ARCH_d10v
175 case bfd_arch_d10v:
176 disassemble = print_insn_d10v;
177 break;
178 #endif
179 #ifdef ARCH_d30v
180 case bfd_arch_d30v:
181 disassemble = print_insn_d30v;
182 break;
183 #endif
184 #ifdef ARCH_dlx
185 case bfd_arch_dlx:
186 /* As far as I know we only handle big-endian DLX objects. */
187 disassemble = print_insn_dlx;
188 break;
189 #endif
190 #ifdef ARCH_h8300
191 case bfd_arch_h8300:
192 if (mach == bfd_mach_h8300h || mach == bfd_mach_h8300hn)
193 disassemble = print_insn_h8300h;
194 else if (mach == bfd_mach_h8300s
195 || mach == bfd_mach_h8300sn
196 || mach == bfd_mach_h8300sx
197 || mach == bfd_mach_h8300sxn)
198 disassemble = print_insn_h8300s;
199 else
200 disassemble = print_insn_h8300;
201 break;
202 #endif
203 #ifdef ARCH_hppa
204 case bfd_arch_hppa:
205 disassemble = print_insn_hppa;
206 break;
207 #endif
208 #ifdef ARCH_i386
209 case bfd_arch_i386:
210 case bfd_arch_iamcu:
211 case bfd_arch_l1om:
212 case bfd_arch_k1om:
213 disassemble = print_insn_i386;
214 break;
215 #endif
216 #ifdef ARCH_ia64
217 case bfd_arch_ia64:
218 disassemble = print_insn_ia64;
219 break;
220 #endif
221 #ifdef ARCH_ip2k
222 case bfd_arch_ip2k:
223 disassemble = print_insn_ip2k;
224 break;
225 #endif
226 #ifdef ARCH_epiphany
227 case bfd_arch_epiphany:
228 disassemble = print_insn_epiphany;
229 break;
230 #endif
231 #ifdef ARCH_fr30
232 case bfd_arch_fr30:
233 disassemble = print_insn_fr30;
234 break;
235 #endif
236 #ifdef ARCH_lm32
237 case bfd_arch_lm32:
238 disassemble = print_insn_lm32;
239 break;
240 #endif
241 #ifdef ARCH_m32r
242 case bfd_arch_m32r:
243 disassemble = print_insn_m32r;
244 break;
245 #endif
246 #if defined(ARCH_m68hc11) || defined(ARCH_m68hc12) \
247 || defined(ARCH_9s12x) || defined(ARCH_m9s12xg)
248 case bfd_arch_m68hc11:
249 disassemble = print_insn_m68hc11;
250 break;
251 case bfd_arch_m68hc12:
252 disassemble = print_insn_m68hc12;
253 break;
254 case bfd_arch_m9s12x:
255 disassemble = print_insn_m9s12x;
256 break;
257 case bfd_arch_m9s12xg:
258 disassemble = print_insn_m9s12xg;
259 break;
260 #endif
261 #if defined(ARCH_s12z)
262 case bfd_arch_s12z:
263 disassemble = print_insn_s12z;
264 break;
265 #endif
266 #ifdef ARCH_m68k
267 case bfd_arch_m68k:
268 disassemble = print_insn_m68k;
269 break;
270 #endif
271 #ifdef ARCH_mt
272 case bfd_arch_mt:
273 disassemble = print_insn_mt;
274 break;
275 #endif
276 #ifdef ARCH_microblaze
277 case bfd_arch_microblaze:
278 disassemble = print_insn_microblaze;
279 break;
280 #endif
281 #ifdef ARCH_msp430
282 case bfd_arch_msp430:
283 disassemble = print_insn_msp430;
284 break;
285 #endif
286 #ifdef ARCH_nds32
287 case bfd_arch_nds32:
288 disassemble = print_insn_nds32;
289 break;
290 #endif
291 #ifdef ARCH_nfp
292 case bfd_arch_nfp:
293 disassemble = print_insn_nfp;
294 break;
295 #endif
296 #ifdef ARCH_ns32k
297 case bfd_arch_ns32k:
298 disassemble = print_insn_ns32k;
299 break;
300 #endif
301 #ifdef ARCH_mcore
302 case bfd_arch_mcore:
303 disassemble = print_insn_mcore;
304 break;
305 #endif
306 #ifdef ARCH_mep
307 case bfd_arch_mep:
308 disassemble = print_insn_mep;
309 break;
310 #endif
311 #ifdef ARCH_metag
312 case bfd_arch_metag:
313 disassemble = print_insn_metag;
314 break;
315 #endif
316 #ifdef ARCH_mips
317 case bfd_arch_mips:
318 if (big)
319 disassemble = print_insn_big_mips;
320 else
321 disassemble = print_insn_little_mips;
322 break;
323 #endif
324 #ifdef ARCH_mmix
325 case bfd_arch_mmix:
326 disassemble = print_insn_mmix;
327 break;
328 #endif
329 #ifdef ARCH_mn10200
330 case bfd_arch_mn10200:
331 disassemble = print_insn_mn10200;
332 break;
333 #endif
334 #ifdef ARCH_mn10300
335 case bfd_arch_mn10300:
336 disassemble = print_insn_mn10300;
337 break;
338 #endif
339 #ifdef ARCH_nios2
340 case bfd_arch_nios2:
341 if (big)
342 disassemble = print_insn_big_nios2;
343 else
344 disassemble = print_insn_little_nios2;
345 break;
346 #endif
347 #ifdef ARCH_or1k
348 case bfd_arch_or1k:
349 disassemble = print_insn_or1k;
350 break;
351 #endif
352 #ifdef ARCH_pdp11
353 case bfd_arch_pdp11:
354 disassemble = print_insn_pdp11;
355 break;
356 #endif
357 #ifdef ARCH_pj
358 case bfd_arch_pj:
359 disassemble = print_insn_pj;
360 break;
361 #endif
362 #ifdef ARCH_powerpc
363 case bfd_arch_powerpc:
364 #endif
365 #ifdef ARCH_rs6000
366 case bfd_arch_rs6000:
367 #endif
368 #if defined ARCH_powerpc || defined ARCH_rs6000
369 if (big)
370 disassemble = print_insn_big_powerpc;
371 else
372 disassemble = print_insn_little_powerpc;
373 break;
374 #endif
375 #ifdef ARCH_pru
376 case bfd_arch_pru:
377 disassemble = print_insn_pru;
378 break;
379 #endif
380 #ifdef ARCH_riscv
381 case bfd_arch_riscv:
382 disassemble = print_insn_riscv;
383 break;
384 #endif
385 #ifdef ARCH_rl78
386 case bfd_arch_rl78:
387 disassemble = rl78_get_disassembler (abfd);
388 break;
389 #endif
390 #ifdef ARCH_rx
391 case bfd_arch_rx:
392 disassemble = print_insn_rx;
393 break;
394 #endif
395 #ifdef ARCH_s390
396 case bfd_arch_s390:
397 disassemble = print_insn_s390;
398 break;
399 #endif
400 #ifdef ARCH_score
401 case bfd_arch_score:
402 if (big)
403 disassemble = print_insn_big_score;
404 else
405 disassemble = print_insn_little_score;
406 break;
407 #endif
408 #ifdef ARCH_sh
409 case bfd_arch_sh:
410 disassemble = print_insn_sh;
411 break;
412 #endif
413 #ifdef ARCH_sparc
414 case bfd_arch_sparc:
415 disassemble = print_insn_sparc;
416 break;
417 #endif
418 #ifdef ARCH_spu
419 case bfd_arch_spu:
420 disassemble = print_insn_spu;
421 break;
422 #endif
423 #ifdef ARCH_tic30
424 case bfd_arch_tic30:
425 disassemble = print_insn_tic30;
426 break;
427 #endif
428 #ifdef ARCH_tic4x
429 case bfd_arch_tic4x:
430 disassemble = print_insn_tic4x;
431 break;
432 #endif
433 #ifdef ARCH_tic54x
434 case bfd_arch_tic54x:
435 disassemble = print_insn_tic54x;
436 break;
437 #endif
438 #ifdef ARCH_tic6x
439 case bfd_arch_tic6x:
440 disassemble = print_insn_tic6x;
441 break;
442 #endif
443 #ifdef ARCH_tic80
444 case bfd_arch_tic80:
445 disassemble = print_insn_tic80;
446 break;
447 #endif
448 #ifdef ARCH_ft32
449 case bfd_arch_ft32:
450 disassemble = print_insn_ft32;
451 break;
452 #endif
453 #ifdef ARCH_v850
454 case bfd_arch_v850:
455 case bfd_arch_v850_rh850:
456 disassemble = print_insn_v850;
457 break;
458 #endif
459 #ifdef ARCH_wasm32
460 case bfd_arch_wasm32:
461 disassemble = print_insn_wasm32;
462 break;
463 #endif
464 #ifdef ARCH_xgate
465 case bfd_arch_xgate:
466 disassemble = print_insn_xgate;
467 break;
468 #endif
469 #ifdef ARCH_xstormy16
470 case bfd_arch_xstormy16:
471 disassemble = print_insn_xstormy16;
472 break;
473 #endif
474 #ifdef ARCH_xc16x
475 case bfd_arch_xc16x:
476 disassemble = print_insn_xc16x;
477 break;
478 #endif
479 #ifdef ARCH_xtensa
480 case bfd_arch_xtensa:
481 disassemble = print_insn_xtensa;
482 break;
483 #endif
484 #ifdef ARCH_z80
485 case bfd_arch_z80:
486 disassemble = print_insn_z80;
487 break;
488 #endif
489 #ifdef ARCH_z8k
490 case bfd_arch_z8k:
491 if (mach == bfd_mach_z8001)
492 disassemble = print_insn_z8001;
493 else
494 disassemble = print_insn_z8002;
495 break;
496 #endif
497 #ifdef ARCH_vax
498 case bfd_arch_vax:
499 disassemble = print_insn_vax;
500 break;
501 #endif
502 #ifdef ARCH_visium
503 case bfd_arch_visium:
504 disassemble = print_insn_visium;
505 break;
506 #endif
507 #ifdef ARCH_frv
508 case bfd_arch_frv:
509 disassemble = print_insn_frv;
510 break;
511 #endif
512 #ifdef ARCH_moxie
513 case bfd_arch_moxie:
514 disassemble = print_insn_moxie;
515 break;
516 #endif
517 #ifdef ARCH_iq2000
518 case bfd_arch_iq2000:
519 disassemble = print_insn_iq2000;
520 break;
521 #endif
522 #ifdef ARCH_m32c
523 case bfd_arch_m32c:
524 disassemble = print_insn_m32c;
525 break;
526 #endif
527 #ifdef ARCH_tilegx
528 case bfd_arch_tilegx:
529 disassemble = print_insn_tilegx;
530 break;
531 #endif
532 #ifdef ARCH_tilepro
533 case bfd_arch_tilepro:
534 disassemble = print_insn_tilepro;
535 break;
536 #endif
537 default:
538 return 0;
539 }
540 return disassemble;
541 }
542
543 void
544 disassembler_usage (FILE *stream ATTRIBUTE_UNUSED)
545 {
546 #ifdef ARCH_aarch64
547 print_aarch64_disassembler_options (stream);
548 #endif
549 #ifdef ARCH_arc
550 print_arc_disassembler_options (stream);
551 #endif
552 #ifdef ARCH_arm
553 print_arm_disassembler_options (stream);
554 #endif
555 #ifdef ARCH_mips
556 print_mips_disassembler_options (stream);
557 #endif
558 #ifdef ARCH_nfp
559 print_nfp_disassembler_options (stream);
560 #endif
561 #ifdef ARCH_powerpc
562 print_ppc_disassembler_options (stream);
563 #endif
564 #ifdef ARCH_riscv
565 print_riscv_disassembler_options (stream);
566 #endif
567 #ifdef ARCH_i386
568 print_i386_disassembler_options (stream);
569 #endif
570 #ifdef ARCH_s390
571 print_s390_disassembler_options (stream);
572 #endif
573 #ifdef ARCH_wasm32
574 print_wasm32_disassembler_options (stream);
575 #endif
576
577 return;
578 }
579
580 void
581 disassemble_init_for_target (struct disassemble_info * info)
582 {
583 if (info == NULL)
584 return;
585
586 switch (info->arch)
587 {
588 #ifdef ARCH_aarch64
589 case bfd_arch_aarch64:
590 info->symbol_is_valid = aarch64_symbol_is_valid;
591 info->disassembler_needs_relocs = TRUE;
592 break;
593 #endif
594 #ifdef ARCH_arm
595 case bfd_arch_arm:
596 info->symbol_is_valid = arm_symbol_is_valid;
597 info->disassembler_needs_relocs = TRUE;
598 break;
599 #endif
600 #ifdef ARCH_csky
601 case bfd_arch_csky:
602 info->symbol_is_valid = csky_symbol_is_valid;
603 info->disassembler_needs_relocs = TRUE;
604 break;
605 #endif
606
607 #ifdef ARCH_ia64
608 case bfd_arch_ia64:
609 info->skip_zeroes = 16;
610 break;
611 #endif
612 #ifdef ARCH_tic4x
613 case bfd_arch_tic4x:
614 info->skip_zeroes = 32;
615 break;
616 #endif
617 #ifdef ARCH_mep
618 case bfd_arch_mep:
619 info->skip_zeroes = 256;
620 info->skip_zeroes_at_end = 0;
621 break;
622 #endif
623 #ifdef ARCH_metag
624 case bfd_arch_metag:
625 info->disassembler_needs_relocs = TRUE;
626 break;
627 #endif
628 #ifdef ARCH_m32c
629 case bfd_arch_m32c:
630 /* This processor in fact is little endian. The value set here
631 reflects the way opcodes are written in the cgen description. */
632 info->endian = BFD_ENDIAN_BIG;
633 if (! info->insn_sets)
634 {
635 info->insn_sets = cgen_bitset_create (ISA_MAX);
636 if (info->mach == bfd_mach_m16c)
637 cgen_bitset_set (info->insn_sets, ISA_M16C);
638 else
639 cgen_bitset_set (info->insn_sets, ISA_M32C);
640 }
641 break;
642 #endif
643 #ifdef ARCH_pru
644 case bfd_arch_pru:
645 info->disassembler_needs_relocs = TRUE;
646 break;
647 #endif
648 #ifdef ARCH_powerpc
649 case bfd_arch_powerpc:
650 #endif
651 #ifdef ARCH_rs6000
652 case bfd_arch_rs6000:
653 #endif
654 #if defined (ARCH_powerpc) || defined (ARCH_rs6000)
655 disassemble_init_powerpc (info);
656 break;
657 #endif
658 #ifdef ARCH_wasm32
659 case bfd_arch_wasm32:
660 disassemble_init_wasm32 (info);
661 break;
662 #endif
663 #ifdef ARCH_s390
664 case bfd_arch_s390:
665 disassemble_init_s390 (info);
666 break;
667 #endif
668 default:
669 break;
670 }
671 }
672
673 /* Remove whitespace and consecutive commas from OPTIONS. */
674
675 char *
676 remove_whitespace_and_extra_commas (char *options)
677 {
678 char *str;
679 size_t i, len;
680
681 if (options == NULL)
682 return NULL;
683
684 /* Strip off all trailing whitespace and commas. */
685 for (len = strlen (options); len > 0; len--)
686 {
687 if (!ISSPACE (options[len - 1]) && options[len - 1] != ',')
688 break;
689 options[len - 1] = '\0';
690 }
691
692 /* Convert all remaining whitespace to commas. */
693 for (i = 0; options[i] != '\0'; i++)
694 if (ISSPACE (options[i]))
695 options[i] = ',';
696
697 /* Remove consecutive commas. */
698 for (str = options; *str != '\0'; str++)
699 if (*str == ',' && (*(str + 1) == ',' || str == options))
700 {
701 char *next = str + 1;
702 while (*next == ',')
703 next++;
704 len = strlen (next);
705 if (str != options)
706 str++;
707 memmove (str, next, len);
708 next[len - (size_t)(next - str)] = '\0';
709 }
710 return (strlen (options) != 0) ? options : NULL;
711 }
712
713 /* Like STRCMP, but treat ',' the same as '\0' so that we match
714 strings like "foobar" against "foobar,xxyyzz,...". */
715
716 int
717 disassembler_options_cmp (const char *s1, const char *s2)
718 {
719 unsigned char c1, c2;
720
721 do
722 {
723 c1 = (unsigned char) *s1++;
724 if (c1 == ',')
725 c1 = '\0';
726 c2 = (unsigned char) *s2++;
727 if (c2 == ',')
728 c2 = '\0';
729 if (c1 == '\0')
730 return c1 - c2;
731 }
732 while (c1 == c2);
733
734 return c1 - c2;
735 }
This page took 0.049457 seconds and 4 git commands to generate.