11debfc3dSmrg /* Generate attribute information shared between driver and core
21debfc3dSmrg compilers (insn-attr-common.h) from machine description. Split out
31debfc3dSmrg of genattr.c.
4*8feb0f0bSmrg Copyright (C) 1991-2020 Free Software Foundation, Inc.
51debfc3dSmrg
61debfc3dSmrg This file is part of GCC.
71debfc3dSmrg
81debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
91debfc3dSmrg the terms of the GNU General Public License as published by the Free
101debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
111debfc3dSmrg version.
121debfc3dSmrg
131debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
141debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
151debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
161debfc3dSmrg for more details.
171debfc3dSmrg
181debfc3dSmrg You should have received a copy of the GNU General Public License
191debfc3dSmrg along with GCC; see the file COPYING3. If not see
201debfc3dSmrg <http://www.gnu.org/licenses/>. */
211debfc3dSmrg
221debfc3dSmrg
231debfc3dSmrg #include "bconfig.h"
241debfc3dSmrg #include "system.h"
251debfc3dSmrg #include "coretypes.h"
261debfc3dSmrg #include "tm.h"
271debfc3dSmrg #include "rtl.h"
281debfc3dSmrg #include "errors.h"
291debfc3dSmrg #include "read-md.h"
301debfc3dSmrg #include "gensupport.h"
311debfc3dSmrg
321debfc3dSmrg static void
write_upcase(const char * str)331debfc3dSmrg write_upcase (const char *str)
341debfc3dSmrg {
351debfc3dSmrg for (; *str; str++)
361debfc3dSmrg putchar (TOUPPER (*str));
371debfc3dSmrg }
381debfc3dSmrg
391debfc3dSmrg static void
gen_attr(md_rtx_info * info)401debfc3dSmrg gen_attr (md_rtx_info *info)
411debfc3dSmrg {
421debfc3dSmrg const char *p, *tag;
431debfc3dSmrg
441debfc3dSmrg rtx attr = info->def;
451debfc3dSmrg p = XSTR (attr, 1);
461debfc3dSmrg if (*p != '\0')
471debfc3dSmrg {
481debfc3dSmrg printf ("enum attr_%s {", XSTR (attr, 0));
491debfc3dSmrg
501debfc3dSmrg while ((tag = scan_comma_elt (&p)) != 0)
511debfc3dSmrg {
521debfc3dSmrg write_upcase (XSTR (attr, 0));
531debfc3dSmrg putchar ('_');
541debfc3dSmrg while (tag != p)
551debfc3dSmrg putchar (TOUPPER (*tag++));
561debfc3dSmrg if (*p == ',')
571debfc3dSmrg fputs (", ", stdout);
581debfc3dSmrg }
591debfc3dSmrg fputs ("};\n", stdout);
601debfc3dSmrg }
611debfc3dSmrg }
621debfc3dSmrg
631debfc3dSmrg int
main(int argc,const char ** argv)641debfc3dSmrg main (int argc, const char **argv)
651debfc3dSmrg {
661debfc3dSmrg bool have_delay = false;
671debfc3dSmrg bool have_sched = false;
681debfc3dSmrg
691debfc3dSmrg progname = "genattr-common";
701debfc3dSmrg
711debfc3dSmrg if (!init_rtx_reader_args (argc, argv))
721debfc3dSmrg return (FATAL_EXIT_CODE);
731debfc3dSmrg
741debfc3dSmrg puts ("/* Generated automatically by the program `genattr-common'");
751debfc3dSmrg puts (" from the machine description file `md'. */\n");
761debfc3dSmrg puts ("#ifndef GCC_INSN_ATTR_COMMON_H");
771debfc3dSmrg puts ("#define GCC_INSN_ATTR_COMMON_H\n");
781debfc3dSmrg
791debfc3dSmrg /* Read the machine description. */
801debfc3dSmrg
811debfc3dSmrg md_rtx_info info;
821debfc3dSmrg while (read_md_rtx (&info))
831debfc3dSmrg switch (GET_CODE (info.def))
841debfc3dSmrg {
851debfc3dSmrg case DEFINE_ATTR:
861debfc3dSmrg gen_attr (&info);
871debfc3dSmrg break;
881debfc3dSmrg
891debfc3dSmrg case DEFINE_DELAY:
901debfc3dSmrg have_delay = true;
911debfc3dSmrg break;
921debfc3dSmrg
931debfc3dSmrg case DEFINE_INSN_RESERVATION:
941debfc3dSmrg if (!have_sched)
951debfc3dSmrg {
961debfc3dSmrg printf ("#define INSN_SCHEDULING\n");
971debfc3dSmrg have_sched = true;
981debfc3dSmrg }
991debfc3dSmrg break;
1001debfc3dSmrg
1011debfc3dSmrg default:
1021debfc3dSmrg break;
1031debfc3dSmrg }
1041debfc3dSmrg
1051debfc3dSmrg printf ("#define DELAY_SLOTS %d\n", have_delay);
1061debfc3dSmrg puts ("\n#endif /* GCC_INSN_ATTR_COMMON_H */");
1071debfc3dSmrg
1081debfc3dSmrg if (ferror (stdout) || fflush (stdout) || fclose (stdout))
1091debfc3dSmrg return FATAL_EXIT_CODE;
1101debfc3dSmrg
1111debfc3dSmrg return SUCCESS_EXIT_CODE;
1121debfc3dSmrg }
113