|
|
1.1 root 1: /*
2: * n0/size.c
3: * C compiler.
4: * sizeof(thing) computation for symbols and trees.
5: */
6:
7: #ifdef vax
8: #include "INC$LIB:cc0.h"
9: #else
10: #include "cc0.h"
11: #endif
12:
13: /*
14: * Given a pointer to a symbol table entry,
15: * return the size of the object in "bytes".
16: */
17: sizeof_t
18: ssize(sp) register SYM *sp;
19: {
20: register sizeof_t n;
21: n = tidsize(sp->s_type, sp->s_ip, sp->s_dp, 1);
22: if (n == 0 && sp->s_class == C_GREF)
23: sizewarn(sp->s_id, 0);
24: return n;
25: }
26:
27: /*
28: * Much like ssize, but takes a tree node pointer
29: * rather than a symbol table entry pointer.
30: */
31: sizeof_t
32: tsize(tp) register TREE *tp;
33: {
34: register sizeof_t n;
35: n = tidsize(tp->t_type, tp->t_ip, tp->t_dp, 1);
36: if (n == 0 && tp->t_op == GID && tp->t_sp->s_class == C_GREF)
37: sizewarn(tp->t_sp->s_id, 0);
38: return n;
39: }
40:
41: /*
42: * Much like ssize, but takes a symbol pointer and a dimension list.
43: */
44: sizeof_t
45: sdsize(sp, dp) register SYM *sp; DIM *dp;
46: {
47: register sizeof_t n;
48: n = tidsize(sp->s_type, sp->s_ip, dp, 1);
49: if (n == 0 && sp->s_class == C_GREF)
50: sizewarn(sp->s_id, 0);
51: return n;
52: }
53:
54:
55: /*
56: * Figure out a size given a type,
57: * an INFO structure pointer and a dimension list.
58: */
59: sizeof_t
60: tidsize(t, ip, dp, f) register int t; register INFO *ip; register DIM *dp;
61: int f; /* Message requested flag */
62: {
63: unsigned long n;
64: int a = 0; /* Array flag for szcheck() */
65: char *s = "object";
66:
67: n = 1;
68: while (dp!=NULL && (dp->d_type==D_ARRAY || dp->d_type==D_MOSAR)) {
69: s = "array";
70: n *= dp->d_bound;
71: dp = dp->d_dp;
72: a += 1;
73: }
74: if (n == 0)
75: return 0;
76: if (dp!=NULL && dp->d_type==D_FUNC)
77: return(f ? sizewarn("function", 0) : 0);
78: if (dp != NULL)
79: n *= mysizes[T_PTR];
80: else {
81: if (t == T_VOID)
82: return(f ? sizewarn("void", 0) : 0);
83: if (isfr(t)) {
84: if (f) unksize(t, ip);
85: return 0;
86: }
87: if (t==T_STRUCT || t==T_UNION) {
88: s = (t==T_STRUCT) ? "structure" : "union";
89: n *= ip->i_size;
90: } else {
91: if (t == T_ENUM)
92: t = ip->i_type;
93: n *= mysizes[t];
94: }
95: }
96: if (f)
97: n = szcheck(n, a, s);
98: return n;
99: }
100:
101: /*
102: * Is this a forward reference?
103: */
104: isfr(t) register int t;
105: {
106: return (t==T_FSTRUCT || t==T_FUNION || t==T_FENUM);
107: }
108:
109: /*
110: * Mutter about an unknown size.
111: */
112: unksize(t, sp) register int t; register SYM *sp;
113: {
114: register char *p;
115:
116: p = "enumeration";
117: if (t == T_FSTRUCT)
118: p = "structure";
119: if (t == T_FUNION)
120: p = "union";
121: cerror("size of %s \"%s\" is not known", p, sp->s_id);
122: }
123:
124: static
125: sizewarn(s, i) char *s; register int i;
126: {
127: cerror("sizeof(%s) set to %d", s, i);
128: return i;
129: }
130:
131: /* end of n0/size.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.