1 /* Generate attribute information shared between driver and core 2 compilers (insn-attr-common.h) from machine description. Split out 3 of genattr.c. 4 Copyright (C) 1991-2021 Free Software Foundation, Inc. 5 6 This file is part of GCC. 7 8 GCC is free software; you can redistribute it and/or modify it under 9 the terms of the GNU General Public License as published by the Free 10 Software Foundation; either version 3, or (at your option) any later 11 version. 12 13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 14 WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16 for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GCC; see the file COPYING3. If not see 20 <http://www.gnu.org/licenses/>. */ 21 22 23 #include "bconfig.h" 24 #include "system.h" 25 #include "coretypes.h" 26 #include "tm.h" 27 #include "rtl.h" 28 #include "errors.h" 29 #include "read-md.h" 30 #include "gensupport.h" 31 32 static void 33 write_upcase (const char *str) 34 { 35 for (; *str; str++) 36 putchar (TOUPPER (*str)); 37 } 38 39 static void 40 gen_attr (md_rtx_info *info) 41 { 42 const char *p, *tag; 43 44 rtx attr = info->def; 45 p = XSTR (attr, 1); 46 if (*p != '\0') 47 { 48 printf ("enum attr_%s {", XSTR (attr, 0)); 49 50 while ((tag = scan_comma_elt (&p)) != 0) 51 { 52 write_upcase (XSTR (attr, 0)); 53 putchar ('_'); 54 while (tag != p) 55 putchar (TOUPPER (*tag++)); 56 if (*p == ',') 57 fputs (", ", stdout); 58 } 59 fputs ("};\n", stdout); 60 } 61 } 62 63 int 64 main (int argc, const char **argv) 65 { 66 bool have_delay = false; 67 bool have_sched = false; 68 69 progname = "genattr-common"; 70 71 if (!init_rtx_reader_args (argc, argv)) 72 return (FATAL_EXIT_CODE); 73 74 puts ("/* Generated automatically by the program `genattr-common'"); 75 puts (" from the machine description file `md'. */\n"); 76 puts ("#ifndef GCC_INSN_ATTR_COMMON_H"); 77 puts ("#define GCC_INSN_ATTR_COMMON_H\n"); 78 79 /* Read the machine description. */ 80 81 md_rtx_info info; 82 while (read_md_rtx (&info)) 83 switch (GET_CODE (info.def)) 84 { 85 case DEFINE_ATTR: 86 gen_attr (&info); 87 break; 88 89 case DEFINE_DELAY: 90 have_delay = true; 91 break; 92 93 case DEFINE_INSN_RESERVATION: 94 if (!have_sched) 95 { 96 printf ("#define INSN_SCHEDULING\n"); 97 have_sched = true; 98 } 99 break; 100 101 default: 102 break; 103 } 104 105 printf ("#define DELAY_SLOTS %d\n", have_delay); 106 puts ("\n#endif /* GCC_INSN_ATTR_COMMON_H */"); 107 108 if (ferror (stdout) || fflush (stdout) || fclose (stdout)) 109 return FATAL_EXIT_CODE; 110 111 return SUCCESS_EXIT_CODE; 112 } 113