diff options
author | meissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-07-23 10:28:06 +0000 |
---|---|---|
committer | meissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-07-23 10:28:06 +0000 |
commit | 46f8e3b0dc1cbb88c7dde984d0f0c2ce8935011d (patch) | |
tree | efd8e61a3d2ff9dcff5eb5bf03e25922191f7df5 /gcc/optc-gen.awk | |
parent | e22d2ad745ca3d2ac08936833a802ffc161fc89b (diff) | |
download | gcc-46f8e3b0dc1cbb88c7dde984d0f0c2ce8935011d.tar.gz |
Add ability to set target options (ix86 only) and optimization options on a function specific basis
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@138075 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/optc-gen.awk')
-rw-r--r-- | gcc/optc-gen.awk | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk index 79fe800018b..845efb4a515 100644 --- a/gcc/optc-gen.awk +++ b/gcc/optc-gen.awk @@ -28,6 +28,7 @@ BEGIN { n_opts = 0 n_langs = 0 + n_target_save = 0 quote = "\042" comma = "," FS=SUBSEP @@ -41,6 +42,11 @@ BEGIN { langs[n_langs] = $2 n_langs++; } + else if ($1 == "TargetSave") { + # Make sure the declarations are put in source order + target_save_decl[n_target_save] = $2 + n_target_save++ + } else { name = opt_args("Mask", $1) if (name == "") { @@ -64,10 +70,17 @@ print "#include " quote "intl.h" quote print "" print "#ifdef GCC_DRIVER" print "int target_flags;" +print "#else" +print "#include " quote "flags.h" quote +print "#include " quote "target.h" quote print "#endif /* GCC_DRIVER */" print "" +have_save = 0; for (i = 0; i < n_opts; i++) { + if (flag_set_p("Save", flags[i])) + have_save = 1; + name = var_name(flags[i]); if (name == "") continue; @@ -210,4 +223,310 @@ for (i = 0; i < n_opts; i++) { } print "};" + +print ""; +print "#if !defined(GCC_DRIVER) && !defined(IN_LIBGCC2)" +print ""; +print "/* Save optimization variables into a structure. */" +print "void"; +print "cl_optimization_save (struct cl_optimization *ptr)"; +print "{"; + +n_opt_char = 2; +n_opt_short = 0; +n_opt_int = 0; +n_opt_other = 0; +var_opt_char[0] = "optimize"; +var_opt_char[1] = "optimize_size"; +var_opt_range["optimize"] = "0, 255"; +var_opt_range["optimize_size"] = "0, 255"; + +# Sort by size to mimic how the structure is laid out to be friendlier to the +# cache. + +for (i = 0; i < n_opts; i++) { + if (flag_set_p("Optimization", flags[i])) { + name = var_name(flags[i]) + if(name == "") + continue; + + if(name in var_opt_seen) + continue; + + var_opt_seen[name]++; + otype = var_type_struct(flags[i]); + if (otype ~ "^((un)?signed +)?int *$") + var_opt_int[n_opt_int++] = name; + + else if (otype ~ "^((un)?signed +)?short *$") + var_opt_short[n_opt_short++] = name; + + else if (otype ~ "^((un)?signed +)?char *$") { + var_opt_char[n_opt_char++] = name; + if (otype ~ "^unsigned +char *$") + var_opt_range[name] = "0, 255" + else if (otype ~ "^signed +char *$") + var_opt_range[name] = "-128, 127" + } + else + var_opt_other[n_opt_other++] = name; + } +} + +for (i = 0; i < n_opt_char; i++) { + name = var_opt_char[i]; + if (var_opt_range[name] != "") + print " gcc_assert (IN_RANGE (" name ", " var_opt_range[name] "));"; +} + +print ""; +for (i = 0; i < n_opt_other; i++) { + print " ptr->" var_opt_other[i] " = " var_opt_other[i] ";"; +} + +for (i = 0; i < n_opt_int; i++) { + print " ptr->" var_opt_int[i] " = " var_opt_int[i] ";"; +} + +for (i = 0; i < n_opt_short; i++) { + print " ptr->" var_opt_short[i] " = " var_opt_short[i] ";"; +} + +for (i = 0; i < n_opt_char; i++) { + print " ptr->" var_opt_char[i] " = " var_opt_char[i] ";"; +} + +print "}"; + +print ""; +print "/* Restore optimization options from a structure. */"; +print "void"; +print "cl_optimization_restore (struct cl_optimization *ptr)"; +print "{"; + +for (i = 0; i < n_opt_other; i++) { + print " " var_opt_other[i] " = ptr->" var_opt_other[i] ";"; +} + +for (i = 0; i < n_opt_int; i++) { + print " " var_opt_int[i] " = ptr->" var_opt_int[i] ";"; +} + +for (i = 0; i < n_opt_short; i++) { + print " " var_opt_short[i] " = ptr->" var_opt_short[i] ";"; +} + +for (i = 0; i < n_opt_char; i++) { + print " " var_opt_char[i] " = ptr->" var_opt_char[i] ";"; +} + +print "}"; + +print ""; +print "/* Print optimization options from a structure. */"; +print "void"; +print "cl_optimization_print (FILE *file,"; +print " int indent_to,"; +print " struct cl_optimization *ptr)"; +print "{"; + +print " fputs (\"\\n\", file);"; +for (i = 0; i < n_opt_other; i++) { + print " if (ptr->" var_opt_other[i] ")"; + print " fprintf (file, \"%*s%s (0x%lx)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_other[i] "\","; + print " (unsigned long)ptr->" var_opt_other[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_int; i++) { + print " if (ptr->" var_opt_int[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_int[i] "\","; + print " ptr->" var_opt_int[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_short; i++) { + print " if (ptr->" var_opt_short[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_short[i] "\","; + print " ptr->" var_opt_short[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_char; i++) { + print " if (ptr->" var_opt_char[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_char[i] "\","; + print " ptr->" var_opt_char[i] ");"; + print ""; +} + +print "}"; + +print ""; +print "/* Save selected option variables into a structure. */" +print "void"; +print "cl_target_option_save (struct cl_target_option *ptr)"; +print "{"; + +n_target_char = 0; +n_target_short = 0; +n_target_int = 0; +n_target_other = 0; + +if (have_save) { + for (i = 0; i < n_opts; i++) { + if (flag_set_p("Save", flags[i])) { + name = var_name(flags[i]) + if(name == "") + name = "target_flags"; + + if(name in var_save_seen) + continue; + + var_save_seen[name]++; + otype = var_type_struct(flags[i]) + if (otype ~ "^((un)?signed +)?int *$") + var_target_int[n_target_int++] = name; + + else if (otype ~ "^((un)?signed +)?short *$") + var_target_short[n_target_short++] = name; + + else if (otype ~ "^((un)?signed +)?char *$") { + var_target_char[n_target_char++] = name; + if (otype ~ "^unsigned +char *$") + var_target_range[name] = "0, 255" + else if (otype ~ "^signed +char *$") + var_target_range[name] = "-128, 127" + } + else + var_target_other[n_target_other++] = name; + } + } +} else { + var_target_int[n_target_int++] = "target_flags"; +} + +have_assert = 0; +for (i = 0; i < n_target_char; i++) { + name = var_target_char[i]; + if (var_target_range[name] != "") { + have_assert = 1; + print " gcc_assert (IN_RANGE (" name ", " var_target_range[name] "));"; + } +} + +if (have_assert) + print ""; + +print " if (targetm.target_option.save)"; +print " targetm.target_option.save (ptr);"; +print ""; + +for (i = 0; i < n_target_other; i++) { + print " ptr->" var_target_other[i] " = " var_target_other[i] ";"; +} + +for (i = 0; i < n_target_int; i++) { + print " ptr->" var_target_int[i] " = " var_target_int[i] ";"; +} + +for (i = 0; i < n_target_short; i++) { + print " ptr->" var_target_short[i] " = " var_target_short[i] ";"; +} + +for (i = 0; i < n_target_char; i++) { + print " ptr->" var_target_char[i] " = " var_target_char[i] ";"; +} + +print "}"; + +print ""; +print "/* Restore selected current options from a structure. */"; +print "void"; +print "cl_target_option_restore (struct cl_target_option *ptr)"; +print "{"; + +for (i = 0; i < n_target_other; i++) { + print " " var_target_other[i] " = ptr->" var_target_other[i] ";"; +} + +for (i = 0; i < n_target_int; i++) { + print " " var_target_int[i] " = ptr->" var_target_int[i] ";"; +} + +for (i = 0; i < n_target_short; i++) { + print " " var_target_short[i] " = ptr->" var_target_short[i] ";"; +} + +for (i = 0; i < n_target_char; i++) { + print " " var_target_char[i] " = ptr->" var_target_char[i] ";"; +} + +# This must occur after the normal variables in case the code depends on those +# variables. +print ""; +print " if (targetm.target_option.restore)"; +print " targetm.target_option.restore (ptr);"; + +print "}"; + +print ""; +print "/* Print optimization options from a structure. */"; +print "void"; +print "cl_target_option_print (FILE *file,"; +print " int indent,"; +print " struct cl_target_option *ptr)"; +print "{"; + +print " fputs (\"\\n\", file);"; +for (i = 0; i < n_target_other; i++) { + print " if (ptr->" var_target_other[i] ")"; + print " fprintf (file, \"%*s%s (0x%lx)\\n\","; + print " indent, \"\","; + print " \"" var_target_other[i] "\","; + print " (unsigned long)ptr->" var_target_other[i] ");"; + print ""; +} + +for (i = 0; i < n_target_int; i++) { + print " if (ptr->" var_target_int[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent, \"\","; + print " \"" var_target_int[i] "\","; + print " ptr->" var_target_int[i] ");"; + print ""; +} + +for (i = 0; i < n_target_short; i++) { + print " if (ptr->" var_target_short[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent, \"\","; + print " \"" var_target_short[i] "\","; + print " ptr->" var_target_short[i] ");"; + print ""; +} + +for (i = 0; i < n_target_char; i++) { + print " if (ptr->" var_target_char[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent, \"\","; + print " \"" var_target_char[i] "\","; + print " ptr->" var_target_char[i] ");"; + print ""; +} + +print ""; +print " if (targetm.target_option.print)"; +print " targetm.target_option.print (file, indent, ptr);"; + +print "}"; +print "#endif"; + } |