xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/genattr-common.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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