|
|
1.1 root 1:
2: #include "stdio.h"
3: /*
4: C program to run on a machine to write a size/align file for
5: the C++ translator.
6:
7: Most output line are on the form:
8: typeX sizeof(typeX) alignment_requirement_for_typeX
9: */
10:
11: /*
12: assumes
13:
14: that ``double d0; char c0;'' poses the worst alignment condition
15:
16: two's complement integer representation
17:
18: that a word is defined by a :0 field
19: */
20:
21: typedef int (*PF)();
22: struct st1 { char a; };
23: struct ss {
24: double a0; char c0;
25: char c1;
26: double a00; char c00;
27: short s1;
28: double a2; char c2;
29: int i1;
30: double a3; char c3;
31: long l1;
32: double a4; char c4;
33: float f1;
34: double a6; char c5;
35: double d1;
36: double a7; char c6;
37: char* p1;
38: double a8; char c7;
39: struct ss * p2;
40: double a9; char c8;
41: struct st1 oo;
42: double a10; char c9;
43: PF pf;
44: } oo;
45: struct st5 { char a; int :0; }; /* by definition: a word */
46: struct st2 { char :2; };
47: struct st3 { int :2; };
48: struct st4 { char :2; char :2; };
49:
50: struct st6 { char v[3]; char : 2; }; /* fits in 4 bytes */
51: struct st7 { char v[3]; int : 2; }; /* might not */
52: struct st8 { char v[3]; char : 2; char : 2; };
53:
54: struct st9 { char v[7]; char : 2; }; /* fits in 8 bytes */
55: struct st10 { char v[7]; int : 2; }; /* might not */
56: struct st11 { char v[7]; char : 2; char : 2; };
57:
58: out(s,a1,a2,p) char* s; int a1; int a2; char* p;
59: {
60: printf("%s\t%d\t%d\t%s\n",s,a1,a2,p?p:"");
61: }
62:
63: int a123456789 = 1; /* if this does not compile get a better C compiler */
64: int a123456780 = 2;
65:
66:
67: main()
68: {
69: char largest[50];
70: char c = 1;
71: int i1 = 0;
72: int i2 = 0;
73: int i = 1;
74:
75: if (a123456789 == a123456780)
76: fprintf(stderr,"Warning: Your C compiler is dangerous.\nIt strips trailing characters off long identifiers without warning.\nGet a new one\n");
77:
78: while (c) { c<<=1; c&=~1; i1++; } /* i1 = #bits in byte */
79:
80: if (sizeof(struct st5) == sizeof(char)) /* i2 = #bits in word */
81: i2 = i1;
82: else if (sizeof(struct st5) == sizeof(short)) {
83: short i = 1;
84: while (i) { i<<=1; i&=~1; i2++; }
85: }
86: else if (sizeof(struct st5) == sizeof(int))
87: while (i) { i<<=1; i&=~1; i2++; }
88: else if (sizeof(struct st5) == sizeof(long)) {
89: long i = 1;
90: while (i) { i<<=1; i&=~1; i2++; }
91: }
92: else {
93: fprintf(stderr,"Warning: Your C compiler probably handles 0 lengths fields wrong\n");
94: i = sizeof(int);
95: }
96:
97: out("bit",i1,i2,0);
98: out("word",sizeof(struct st5),sizeof(struct st5),0);
99: out("char",sizeof(char),(int)&oo.c1-(int)&oo.c0,0);
100: out("short",sizeof(short),(int)&oo.s1-(int)&oo.c00,0);
101: i = ((unsigned)~0)>>1;
102: sprintf(largest,"%d",i); /* largest integer */
103: out("int",sizeof(int),(int)&oo.i1-(int)&oo.c2,largest);
104: out("long",sizeof(long),(int)&oo.l1-(int)&oo.c3,0);
105: out("float",sizeof(float),(int)&oo.f1-(int)&oo.c4,0);
106: out("double",sizeof(double),(int)&oo.d1-(int)&oo.c5,0);
107: i = 1<<(sizeof(char*)*i1-2);
108: if (i<400*1024)
109: fprintf(stderr,"Pointers to data too small to handle C++\n");
110: out("bptr",sizeof(char*),(int)&oo.p1-(int)&oo.c6,0);
111: out("wptr",sizeof(struct ss *),(int)&oo.p2-(int)&oo.c7,0);
112: i = 1<<(sizeof(PF)*i1-2);
113: if (i<250*1024)
114: fprintf(stderr,"Pointers to functions too small to handle C++\n");
115: /* out("fptr",sizeof(PF),(int)&oo.pf-(int)&oo.c9,0);
116: */
117: if (sizeof(PF)!=sizeof(struct ss*))
118: fprintf(stderr,"Cannot handle sizeof(pointer to function) != sizeof(pointer to struct)\n");
119: out("struct",sizeof(struct st1),(int)&oo.oo-(int)&oo.c8,0);
120: switch (sizeof(struct st1)) {
121: case 1:
122: i1 = sizeof(struct st2)!=sizeof(struct st3);
123: i2 = sizeof(struct st2)==sizeof(struct st4);
124: break;
125: case 2:
126: i1 = sizeof(struct st6)!=sizeof(struct st7);
127: i2 = sizeof(struct st6)==sizeof(struct st8);
128: break;
129: case 4:
130: i1 = sizeof(struct st9)!=sizeof(struct st10);
131: i2 = sizeof(struct st9)==sizeof(struct st11);
132: break;
133: default:
134: fprintf(stderr,"Cannot figure out if field sizes are sensitive to the type of fields\n");
135: }
136: out("struct2",i1 /* sensitive to field type */,i2 /* packs fields */,0);
137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.