📄 c.h
字号:
#include <stdio.h>
#include <io.h>
#define BUILTIN_ASM
#define NEW(p,a) ((p) = allocate(sizeof *(p), (a)))
#define NEW0(p,a) memset(NEW((p),(a)), 0, sizeof *(p))
//#define NDEBUG
#ifdef NDEBUG
#define assert(c)
#else
#define assert(c) /*lint -e506 */ \
((void)((c) || \
fatal(__FILE__,"assertion failure at line %d\n",__LINE__))) \
/*lint -restore */
#endif
#define isaddrop(op) \
((op)==ADDRG+P || (op)==ADDRL+P || (op)==ADDRF+P)
#define MAXLINE 512
#define BUFSIZE 4096
#define istypename(t,tsym) (kind[t] == CHAR \
|| t == ID && tsym && tsym->sclass == TYPEDEF)
#ifdef __LCC__
#pragma pack(1)
#endif
#if 1
#define ARGS(list) list
#else
#define ARGS(list) ()
#endif
/*#ifdef __STDC__*/
#include <stdarg.h>
#define va_init(a,b) va_start(a,b)
#ifdef __STDC__
#define VARARGS(newlist,oldlist,olddcls) newlist
#else
#define VARARGS(newlist,oldlist,olddcls) oldlist olddcls
#endif
#ifndef NULL
#define NULL ((void*)0)
#endif
#define NELEMS(a) ((int)(sizeof (a)/sizeof ((a)[0])))
#define roundup(x,n) (((x)+((n)-1))&(~((n)-1)))
#define generic(op) ((op)&~15)
#define opindex(op) ((op)>>4)
#define optype(op) ((op)&15)
#define isqual(t) ((t)->op >= CONST)
#define unqual(t) (isqual(t) ? (t)->type : (t))
#define isvolatile(t) ((t)->op == VOLATILE \
|| (t)->op == CONST+VOLATILE)
#define isconst(t) ((t)->op == CONST \
|| (t)->op == CONST+VOLATILE)
#define isarray(t) (unqual(t)->op == ARRAY)
#define isstruct(t) (unqual(t)->op == STRUCT \
|| unqual(t)->op == UNION)
#define isunion(t) (unqual(t)->op == UNION)
#define isfunc(t) (unqual(t)->op == FUNCTION)
#define isptr(t) (unqual(t)->op == POINTER)
#define ischar(t) (unqual(t)->op == CHAR)
#define isint(t) (unqual(t)->op >= CHAR && (unqual(t)->op != LONGLONG) \
&& unqual(t)->op <= UNSIGNED)
#define isfloat(t) (unqual(t)->op <= DOUBLE)
#define isarith(t) (unqual(t)->op <= UNSIGNED)
#define isunsigned(t) (unqual(t)->op == UNSIGNED)
#define isdouble(t) (unqual(t)->op == DOUBLE)
#define isscalar(t) (unqual(t)->op <= POINTER \
|| unqual(t)->op == ENUM)
#define isenum(t) (unqual(t)->op == ENUM)
#define fieldsize(p) (p)->bitsize
#define fieldright(p) ((p)->lsb - 1)
#define fieldleft(p) (8*(p)->type->size - \
fieldsize(p) - fieldright(p))
#define fieldmask(p) (~(~(unsigned)0<<fieldsize(p)))
#define widen(t) (isint(t) || isenum(t) ? INT : ttob(t))
typedef struct node *Node;
typedef struct list *List;
typedef struct code *Code;
typedef struct swtch *Swtch;
typedef struct symbol *Symbol;
typedef struct coord {
char *file;
unsigned x, y;
} Coordinate;
typedef struct table *Table;
extern void asmcode(char *, Symbol []);
#ifndef asmH
typedef union value {
/* signed */ char sc;
short ss;
int i;
unsigned char uc;
unsigned short us;
unsigned int u;
float f;
double d;
void *p;
// __int64 ll;
} Value;
#endif
typedef struct tree *Tree;
typedef struct type *Type;
typedef struct field *Field;
typedef struct {
unsigned printed:1;
unsigned marked:1;
unsigned pointerEmitted:1;
unsigned short typeno;
unsigned short pointerIndex;
} Xtype;
#include "config.h"
typedef struct metrics {
unsigned char size, align, outofline;
} Metrics;
typedef struct interface {
Metrics charmetric;
Metrics shortmetric;
Metrics intmetric;
Metrics floatmetric;
Metrics doublemetric;
Metrics ptrmetric;
Metrics structmetric;
unsigned little_endian:1;
unsigned mulops_calls:1;
unsigned wants_callb:1;
unsigned wants_argb:1;
unsigned left_to_right:1;
unsigned wants_dag:1;
void (*address) ARGS((Symbol p, Symbol q, int n));
void (*blockbeg) ARGS((Env *));
void (*blockend) ARGS((Env *));
void (*defaddress) ARGS((Symbol));
void (*defconst) ARGS((int ty, Value v));
void (*defstring) ARGS((int n, char *s,int siz));
void (*defsymbol) ARGS((Symbol));
void (*emit) ARGS((Node));
void (*export) ARGS((Symbol));
void (*function) ARGS((Symbol, Symbol[], Symbol[], int));
Node (*gen) ARGS((Node));
void (*global) ARGS((Symbol));
void (*import) ARGS((Symbol));
void (*local) ARGS((Symbol));
void (*progbeg) ARGS((int argc, char *argv[]));
void (*progend) ARGS((void));
void (*segment) ARGS((int));
void (*space) ARGS((int));
void (*stabblock) ARGS((int, int, Symbol*));
void (*stabend) ARGS((Coordinate *, Symbol, Coordinate **,Symbol *, Symbol *));
void (*stabfend) ARGS((Symbol, int));
void (*stabinit) ARGS((char *, int, char *[]));
void (*stabline) ARGS((Coordinate *));
void (*stabsym) ARGS((Symbol));
void (*stabtype) ARGS((Symbol));
Xinterface x;
} Interface;
typedef struct binding {
char *name;
Interface *ir;
} Binding;
extern Binding bindings[];
extern Interface *IR;
typedef struct {
List entry;
List exit;
List returns;
List points;
List calls;
List end;
} Events;
enum {
#define xx(a,b,c,d,e,f,g) a=b,
#define yy(a,b,c,d,e,f,g)
#include "token.h"
LAST
};
struct node {
short op;
short count;
Symbol syms[3];
Node kids[2];
Node link;
Xnode x;
};
enum {
F=FLOAT,
D=DOUBLE,
C=CHAR,
S=SHORT,
I=INT,
U=UNSIGNED,
P=POINTER,
V=VOID,
B=STRUCT,
L=LONGLONG
};
enum { CNST=1<<4,
CNSTC=CNST+C,
CNSTD=CNST+D,
CNSTF=CNST+F,
CNSTI=CNST+I,
CNSTP=CNST+P,
CNSTS=CNST+S,
CNSTU=CNST+U,
CNSTL=CNST+L,
ARG=2<<4,
ARGB=ARG+B,
ARGD=ARG+D,
ARGF=ARG+F,
ARGI=ARG+I,
ARGP=ARG+P,
ARGL=ARG+L,
ASGN=3<<4,
ASGNB=ASGN+B,
ASGNC=ASGN+C,
ASGND=ASGN+D,
ASGNF=ASGN+F,
ASGNI=ASGN+I,
ASGNS=ASGN+S,
ASGNP=ASGN+P,
ASGNL=ASGN+L,
INDIR=4<<4,
INDIRB=INDIR+B,
INDIRC=INDIR+C,
INDIRD=INDIR+D,
INDIRF=INDIR+F,
INDIRI=INDIR+I,
INDIRS=INDIR+S,
INDIRP=INDIR+P,
INDIRL=INDIR+L,
CVC=5<<4,
CVCI=CVC+I,
CVCU=CVC+U,
CVD=6<<4,
CVDF=CVD+F,
CVDI=CVD+I,
CVDL=CVD+L,
CVF=7<<4,
CVFD=CVF+D,
CVI=8<<4,
CVIC=CVI+C,
CVID=CVI+D,
CVIS=CVI+S,
CVIU=CVI+U,
CVIL=CVI+L,
CVP=9<<4,
CVPU=CVP+U,
CVS=10<<4,
CVSI=CVS+I,
CVSU=CVS+U,
CVU=11<<4,
CVUC=CVU+C,
CVUI=CVU+I,
CVUD=CVU+D,
CVUP=CVU+P,
CVUS=CVU+S,
NEG=12<<4,
NEGD=NEG+D,
NEGF=NEG+F,
NEGI=NEG+I,
NEGL=NEG+L,
CALL=13<<4,
CALLB=CALL+B,
CALLD=CALL+D,
CALLF=CALL+F,
CALLI=CALL+I,
CALLV=CALL+V,
CALLL=CALL+L,
LOAD=14<<4,
LOADB=LOAD+B,
LOADC=LOAD+C,
LOADD=LOAD+D,
LOADF=LOAD+F,
LOADI=LOAD+I,
LOADP=LOAD+P,
LOADS=LOAD+S,
LOADU=LOAD+U,
RET=15<<4,
RETD=RET+D,
RETF=RET+F,
RETI=RET+I,
RETL=RET+L,
ADDRG=16<<4,
ADDRGP=ADDRG+P,
ADDRF=17<<4,
ADDRFP=ADDRF+P,
ADDRL=18<<4,
ADDRLP=ADDRL+P,
ADD=19<<4,
ADDD=ADD+D,
ADDF=ADD+F,
ADDI=ADD+I,
ADDP=ADD+P,
ADDU=ADD+U,
ADDL=ADD+L,
SUB=20<<4,
SUBD=SUB+D,
SUBF=SUB+F,
SUBI=SUB+I,
SUBP=SUB+P,
SUBU=SUB+U,
SUBL=SUB+L,
LSH=21<<4,
LSHI=LSH+I,
LSHU=LSH+U,
LSHL=LSH+L,
MOD=22<<4,
MODI=MOD+I,
MODU=MOD+U,
MODL=MOD+L,
RSH=23<<4,
RSHI=RSH+I,
RSHU=RSH+U,
RSHL=RSH+L,
BAND=24<<4,
BANDU=BAND+U,
BANDL=BAND+L,
BCOM=25<<4,
BCOMU=BCOM+U,
BCOML=BCOM+L,
BOR=26<<4,
BORU=BOR+U,
BORL=BOR+L,
BXOR=27<<4,
BXORU=BXOR+U,
BXORL=BXOR+L,
DIV=28<<4,
DIVD=DIV+D,
DIVF=DIV+F,
DIVI=DIV+I,
DIVU=DIV+U,
DIVL=DIV+L,
MUL=29<<4,
MULD=MUL+D,
MULF=MUL+F,
MULI=MUL+I,
MULU=MUL+U,
MULL=MUL+L,
EQ=30<<4,
EQD=EQ+D,
EQF=EQ+F,
EQI=EQ+I,
EQLO=EQ+L,
GE=31<<4,
GED=GE+D,
GEF=GE+F,
GEI=GE+I,
GEU=GE+U,
GEL=GE+L,
GT=32<<4,
GTD=GT+D,
GTF=GT+F,
GTI=GT+I,
GTU=GT+U,
GTL=GT+L,
LE=33<<4,
LED=LE+D,
LEF=LE+F,
LEI=LE+I,
LEU=LE+U,
LEL=LE+L,
LT=34<<4,
LTD=LT+D,
LTF=LT+F,
LTI=LT+I,
LTU=LT+U,
LTL=LT+L,
NE=35<<4,
NED=NE+D,
NEF=NE+F,
NEI=NE+I,
NEL=NE+L,
JUMP=36<<4,
JUMPV=JUMP+V,
JUMPI=JUMP+I,
LABEL=37<<4,
LABELV=LABEL+V,
CVL=38 << 4,
CVLD=CVL+D,
CVLI=CVL+I,
CVLU=CVL+U
};
enum { CODE=1, BSS, DATA, LIT };
enum { PERM=0, FUNC, STMT };
struct list {
void *x;
List link;
};
struct code {
enum codekind { Blockbeg, Blockend, Local, Address, Defpoint,
Label, Start, Gen, Jump, Switch, Asm
} kind;
Code prev, next;
union {
#ifdef BUILTIN_ASM
struct { /* Asm: assembly language */
char *code; /* assembly code */
Symbol *argv; /* %name arguments */
} acode;
#endif
struct {
int level;
Symbol *locals;
Table identifiers, types;
Env x;
} block;
Code begin;
Symbol var;
struct {
Symbol sym;
Symbol base;
int offset;
} addr;
struct {
Coordinate src;
int point;
int type;
int statement;
} point;
Node forest;
struct {
Symbol sym;
Symbol table;
Symbol deflab;
int size;
int *values;
Symbol *labels;
} swtch;
} u;
};
/*
Define points flags
*/
#define POINT_STARTIF 0x1
#define POINT_ELSE 0x2
#define POINT_ENDIF 0x4
#define POINT_STARTFOR 0x8
#define POINT_ENDFOR 0x10
#define POINT_STARTWHILE 0x20
#define POINT_ENDWHILE 0x40
#define POINT_STARTDO 0x80
#define POINT_ENDDO 0x100
#define POINT_STARTSWITCH 0x200
#define POINT_ENDSWITCH 0x400
#define POINT_CASE 0x800
#define POINT_BREAK 0x1000
#define POINT_GOTO 0x2000
#define POINT_CALL 0x4000
#define POINT_STARTFN 0x8000
#define POINT_ENDFN 0x10000
#define POINT_RETURN 0x20000
struct symbol {
char *name;
int scope;
Coordinate src;
Symbol up;
List uses;
int sclass;
unsigned structarg:1;
unsigned addressed:1;
unsigned computed:1;
unsigned temporary:1;
unsigned generated:1;
unsigned defined:1;
unsigned assigned:1;
unsigned islabel:1;
unsigned isconstant:1;
unsigned char Flags;
Type type;
float ref;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -