|
|
1.1 ! root 1: /* ! 2: * n1/node.c ! 3: * Utility routines for the manipulation of expression tree nodes. ! 4: */ ! 5: ! 6: #ifdef vax ! 7: #include "INC$LIB:cc1.h" ! 8: #else ! 9: #include "cc1.h" ! 10: #endif ! 11: ! 12: /* ! 13: * Fabricate a node for an integer constant. ! 14: */ ! 15: TREE * ! 16: ivalnode(n) ival_t n; ! 17: { ! 18: register TREE *tp; ! 19: ! 20: tp = alocnode(); ! 21: tp->t_op = ICON; ! 22: tp->t_type = IVAL_T; ! 23: tp->t_ival = n; ! 24: return tp; ! 25: } ! 26: ! 27: /* ! 28: * Fabricate a node for a long constant. ! 29: */ ! 30: TREE * ! 31: lvalnode(n) lval_t n; ! 32: { ! 33: register TREE *tp; ! 34: ! 35: tp = alocnode(); ! 36: tp->t_op = LCON; ! 37: tp->t_type = LVAL_T; ! 38: tp->t_lval = n; ! 39: return tp; ! 40: } ! 41: ! 42: /* ! 43: * Fabricate a node, either a long or an integer, ! 44: * given the type and the long value. ! 45: */ ! 46: TREE * ! 47: gvalnode(t, n) lval_t n; ! 48: { ! 49: if (islong(t)) ! 50: return lvalnode(n); ! 51: else ! 52: return ivalnode((ival_t)n); ! 53: } ! 54: ! 55: /* ! 56: * Copy a node. ! 57: */ ! 58: TREE * ! 59: copynode(tp1) TREE *tp1; ! 60: { ! 61: register TREE *tp2; ! 62: ! 63: tp2 = alocnode(); ! 64: *tp2 = *tp1; /* Union assign */ ! 65: return tp2; ! 66: } ! 67: ! 68: /* ! 69: * Make up a node. ! 70: * Fill in the op and the type. ! 71: */ ! 72: TREE * ! 73: makenode(op, t, s) ! 74: { ! 75: register TREE *tp; ! 76: ! 77: tp = alocnode(); ! 78: tp->t_op = op; ! 79: tp->t_type = t; ! 80: if (issized(t)) ! 81: tp->t_size = s; ! 82: return tp; ! 83: } ! 84: ! 85: /* ! 86: * Make up a node. ! 87: * Fill in the op, the type and the left subtree. ! 88: */ ! 89: TREE * ! 90: leftnode(op, lp, t, s) ! 91: TREE *lp; ! 92: { ! 93: register TREE *tp; ! 94: ! 95: tp = makenode(op, t, s); ! 96: tp->t_lp = lp; ! 97: return tp; ! 98: } ! 99: ! 100: /* ! 101: * Strip off conversions. ! 102: */ ! 103: TREE * ! 104: basenode(tp) ! 105: register TREE *tp; ! 106: { ! 107: register op; ! 108: ! 109: while ((op=tp->t_op)==CONVERT || op==CAST) ! 110: tp = tp->t_lp; ! 111: return tp; ! 112: } ! 113: ! 114: /* ! 115: * Get a new tree node. ! 116: * Just abort if there is no space left; this should not happen. ! 117: */ ! 118: TREE * ! 119: alocnode() ! 120: { ! 121: register TREE *tp; ! 122: ! 123: tp = talloc(); ! 124: tp->t_treg = NONE; ! 125: tp->t_rreg = NONE; ! 126: return tp; ! 127: } ! 128: ! 129: /* ! 130: * Check if a tree node is a fixed point constant of some type. ! 131: */ ! 132: isfxcon(tp) TREE *tp; ! 133: { ! 134: register op; ! 135: ! 136: if ((op=tp->t_op)==ICON || op==LCON) ! 137: return 1; ! 138: return 0; ! 139: } ! 140: ! 141: /* ! 142: * Grab numeric value. ! 143: */ ! 144: lval_t ! 145: grabnval(tp) register TREE *tp; ! 146: { ! 147: register op; ! 148: ! 149: op = tp->t_op; ! 150: if (op == ICON) { ! 151: if (isuns(tp->t_type)) ! 152: return ((unsigned) tp->t_ival); ! 153: return tp->t_ival; ! 154: } ! 155: if (op == LCON) ! 156: return tp->t_lval; ! 157: cbotch("grabnval"); ! 158: } ! 159: ! 160: /* ! 161: * Is this tree node a constant 'n'? ! 162: * Note that 'n' is an integer (not a long). ! 163: */ ! 164: isnval(tp, n) register TREE *tp; ! 165: { ! 166: long v; ! 167: ! 168: if (isfxcon(tp)) { ! 169: v = grabnval(tp); ! 170: if (v == n) ! 171: return 1; ! 172: } ! 173: return 0; ! 174: } ! 175: ! 176: /* ! 177: * Make a LEAF node. ! 178: */ ! 179: TREE * ! 180: leafnode(tp) register TREE *tp; ! 181: { ! 182: return leftnode(LEAF, tp, tp->t_type, tp->t_size); ! 183: } ! 184: ! 185: /* end of n1/node.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.