1/* itbl-test.c 2 3 Copyright (C) 1997-2020 Free Software Foundation, Inc. 4 5 This file is part of GAS, the GNU Assembler. 6 7 GAS is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3, or (at your option) 10 any later version. 11 12 GAS is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GAS; see the file COPYING. If not, write to the Free 19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 20 02110-1301, USA. */ 21 22/* Stand-alone test for instruction specification table support. 23 Run using "itbl-test <itbl> <asm.s>" 24 where <itbl> is the name of the instruction table, 25 and <asm.s> is the name of the assembler fie. */ 26 27 28#include <stdio.h> 29#include <stdlib.h> 30#include <string.h> 31#include "itbl-ops.h" 32 33static int test_reg (e_processor processor, e_type type, char *name, 34 unsigned long val); 35 36int 37main (int argc, char **argv) 38{ 39 unsigned int insn; 40 FILE *fas; 41 int aline = 0; 42 char s[81], *name; 43 44 if (argc < 3) 45 { 46 printf ("usage: %s itbl asm.s\n", argv[0]); 47 exit (0); 48 } 49 if (itbl_parse (argv[1]) != 0) 50 { 51 printf ("failed to parse itbl\n"); 52 exit (0); 53 } 54 55 fas = fopen (argv[2], "r"); 56 if (fas == 0) 57 { 58 printf ("failed to open asm file %s\n", argv[2]); 59 exit (0); 60 } 61 while (fgets (s, 80, fas)) 62 { 63 char *p; 64 aline++; 65 66 if (p = strchr (s, ';'), p) /* strip comments */ 67 *p = 0; 68 if (p = strchr (s, '#'), p) /* strip comments */ 69 *p = 0; 70 p = s + strlen (s) - 1; 71 while (p >= s && (*p == ' ' || *p == '\t' || *p == '\n')) /* strip trailing spaces */ 72 p--; 73 *(p + 1) = 0; 74 p = s; 75 while (*p && (*p == ' ' || *p == '\t' || *p == '\n')) /* strip leading spaces */ 76 p++; 77 if (!*p) 78 continue; 79 80 name = itbl_get_field (&p); 81 insn = itbl_assemble (name, p); 82 if (insn == 0) 83 printf ("line %d: Invalid instruction (%s)\n", aline, s); 84 else 85 { 86 char buf[128]; 87 printf ("line %d: insn(%s) = 0x%x)\n", aline, s, insn); 88 if (!itbl_disassemble (buf, insn)) 89 printf ("line %d: Can't disassemble instruction " 90 "(0x%x)\n", aline, insn); 91 else 92 printf ("line %d: disasm(0x%x) = %s)\n", aline, insn, buf); 93 } 94 } 95 96 test_reg (1, e_dreg, "d1", 1); 97 test_reg (3, e_creg, "c2", 22); 98 test_reg (3, e_dreg, "d3", 3); 99 100 fclose (fas); 101 return 0; 102} 103 104static int 105test_reg (e_processor processor, e_type type, char *name, 106 unsigned long val) 107{ 108 char *n; 109 unsigned long v; 110 111 n = itbl_get_name (processor, type, val); 112 if (!n || strcmp (n, name)) 113 printf ("Error - reg name not found for proessor=%d, type=%d, val=%d\n", 114 processor, type, val); 115 else 116 printf ("name=%s found for processor=%d, type=%d, val=%d\n", 117 n, processor, type, val); 118 119 /* We require that names be unique among processors and types. */ 120 if (! itbl_get_reg_val (name, &v) 121 || v != val) 122 printf ("Error - reg val not found for processor=%d, type=%d, name=%s\n", 123 processor, type, name); 124 else 125 printf ("val=0x%x found for processor=%d, type=%d, name=%s\n", 126 v, processor, type, name); 127 return 0; 128} 129