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