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