optc-save-gen.awk 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. # Copyright (C) 2003-2015 Free Software Foundation, Inc.
  2. # Contributed by Kelley Cook, June 2004.
  3. # Original code from Neil Booth, May 2003.
  4. #
  5. # This program is free software; you can redistribute it and/or modify it
  6. # under the terms of the GNU General Public License as published by the
  7. # Free Software Foundation; either version 3, or (at your option) any
  8. # later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; see the file COPYING3. If not see
  17. # <http://www.gnu.org/licenses/>.
  18. # This Awk script reads in the option records generated from
  19. # opt-gather.awk, combines the flags of duplicate options and generates a
  20. # C file.
  21. #
  22. # This program uses functions from opt-functions.awk and code from
  23. # opt-read.awk.
  24. #
  25. # Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-save-gen.awk \
  26. # [-v header_name=header.h] < inputfile > options-save.c
  27. # Dump that array of options into a C file.
  28. END {
  29. print "/* This file is auto-generated by optc-save-gen.awk. */"
  30. print ""
  31. n_headers = split(header_name, headers, " ")
  32. for (i = 1; i <= n_headers; i++)
  33. print "#include " quote headers[i] quote
  34. print "#include " quote "opts.h" quote
  35. print "#include " quote "intl.h" quote
  36. print ""
  37. print "#include " quote "flags.h" quote
  38. print "#include " quote "target.h" quote
  39. print "#include " quote "inchash.h" quote
  40. print "#include " quote "hash-set.h" quote
  41. print "#include " quote "machmode.h" quote
  42. print "#include " quote "vec.h" quote
  43. print "#include " quote "double-int.h" quote
  44. print "#include " quote "input.h" quote
  45. print "#include " quote "alias.h" quote
  46. print "#include " quote "symtab.h" quote
  47. print "#include " quote "wide-int.h" quote
  48. print "#include " quote "inchash.h" quote
  49. print "#include " quote "tree.h" quote
  50. print "#include " quote "fold-const.h" quote
  51. print "#include " quote "tree-ssa-alias.h" quote
  52. print "#include " quote "is-a.h" quote
  53. print "#include " quote "predict.h" quote
  54. print "#include " quote "function.h" quote
  55. print "#include " quote "basic-block.h" quote
  56. print "#include " quote "gimple-expr.h" quote
  57. print "#include " quote "gimple.h" quote
  58. print "#include " quote "data-streamer.h" quote
  59. print "#include " quote "ipa-ref.h" quote
  60. print "#include " quote "cgraph.h" quote
  61. print ""
  62. if (n_extra_c_includes > 0) {
  63. for (i = 0; i < n_extra_c_includes; i++) {
  64. print "#include " quote extra_c_includes[i] quote
  65. }
  66. print ""
  67. }
  68. have_save = 0;
  69. if (n_extra_target_vars)
  70. have_save = 1
  71. for (i = 0; i < n_opts; i++) {
  72. if (flag_set_p("Save", flags[i]))
  73. have_save = 1;
  74. }
  75. print "/* Save optimization variables into a structure. */"
  76. print "void";
  77. print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)";
  78. print "{";
  79. n_opt_char = 3;
  80. n_opt_short = 0;
  81. n_opt_int = 0;
  82. n_opt_enum = 0;
  83. n_opt_other = 0;
  84. var_opt_char[0] = "optimize";
  85. var_opt_char[1] = "optimize_size";
  86. var_opt_char[2] = "optimize_debug";
  87. var_opt_range["optimize"] = "0, 255";
  88. var_opt_range["optimize_size"] = "0, 1";
  89. var_opt_range["optimize_debug"] = "0, 1";
  90. # Sort by size to mimic how the structure is laid out to be friendlier to the
  91. # cache.
  92. for (i = 0; i < n_opts; i++) {
  93. if (flag_set_p("Optimization", flags[i])) {
  94. name = var_name(flags[i])
  95. if(name == "")
  96. continue;
  97. if(name in var_opt_seen)
  98. continue;
  99. var_opt_seen[name]++;
  100. otype = var_type_struct(flags[i]);
  101. if (otype ~ "^((un)?signed +)?int *$")
  102. var_opt_int[n_opt_int++] = name;
  103. else if (otype ~ "^((un)?signed +)?short *$")
  104. var_opt_short[n_opt_short++] = name;
  105. else if (otype ~ ("^enum +[_" alnum "]+ *"))
  106. var_opt_enum[n_opt_enum++] = name;
  107. else if (otype ~ "^((un)?signed +)?char *$") {
  108. var_opt_char[n_opt_char++] = name;
  109. if (otype ~ "^unsigned +char *$")
  110. var_opt_range[name] = "0, 255"
  111. else if (otype ~ "^signed +char *$")
  112. var_opt_range[name] = "-128, 127"
  113. }
  114. else
  115. var_opt_other[n_opt_other++] = name;
  116. }
  117. }
  118. for (i = 0; i < n_opt_char; i++) {
  119. name = var_opt_char[i];
  120. if (var_opt_range[name] != "")
  121. print " gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));";
  122. }
  123. print "";
  124. for (i = 0; i < n_opt_other; i++) {
  125. print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";";
  126. }
  127. for (i = 0; i < n_opt_int; i++) {
  128. print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";";
  129. }
  130. for (i = 0; i < n_opt_enum; i++) {
  131. print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";";
  132. }
  133. for (i = 0; i < n_opt_short; i++) {
  134. print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";";
  135. }
  136. for (i = 0; i < n_opt_char; i++) {
  137. print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";";
  138. }
  139. print "}";
  140. print "";
  141. print "/* Restore optimization options from a structure. */";
  142. print "void";
  143. print "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)";
  144. print "{";
  145. for (i = 0; i < n_opt_other; i++) {
  146. print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";";
  147. }
  148. for (i = 0; i < n_opt_int; i++) {
  149. print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";";
  150. }
  151. for (i = 0; i < n_opt_enum; i++) {
  152. print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";";
  153. }
  154. for (i = 0; i < n_opt_short; i++) {
  155. print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";";
  156. }
  157. for (i = 0; i < n_opt_char; i++) {
  158. print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";";
  159. }
  160. print " targetm.override_options_after_change ();";
  161. print "}";
  162. print "";
  163. print "/* Print optimization options from a structure. */";
  164. print "void";
  165. print "cl_optimization_print (FILE *file,";
  166. print " int indent_to,";
  167. print " struct cl_optimization *ptr)";
  168. print "{";
  169. print " fputs (\"\\n\", file);";
  170. for (i = 0; i < n_opt_other; i++) {
  171. print " if (ptr->x_" var_opt_other[i] ")";
  172. print " fprintf (file, \"%*s%s (%#lx)\\n\",";
  173. print " indent_to, \"\",";
  174. print " \"" var_opt_other[i] "\",";
  175. print " (unsigned long)ptr->x_" var_opt_other[i] ");";
  176. print "";
  177. }
  178. for (i = 0; i < n_opt_int; i++) {
  179. print " if (ptr->x_" var_opt_int[i] ")";
  180. print " fprintf (file, \"%*s%s (%#x)\\n\",";
  181. print " indent_to, \"\",";
  182. print " \"" var_opt_int[i] "\",";
  183. print " ptr->x_" var_opt_int[i] ");";
  184. print "";
  185. }
  186. for (i = 0; i < n_opt_enum; i++) {
  187. print " fprintf (file, \"%*s%s (%#x)\\n\",";
  188. print " indent_to, \"\",";
  189. print " \"" var_opt_enum[i] "\",";
  190. print " (int) ptr->x_" var_opt_enum[i] ");";
  191. print "";
  192. }
  193. for (i = 0; i < n_opt_short; i++) {
  194. print " if (ptr->x_" var_opt_short[i] ")";
  195. print " fprintf (file, \"%*s%s (%#x)\\n\",";
  196. print " indent_to, \"\",";
  197. print " \"" var_opt_short[i] "\",";
  198. print " ptr->x_" var_opt_short[i] ");";
  199. print "";
  200. }
  201. for (i = 0; i < n_opt_char; i++) {
  202. print " if (ptr->x_" var_opt_char[i] ")";
  203. print " fprintf (file, \"%*s%s (%#x)\\n\",";
  204. print " indent_to, \"\",";
  205. print " \"" var_opt_char[i] "\",";
  206. print " ptr->x_" var_opt_char[i] ");";
  207. print "";
  208. }
  209. print "}";
  210. print "";
  211. print "/* Print different optimization variables from structures provided as arguments. */";
  212. print "void";
  213. print "cl_optimization_print_diff (FILE *file,";
  214. print " int indent_to,";
  215. print " struct cl_optimization *ptr1,";
  216. print " struct cl_optimization *ptr2)";
  217. print "{";
  218. print " fputs (\"\\n\", file);";
  219. for (i = 0; i < n_opt_other; i++) {
  220. print " if (ptr1->x_" var_opt_other[i] " != ptr2->x_" var_opt_other[i] ")";
  221. print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\",";
  222. print " indent_to, \"\",";
  223. print " \"" var_opt_other[i] "\",";
  224. print " (unsigned long)ptr1->x_" var_opt_other[i] ",";
  225. print " (unsigned long)ptr2->x_" var_opt_other[i] ");";
  226. print "";
  227. }
  228. for (i = 0; i < n_opt_int; i++) {
  229. print " if (ptr1->x_" var_opt_int[i] " != ptr2->x_" var_opt_int[i] ")";
  230. print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
  231. print " indent_to, \"\",";
  232. print " \"" var_opt_int[i] "\",";
  233. print " ptr1->x_" var_opt_int[i] ",";
  234. print " ptr2->x_" var_opt_int[i] ");";
  235. print "";
  236. }
  237. for (i = 0; i < n_opt_enum; i++) {
  238. print " if (ptr1->x_" var_opt_enum[i] " != ptr2->x_" var_opt_enum[i] ")";
  239. print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
  240. print " indent_to, \"\",";
  241. print " \"" var_opt_enum[i] "\",";
  242. print " (int) ptr1->x_" var_opt_enum[i] ",";
  243. print " (int) ptr2->x_" var_opt_enum[i] ");";
  244. print "";
  245. }
  246. for (i = 0; i < n_opt_short; i++) {
  247. print " if (ptr1->x_" var_opt_short[i] " != ptr2->x_" var_opt_short[i] ")";
  248. print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
  249. print " indent_to, \"\",";
  250. print " \"" var_opt_short[i] "\",";
  251. print " ptr1->x_" var_opt_short[i] ",";
  252. print " ptr2->x_" var_opt_short[i] ");";
  253. print "";
  254. }
  255. for (i = 0; i < n_opt_char; i++) {
  256. print " if (ptr1->x_" var_opt_char[i] " != ptr2->x_" var_opt_char[i] ")";
  257. print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
  258. print " indent_to, \"\",";
  259. print " \"" var_opt_char[i] "\",";
  260. print " ptr1->x_" var_opt_char[i] ",";
  261. print " ptr2->x_" var_opt_char[i] ");";
  262. print "";
  263. }
  264. print "}";
  265. print "";
  266. print "/* Save selected option variables into a structure. */"
  267. print "void";
  268. print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)";
  269. print "{";
  270. n_target_char = 0;
  271. n_target_short = 0;
  272. n_target_int = 0;
  273. n_target_enum = 0;
  274. n_target_other = 0;
  275. if (have_save) {
  276. for (i = 0; i < n_opts; i++) {
  277. if (flag_set_p("Save", flags[i])) {
  278. name = var_name(flags[i])
  279. if(name == "")
  280. name = "target_flags";
  281. if(name in var_save_seen)
  282. continue;
  283. var_save_seen[name]++;
  284. otype = var_type_struct(flags[i])
  285. if (otype ~ "^((un)?signed +)?int *$")
  286. var_target_int[n_target_int++] = name;
  287. else if (otype ~ "^((un)?signed +)?short *$")
  288. var_target_short[n_target_short++] = name;
  289. else if (otype ~ ("^enum +[_" alnum "]+ *$"))
  290. var_target_enum[n_target_enum++] = name;
  291. else if (otype ~ "^((un)?signed +)?char *$") {
  292. var_target_char[n_target_char++] = name;
  293. if (otype ~ "^unsigned +char *$")
  294. var_target_range[name] = "0, 255"
  295. else if (otype ~ "^signed +char *$")
  296. var_target_range[name] = "-128, 127"
  297. if (otype == var_type(flags[i]))
  298. var_target_range[name] = ""
  299. }
  300. else
  301. var_target_other[n_target_other++] = name;
  302. }
  303. }
  304. } else {
  305. var_target_int[n_target_int++] = "target_flags";
  306. }
  307. have_assert = 0;
  308. for (i = 0; i < n_target_char; i++) {
  309. name = var_target_char[i];
  310. if (var_target_range[name] != "") {
  311. have_assert = 1;
  312. print " gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));";
  313. }
  314. }
  315. if (have_assert)
  316. print "";
  317. print " if (targetm.target_option.save)";
  318. print " targetm.target_option.save (ptr, opts);";
  319. print "";
  320. for (i = 0; i < n_extra_target_vars; i++) {
  321. print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";";
  322. }
  323. for (i = 0; i < n_target_other; i++) {
  324. print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";";
  325. }
  326. for (i = 0; i < n_target_enum; i++) {
  327. print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";";
  328. }
  329. for (i = 0; i < n_target_int; i++) {
  330. print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";";
  331. }
  332. for (i = 0; i < n_target_short; i++) {
  333. print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";";
  334. }
  335. for (i = 0; i < n_target_char; i++) {
  336. print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";";
  337. }
  338. print "}";
  339. print "";
  340. print "/* Restore selected current options from a structure. */";
  341. print "void";
  342. print "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)";
  343. print "{";
  344. for (i = 0; i < n_extra_target_vars; i++) {
  345. print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";";
  346. }
  347. for (i = 0; i < n_target_other; i++) {
  348. print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";";
  349. }
  350. for (i = 0; i < n_target_enum; i++) {
  351. print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";";
  352. }
  353. for (i = 0; i < n_target_int; i++) {
  354. print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";";
  355. }
  356. for (i = 0; i < n_target_short; i++) {
  357. print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";";
  358. }
  359. for (i = 0; i < n_target_char; i++) {
  360. print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";";
  361. }
  362. # This must occur after the normal variables in case the code depends on those
  363. # variables.
  364. print "";
  365. print " if (targetm.target_option.restore)";
  366. print " targetm.target_option.restore (opts, ptr);";
  367. print "}";
  368. print "";
  369. print "/* Print optimization options from a structure. */";
  370. print "void";
  371. print "cl_target_option_print (FILE *file,";
  372. print " int indent,";
  373. print " struct cl_target_option *ptr)";
  374. print "{";
  375. print " fputs (\"\\n\", file);";
  376. for (i = 0; i < n_target_other; i++) {
  377. print " if (ptr->x_" var_target_other[i] ")";
  378. if (host_wide_int[var_target_other[i]] == "yes")
  379. print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
  380. else
  381. print " fprintf (file, \"%*s%s (%#x)\\n\",";
  382. print " indent, \"\",";
  383. print " \"" var_target_other[i] "\",";
  384. if (host_wide_int[var_target_other[i]] == "yes")
  385. print " ptr->x_" var_target_other[i] ");";
  386. else
  387. print " (unsigned long)ptr->x_" var_target_other[i] ");";
  388. print "";
  389. }
  390. for (i = 0; i < n_target_enum; i++) {
  391. print " if (ptr->x_" var_target_enum[i] ")";
  392. print " fprintf (file, \"%*s%s (%#x)\\n\",";
  393. print " indent, \"\",";
  394. print " \"" var_target_enum[i] "\",";
  395. print " ptr->x_" var_target_enum[i] ");";
  396. print "";
  397. }
  398. for (i = 0; i < n_target_int; i++) {
  399. print " if (ptr->x_" var_target_int[i] ")";
  400. print " fprintf (file, \"%*s%s (%#x)\\n\",";
  401. print " indent, \"\",";
  402. print " \"" var_target_int[i] "\",";
  403. print " ptr->x_" var_target_int[i] ");";
  404. print "";
  405. }
  406. for (i = 0; i < n_target_short; i++) {
  407. print " if (ptr->x_" var_target_short[i] ")";
  408. print " fprintf (file, \"%*s%s (%#x)\\n\",";
  409. print " indent, \"\",";
  410. print " \"" var_target_short[i] "\",";
  411. print " ptr->x_" var_target_short[i] ");";
  412. print "";
  413. }
  414. for (i = 0; i < n_target_char; i++) {
  415. print " if (ptr->x_" var_target_char[i] ")";
  416. print " fprintf (file, \"%*s%s (%#x)\\n\",";
  417. print " indent, \"\",";
  418. print " \"" var_target_char[i] "\",";
  419. print " ptr->x_" var_target_char[i] ");";
  420. print "";
  421. }
  422. print "";
  423. print " if (targetm.target_option.print)";
  424. print " targetm.target_option.print (file, indent, ptr);";
  425. print "}";
  426. print "";
  427. print "/* Print different target option variables from structures provided as arguments. */";
  428. print "void";
  429. print "cl_target_option_print_diff (FILE *file,";
  430. print " int indent ATTRIBUTE_UNUSED,";
  431. print " struct cl_target_option *ptr1 ATTRIBUTE_UNUSED,";
  432. print " struct cl_target_option *ptr2 ATTRIBUTE_UNUSED)";
  433. print "{";
  434. print " fputs (\"\\n\", file);";
  435. for (i = 0; i < n_target_other; i++) {
  436. print " if (ptr1->x_" var_target_other[i] " != ptr2->x_" var_target_other[i] ")";
  437. if (host_wide_int[var_target_other[i]] == "yes")
  438. print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x/%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
  439. else
  440. print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
  441. print " indent, \"\",";
  442. print " \"" var_target_other[i] "\",";
  443. if (host_wide_int[var_target_other[i]] == "yes") {
  444. print " ptr1->x_" var_target_other[i] ",";
  445. print " ptr2->x_" var_target_other[i] ");";
  446. }
  447. else {
  448. print " (unsigned long)ptr1->x_" var_target_other[i] ",";
  449. print " (unsigned long)ptr2->x_" var_target_other[i] ");";
  450. }
  451. print "";
  452. }
  453. for (i = 0; i < n_target_enum; i++) {
  454. print " if (ptr1->x_" var_target_enum[i] " != ptr2->x_" var_target_enum[i] ")";
  455. print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
  456. print " indent, \"\",";
  457. print " \"" var_target_enum[i] "\",";
  458. print " ptr1->x_" var_target_enum[i] ",";
  459. print " ptr2->x_" var_target_enum[i] ");";
  460. print "";
  461. }
  462. for (i = 0; i < n_target_int; i++) {
  463. print " if (ptr1->x_" var_target_int[i] " != ptr2->x_" var_target_int[i] ")";
  464. print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
  465. print " indent, \"\",";
  466. print " \"" var_target_int[i] "\",";
  467. print " ptr1->x_" var_target_int[i] ",";
  468. print " ptr2->x_" var_target_int[i] ");";
  469. print "";
  470. }
  471. for (i = 0; i < n_target_short; i++) {
  472. print " if (ptr1->x_" var_target_short[i] " != ptr2->x_" var_target_short[i] ")";
  473. print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
  474. print " indent, \"\",";
  475. print " \"" var_target_short[i] "\",";
  476. print " ptr1->x_" var_target_short[i] ",";
  477. print " ptr2->x_" var_target_short[i] ");";
  478. print "";
  479. }
  480. for (i = 0; i < n_target_char; i++) {
  481. print " if (ptr1->x_" var_target_char[i] " != ptr2->x_" var_target_char[i] ")";
  482. print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
  483. print " indent, \"\",";
  484. print " \"" var_target_char[i] "\",";
  485. print " ptr1->x_" var_target_char[i] ",";
  486. print " ptr2->x_" var_target_char[i] ");";
  487. print "";
  488. }
  489. print "}";
  490. print "";
  491. print "/* Compare two target options */";
  492. print "bool";
  493. print "cl_target_option_eq (struct cl_target_option const *ptr1 ATTRIBUTE_UNUSED,";
  494. print " struct cl_target_option const *ptr2 ATTRIBUTE_UNUSED)";
  495. print "{";
  496. n_target_val = 0;
  497. n_target_str = 0;
  498. n_target_array = 0;
  499. for (i = 0; i < n_target_save; i++) {
  500. var = target_save_decl[i];
  501. sub (" *=.*", "", var);
  502. name = var;
  503. type = var;
  504. sub("^.*[ *]", "", name)
  505. sub(" *" name "$", "", type)
  506. if (target_save_decl[i] ~ "^const char \\*+[_" alnum "]+$")
  507. var_target_str[n_target_str++] = name;
  508. else {
  509. if (target_save_decl[i] ~ " .*\\[.+\\]+$") {
  510. size = name;
  511. sub("[^\\[]+\\[", "", size);
  512. sub("\\]$", "", size);
  513. sub("\\[.+", "", name)
  514. sub(" [^ ]+$", "", type)
  515. var_target_array[n_target_array] = name
  516. var_target_array_type[n_target_array] = type
  517. var_target_array_size[n_target_array++] = size
  518. }
  519. else {
  520. var_target_val_type[n_target_val] = type;
  521. var_target_val[n_target_val++] = name;
  522. }
  523. }
  524. }
  525. if (have_save) {
  526. for (i = 0; i < n_opts; i++) {
  527. if (flag_set_p("Save", flags[i])) {
  528. name = var_name(flags[i])
  529. if(name == "")
  530. name = "target_flags";
  531. if(name in var_list_seen)
  532. continue;
  533. var_list_seen[name]++;
  534. otype = var_type_struct(flags[i])
  535. if (otype ~ "^const char \\**$")
  536. var_target_str[n_target_str++] = "x_" name;
  537. else {
  538. var_target_val_type[n_target_val] = otype;
  539. var_target_val[n_target_val++] = "x_" name;
  540. }
  541. }
  542. }
  543. } else {
  544. var_target_val_type[n_target_val] = "int";
  545. var_target_val[n_target_val++] = "x_target_flags";
  546. }
  547. for (i = 0; i < n_target_str; i++) {
  548. name = var_target_str[i]
  549. print " if (ptr1->" name" != ptr2->" name;
  550. print " && (!ptr1->" name" || !ptr2->" name
  551. print " || strcmp (ptr1->" name", ptr2->" name ")))";
  552. print " return false;";
  553. }
  554. for (i = 0; i < n_target_array; i++) {
  555. name = var_target_array[i]
  556. size = var_target_array_size[i]
  557. type = var_target_array_type[i]
  558. print " if (ptr1->" name" != ptr2->" name "";
  559. print " || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))"
  560. print " return false;";
  561. }
  562. for (i = 0; i < n_target_val; i++) {
  563. name = var_target_val[i]
  564. print " if (ptr1->" name" != ptr2->" name ")";
  565. print " return false;";
  566. }
  567. print " return true;";
  568. print "}";
  569. print "";
  570. print "/* Hash target options */";
  571. print "hashval_t";
  572. print "cl_target_option_hash (struct cl_target_option const *ptr ATTRIBUTE_UNUSED)";
  573. print "{";
  574. print " inchash::hash hstate;";
  575. for (i = 0; i < n_target_str; i++) {
  576. name = var_target_str[i]
  577. print " if (ptr->" name")";
  578. print " hstate.add (ptr->" name", strlen (ptr->" name"));";
  579. print " else";
  580. print " hstate.add_int (0);";
  581. }
  582. for (i = 0; i < n_target_array; i++) {
  583. name= var_target_array[i]
  584. size = var_target_array_size[i]
  585. type = var_target_array_type[i]
  586. print " hstate.add_int (" size ");";
  587. print " hstate.add (ptr->" name ", sizeof (" type ") * " size ");";
  588. }
  589. for (i = 0; i < n_target_val; i++) {
  590. name = var_target_val[i]
  591. print " hstate.add_wide_int (ptr->" name");";
  592. }
  593. print " return hstate.end ();";
  594. print "}";
  595. print "";
  596. print "/* Stream out target options */";
  597. print "void";
  598. print "cl_target_option_stream_out (struct output_block *ob ATTRIBUTE_UNUSED,";
  599. print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
  600. print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
  601. print "{";
  602. for (i = 0; i < n_target_str; i++) {
  603. name = var_target_str[i]
  604. print " bp_pack_string (ob, bp, ptr->" name", true);";
  605. }
  606. for (i = 0; i < n_target_array; i++) {
  607. name = var_target_array[i]
  608. size = var_target_array_size[i]
  609. print " for (unsigned i = 0; i < " size "; i++)"
  610. print " bp_pack_value (bp, ptr->" name "[i], 64);";
  611. }
  612. for (i = 0; i < n_target_val; i++) {
  613. name = var_target_val[i]
  614. print " bp_pack_value (bp, ptr->" name", 64);";
  615. }
  616. print "}";
  617. print "";
  618. print "/* Stream in target options */";
  619. print "void";
  620. print "cl_target_option_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,";
  621. print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
  622. print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
  623. print "{";
  624. for (i = 0; i < n_target_str; i++) {
  625. name = var_target_str[i]
  626. print " ptr->" name" = bp_unpack_string (data_in, bp);";
  627. print " if (ptr->" name")";
  628. print " ptr->" name" = xstrdup (ptr->" name");";
  629. }
  630. for (i = 0; i < n_target_array; i++) {
  631. name = var_target_array[i]
  632. size = var_target_array_size[i]
  633. print " for (int i = " size " - 1; i >= 0; i--)"
  634. print " ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);";
  635. }
  636. for (i = 0; i < n_target_val; i++) {
  637. name = var_target_val[i]
  638. print " ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);";
  639. }
  640. print "}";
  641. n_opt_val = 3;
  642. var_opt_val[0] = "x_optimize"
  643. var_opt_val_type[0] = "char "
  644. var_opt_val[1] = "x_optimize_size"
  645. var_opt_val[2] = "x_optimize_debug"
  646. var_opt_val_type[1] = "char "
  647. var_opt_val_type[2] = "char "
  648. for (i = 0; i < n_opts; i++) {
  649. if (flag_set_p("Optimization", flags[i])) {
  650. name = var_name(flags[i])
  651. if(name == "")
  652. continue;
  653. if(name in var_opt_list_seen)
  654. continue;
  655. var_opt_list_seen[name]++;
  656. otype = var_type_struct(flags[i])
  657. var_opt_val_type[n_opt_val] = otype;
  658. var_opt_val[n_opt_val++] = "x_" name;
  659. }
  660. }
  661. print "";
  662. print "/* Hash optimization options */";
  663. print "hashval_t";
  664. print "cl_optimization_hash (struct cl_optimization const *ptr ATTRIBUTE_UNUSED)";
  665. print "{";
  666. print " inchash::hash hstate;";
  667. for (i = 0; i < n_opt_val; i++) {
  668. name = var_opt_val[i]
  669. print " hstate.add_wide_int (ptr->" name");";
  670. }
  671. print " return hstate.end ();";
  672. print "}";
  673. print "";
  674. print "/* Stream out optimization options */";
  675. print "void";
  676. print "cl_optimization_stream_out (struct bitpack_d *bp,";
  677. print " struct cl_optimization *ptr)";
  678. print "{";
  679. for (i = 0; i < n_opt_val; i++) {
  680. name = var_opt_val[i]
  681. print " bp_pack_value (bp, ptr->" name", 64);";
  682. }
  683. print "}";
  684. print "";
  685. print "/* Stream in optimization options */";
  686. print "void";
  687. print "cl_optimization_stream_in (struct bitpack_d *bp,";
  688. print " struct cl_optimization *ptr)";
  689. print "{";
  690. for (i = 0; i < n_opt_val; i++) {
  691. name = var_opt_val[i]
  692. print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_value (bp, 64);";
  693. }
  694. print "}";
  695. }