cs.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. typedef short valnum;
  2. typedef struct entity *entity_p;
  3. typedef struct avail *avail_p;
  4. typedef struct token *token_p;
  5. typedef struct occur *occur_p;
  6. struct token {
  7. valnum tk_vn;
  8. offset tk_size;
  9. line_p tk_lfirst; /* Textually first instruction, involved
  10. * in pushing this token.
  11. */
  12. };
  13. /* We distinguish these entities. */
  14. #define ENCONST 0
  15. #define ENLOCAL 1
  16. #define ENEXTERNAL 2
  17. #define ENINDIR 3
  18. #define ENOFFSETTED 4
  19. #define ENALOCAL 5
  20. #define ENAEXTERNAL 6
  21. #define ENAOFFSETTED 7
  22. #define ENALOCBASE 8
  23. #define ENAARGBASE 9
  24. #define ENPROC 10
  25. #define ENFZER 11
  26. #define ENARRELEM 12
  27. #define ENLOCBASE 13
  28. #define ENHEAPPTR 14
  29. #define ENIGNMASK 15
  30. struct entity {
  31. valnum en_vn;
  32. bool en_static;
  33. byte en_kind; /* ENLOCAL, ENEXTERNAL, etc. */
  34. offset en_size;
  35. union {
  36. offset en__val; /* ENCONST. */
  37. offset en__loc; /* ENLOCAL, ENALOCAL. */
  38. obj_p en__ext; /* ENEXTERNAL, ENAEXTERNAL. */
  39. valnum en__ind; /* ENINDIR. */
  40. struct {
  41. valnum en__base;
  42. offset en__off;
  43. } en_offs; /* ENOFFSETTED, ENAOFFSETTED. */
  44. offset en__levels; /* ENALOCBASE, ENAARGBASE. */
  45. proc_p en__pro; /* ENPROC. */
  46. struct {
  47. valnum en__arbase;
  48. valnum en__index;
  49. valnum en__adesc;
  50. } en_arr; /* ENARRELEM. */
  51. } en_inf;
  52. };
  53. /* Macros to increase ease of use. */
  54. #define en_val en_inf.en__val
  55. #define en_loc en_inf.en__loc
  56. #define en_ext en_inf.en__ext
  57. #define en_ind en_inf.en__ind
  58. #define en_base en_inf.en_offs.en__base
  59. #define en_off en_inf.en_offs.en__off
  60. #define en_levels en_inf.en__levels
  61. #define en_pro en_inf.en__pro
  62. #define en_arbase en_inf.en_arr.en__arbase
  63. #define en_index en_inf.en_arr.en__index
  64. #define en_adesc en_inf.en_arr.en__adesc
  65. struct occur {
  66. line_p oc_lfirst; /* First instruction of expression. */
  67. line_p oc_llast; /* Last one. */
  68. bblock_p oc_belongs; /* Basic block it belongs to. */
  69. };
  70. /* We distinguish these groups of instructions. */
  71. #define SIMPLE_LOAD 0
  72. #define EXPENSIVE_LOAD 1
  73. #define LOAD_ARRAY 2
  74. #define STORE_DIRECT 3
  75. #define STORE_INDIR 4
  76. #define STORE_ARRAY 5
  77. #define UNAIR_OP 6
  78. #define BINAIR_OP 7
  79. #define TERNAIR_OP 8
  80. #define KILL_ENTITY 9
  81. #define SIDE_EFFECTS 10
  82. #define FIDDLE_STACK 11
  83. #define IGNORE 12
  84. #define HOPELESS 13
  85. #define BBLOCK_END 14
  86. struct avail {
  87. avail_p av_before; /* Ptr to earlier discovered expressions. */
  88. byte av_instr; /* Operator instruction. */
  89. offset av_size;
  90. line_p av_found; /* Line where expression is first found. */
  91. lset av_occurs; /* Set of recurrences of expression. */
  92. entity_p av_saveloc; /* Local where result is put in. */
  93. valnum av_result;
  94. union {
  95. valnum av__operand; /* EXPENSIVE_LOAD, UNAIR_OP. */
  96. struct {
  97. valnum av__oleft;
  98. valnum av__oright;
  99. } av_2; /* BINAIR_OP. */
  100. struct {
  101. valnum av__ofirst;
  102. valnum av__osecond;
  103. valnum av__othird;
  104. } av_3; /* TERNAIR_OP. */
  105. } av_o;
  106. };
  107. /* Macros to increase ease of use. */
  108. #define av_operand av_o.av__operand
  109. #define av_oleft av_o.av_2.av__oleft
  110. #define av_oright av_o.av_2.av__oright
  111. #define av_ofirst av_o.av_3.av__ofirst
  112. #define av_osecond av_o.av_3.av__osecond
  113. #define av_othird av_o.av_3.av__othird
  114. extern int Scs; /* Number of optimizations found. */