test-unssa.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include "symbol.h"
  4. #include "expression.h"
  5. #include "linearize.h"
  6. #include "flow.h"
  7. static void output_bb(struct basic_block *bb, unsigned long generation)
  8. {
  9. struct instruction *insn;
  10. bb->generation = generation;
  11. printf("%s\n", show_label(bb));
  12. FOR_EACH_PTR(bb->insns, insn) {
  13. if (!insn->bb)
  14. continue;
  15. printf("\t%s\n", show_instruction(insn));
  16. }
  17. END_FOR_EACH_PTR(insn);
  18. printf("\n");
  19. }
  20. static void output_fn(struct entrypoint *ep)
  21. {
  22. struct basic_block *bb;
  23. unsigned long generation = ++bb_generation;
  24. struct symbol *sym = ep->name;
  25. const char *name = show_ident(sym->ident);
  26. if (sym->ctype.modifiers & MOD_STATIC)
  27. printf("\n\n%s:\n", name);
  28. else
  29. printf("\n\n.globl %s\n%s:\n", name, name);
  30. unssa(ep);
  31. FOR_EACH_PTR(ep->bbs, bb) {
  32. if (bb->generation == generation)
  33. continue;
  34. output_bb(bb, generation);
  35. }
  36. END_FOR_EACH_PTR(bb);
  37. }
  38. static int output_data(struct symbol *sym)
  39. {
  40. printf("symbol %s:\n", show_ident(sym->ident));
  41. printf("\ttype = %d\n", sym->ctype.base_type->type);
  42. printf("\tmodif= %lx\n", sym->ctype.modifiers);
  43. return 0;
  44. }
  45. static int compile(struct symbol_list *list)
  46. {
  47. struct symbol *sym;
  48. FOR_EACH_PTR(list, sym) {
  49. struct entrypoint *ep;
  50. expand_symbol(sym);
  51. ep = linearize_symbol(sym);
  52. if (!(fdump_ir & PASS_FINAL))
  53. continue;
  54. if (ep)
  55. output_fn(ep);
  56. else
  57. output_data(sym);
  58. }
  59. END_FOR_EACH_PTR(sym);
  60. return 0;
  61. }
  62. int main(int argc, char **argv)
  63. {
  64. struct string_list * filelist = NULL;
  65. char *file;
  66. compile(sparse_initialize(argc, argv, &filelist));
  67. FOR_EACH_PTR(filelist, file) {
  68. compile(sparse(file));
  69. } END_FOR_EACH_PTR(file);
  70. report_stats();
  71. return 0;
  72. }