shithub: scc

ref: 8336b733717f4fc2cf5ccf6647f1718760fc1bc8
dir: /src/cc1/target/amd64-sysv/arch.c/

View raw version
static char sccsid[] = "@(#) ./cc1/arch/amd64-sysv/arch.c";

#include <scc/scc.h>
#include "../../cc1.h"

#define RANK_BOOL    0
#define RANK_SCHAR   1
#define RANK_UCHAR   1
#define RANK_CHAR    1
#define RANK_SHORT   2
#define RANK_USHORT  2
#define RANK_INT     3
#define RANK_UINT    3
#define RANK_LONG    4
#define RANK_ULONG   4
#define RANK_LLONG   5
#define RANK_ULLONG  5
#define RANK_FLOAT   6
#define RANK_DOUBLE  7
#define RANK_LDOUBLE 8

/*
 * Initializaion of type pointers were done with
 * a C99 initilizator '... = &(Type) {...', but
 * c compiler in Plan9 gives error with this
 * syntax, so I have switched it to this ugly form
 * I hope I will change it again in the future
 */

static Type types[] = {
	{       /* 0 = voidtype */
		.op = VOID,
		.letter = L_VOID,
	},
	{       /* 1 = pvoidtype */
		.op = PTR,
		.letter = L_POINTER,
		.prop = TDEFINED,
		.type = &types[5],  /* chartype */
		.size = 8,
		.align = 8,
	},
	{      /* 2 = booltype */
		.op = INT,
		.letter = L_BOOL,
		.prop = TDEFINED | TINTEGER | TARITH,
		.size = 1,
		.align = 1,
		.n.rank = RANK_BOOL,
	},
	{       /* 3 = schartype */
		.op = INT,
		.letter = L_INT8,
		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
		.size = 1,
		.align = 1,
		.n.rank = RANK_SCHAR,
	},
	{      /* 4 = uchartype */
		.op = INT,
		.letter = L_UINT8,
		.prop = TDEFINED | TINTEGER | TARITH,
		.size = 1,
		.align = 1,
		.n.rank = RANK_UCHAR,
	},
	{      /* 5 = chartype */
		.op = INT,
		.letter = L_INT8,
		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
		.size = 1,
		.align = 1,
		.n.rank = RANK_CHAR,
	},
	{       /* 6 = ushortype */
		.op = INT,
		.letter = L_UINT16,
		.prop = TDEFINED | TINTEGER | TARITH,
		.size = 2,
		.align = 2,
		.n.rank = RANK_USHORT,
	},
	{       /* 7 = shortype */
		.op = INT,
		.letter = L_INT16,
		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
		.size = 2,
		.align = 2,
		.n.rank = RANK_SHORT,
	},
	{       /* 8 = uinttype */
		.op = INT,
		.letter = L_UINT32,
		.prop = TDEFINED | TINTEGER | TARITH,
		.size = 4,
		.align = 4,
		.n.rank = RANK_UINT,
	},
	{       /* 9 = inttype */
		.op = INT,
		.letter = L_INT32,
		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
		.size = 4,
		.align = 4,
		.n.rank = RANK_INT,
	},
	{      /* 10 = longtype */
		.op = INT,
		.letter = L_INT64,
		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
		.size = 8,
		.align = 8,
		.n.rank = RANK_LONG,
	},
	{       /* 11 = ulongtype */
		.op = INT,
		.letter = L_UINT64,
		.prop = TDEFINED | TINTEGER | TARITH,
		.size = 8,
		.align = 8,
		.n.rank = RANK_ULONG,
	},
	{	/* 12 = ullongtype */
		.op = INT,
		.letter = L_UINT64,
		.prop = TDEFINED | TINTEGER | TARITH,
		.size = 8,
		.align = 8,
		.n.rank = RANK_ULLONG,
	},
	{       /* 13 = llongtype */
		.op = INT,
		.letter = L_INT64,
		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
		.size = 8,
		.align = 8,
		.n.rank = RANK_LLONG,
	},
	{       /* 14 = floattype */
		.op = FLOAT,
		.letter = L_FLOAT,
		.prop = TDEFINED | TARITH,
		.size = 4,
		.align = 4,
		.n.rank = RANK_FLOAT,
	},
	{       /* 15 = doubletype */
		.op = FLOAT,
		.letter = L_DOUBLE,
		.prop = TDEFINED | TARITH,
		.size = 8,
		.align = 8,
		.n.rank = RANK_DOUBLE,
	},
	{       /* 16 = ldoubletype */
		.op = FLOAT,
		.letter = L_LDOUBLE,
		.prop = TDEFINED | TARITH,
		.size = 16,
		.align = 16,
		.n.rank = RANK_LDOUBLE,
	},
	{       /* 17 = sizettype */
		.op = INT,
		.letter = L_UINT64,
		.prop = TDEFINED | TINTEGER | TARITH,
		.size = 8,
		.align = 8,
		.n.rank = RANK_UINT,
	},
	{      /* 18 = ellipsis */
		.op = ELLIPSIS,
		.letter = L_ELLIPSIS,
		.prop = TDEFINED,
	},
	{      /* 19 = pdifftype */
		.op = INT,
		.letter = L_INT64,
		.prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
		.size = 8,
		.align = 8,
		.n.rank = RANK_LONG,
	},
	{      /* 20 = va_type */
		.op = STRUCT,
		.letter = L_VA_ARG,
		.prop = TDEFINED,
		.size = 24,
		.align = 8,
	},
};

Type *voidtype = &types[0], *pvoidtype = &types[1],
     *booltype = &types[2], *schartype = &types[3],
     *uchartype = &types[4], *chartype = &types[5],
     *ushortype = &types[6], *shortype = &types[7],
     *uinttype = &types[8], *inttype = &types[9],
     *longtype = &types[10], *ulongtype = &types[11],
     *ullongtype = &types[12], *llongtype = &types[13],
     *floattype = &types[14], *doubletype = &types[15],
     *ldoubletype = &types[16],
     *sizettype = &types[17], *pdifftype = &types[19],
     *ellipsistype = &types[18], *va_type = &types[20],
     *va_list_type;

static Symbol dummy0 = {.u.i = 0, .type = &types[9]},
              dummy1 = {.u.i = 1, .type = &types[9]};
Symbol *zero = &dummy0, *one = &dummy1;

void
iarch(void)
{
	va_list_type = mktype(va_type, ARY, 1, NULL);
}

int
valid_va_list(Type *tp)
{
	return tp->op == PTR && eqtype(tp->type, va_type, 1);
}