aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/cc/bits.c
blob: 4b405dc812c27ec0d79dcc935f222c2922de3e50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "cc.h"

// -----------------------------------------------------------------------
// Architecture

enum 
{
    archx64,
    numarch,
};

// -----------------------------------------------------------------------
// Types

/* 
 * enumerated type specifers 
 * see https://en.wikipedia.org/wiki/C_data_types
 */
#define VOID      X(Tvoid, 2)

#define BOOL      X(Tbool, 3)
#define CHAR      X(Tchar, 4)
#define SCHAR     X(Tsign|Tchar, 5)
#define UCHAR     X(Tunsign|Tchar, 6)

#define SHORT     X(Tshort, 7), X(Tshort|Tint, 7)
#define SSHORT    X(Tsign|Tshort, 8), X(Tsign|Tshort|Tint, 8)
#define USHORT    X(Tunsign|Tshort, 9), X(Tunsign|Tshort|Tint, 9)

#define INT       X(0, 10), X(Tint, 10)
#define SINT      X(Tsign, 11), X(Tsign|Tint, 11)
#define UINT      X(Tunsign, 12), X(Tunsign|Tint, 12)

#define LONG      X(Tlong, 13), X(Tlong|Tint, 13)
#define SLONG     X(Tsign|Tlong, 14), X(Tsign|Tlong|Tint, 14)
#define ULONG     X(Tunsign|Tlong, 15), X(Tunsign|Tlong|Tint, 15)

#define VLONG     X(Tvlong, 16), X(Tvlong|Tint, 16)
#define SVLONG    X(Tsign|Tvlong, 17), X(Tsign|Tvlong|Tint, 17)
#define UVLONG    X(Tunsign|Tvlong, 18), X(Tunsign|Tvlong|Tint, 18)

#define FLOAT     X(Tfloat, 19)
#define DOUBLE    X(Tdouble, 20)
#define LONGDB    X(Tlong|Tdouble, 21)
#define COMPLEX   X(Tcmplx, 22)
#define IMAGINARY X(Timag, 23)

/* fixed width definitions */
#define DEF(sz, aln, mx, sgn) {.size=sz, .align=aln, .max=mx, .sign=sgn }

#define  INT8  DEF(1, 1, 0x7fff, 0)
#define UINT8  DEF(1, 1, 0xffff, 1)

#define  INT16 DEF(2, 2, 0x7fff, 0)
#define UINT16 DEF(2, 2, 0xffff, 1)

#define  INT32 DEF(4, 4, 0x7fffffff, 0)
#define UINT32 DEF(4, 4, 0xffffffff, 1)

#define  INT64 DEF(8, 8, 0x7fffffffffffffff, 0)
#define UINT64 DEF(8, 8, 0xffffffffffffffff, 1)

/* architecture specific definitions */
// TODO: max value should be able to take floats
#define TYPES                             \
    TYPE(DEF(0, 0, 0, 0), VOID)           \
    TYPE(INT8, BOOL)                      \
    TYPE(UINT8, CHAR)                     \
    TYPE(INT8, SCHAR)                     \
    TYPE(UINT8, UCHAR)                    \
    TYPE(INT16, SHORT)                    \
    TYPE(INT16, SSHORT)                   \
    TYPE(UINT16, USHORT)                  \
    TYPE(INT32, INT)                      \
    TYPE(INT32, SINT)                     \
    TYPE(UINT32, UINT)                    \
    TYPE(INT64, LONG)                     \
    TYPE(INT64, SLONG)                    \
    TYPE(UINT64, ULONG)                   \
    TYPE(INT64, VLONG)                    \
    TYPE(INT64, SVLONG)                   \
    TYPE(UINT64, UVLONG)                  \
    TYPE(DEF(4, 4, 0, 0), FLOAT)          \
    TYPE(DEF(8, 8, 0, 0), DOUBLE)         \
    TYPE(DEF(16, 16, 0, 0), LONGDB)       \
    TYPE(DEF(8, 8, 0, 0), COMPLEX)        \
    TYPE(DEF(4, 4, 0, 0), IMAGINARY)      \

Type pointer = {.size=8, .align=8, .max=0xffffffffffffffff, .sign=0};

/* pack architecture specific definitions into exported arrays */
#define TYPE(a, ...) a,
Type basetypes[] = {
    { 0 }, /* sentinel value for bad types */
    { 0 }, /* sentinel value for variadic args */
    TYPES
};
#undef TYPE

#define TYPE(a, ...) __VA_ARGS__,
#define X(a, b) a
uint64 validtypespec[38] = {
    TYPES
    Tstruct, Tunion, Tenum, Tname,
};
#undef X

#define X(a, b) b
int indextypespec[38] = {
    TYPES
    -1, -1, -1, -1,
};
#undef X
#undef TYPE