lang/ir.h

143 lines
2.2 KiB
C
Raw Normal View History

2021-12-21 01:18:22 +01:00
#ifndef __IR_H__
#define __IR_H__
#include "tok.h"
2021-12-22 16:09:52 +01:00
typedef struct BuiltinFunc {
enum {
FuncFixedArgs,
FuncVarArgs,
} kind;
bool returns : 1;
2021-12-22 16:09:52 +01:00
bool side_effects : 1;
char *name;
2021-12-22 16:09:52 +01:00
size_t fid; /* function ID, assigned automatically */
union {
struct {
size_t n_args;
union {
struct { Value (*func)(Value *args); } WithRet;
struct { void (*func)(Value *args); } NoRet;
};
} FixedArgs;
struct {
size_t min_args;
union {
struct { Value (*func)(size_t extra_args, Value *args); } WithRet;
struct { void (*func)(size_t extra_args, Value *args); } NoRet;
};
} VarArgs;
};
2021-12-22 16:09:52 +01:00
} BuiltinFunc;
2021-12-21 01:18:22 +01:00
enum IRInstr {
IRSet,
IRNeg,
IRAdd,
IRSub,
IRMul,
IRDiv,
2021-12-23 21:06:49 +01:00
IREq,
2021-12-26 12:19:54 +01:00
IRNeq,
2021-12-23 21:06:49 +01:00
IRLt,
IRLe,
IRNot,
2021-12-23 21:42:09 +01:00
IRAnd,
IROr,
2021-12-21 13:59:08 +01:00
IRJmp,
2021-12-21 01:18:22 +01:00
IRJnz,
2021-12-22 16:09:52 +01:00
IRCallInternal,
IRAddrOf,
2021-12-30 17:59:28 +01:00
IRArrMake,
2021-12-21 01:18:22 +01:00
IRInstrEnumSize,
};
typedef enum IRInstr IRInstr;
extern const char *irinstr_str[IRInstrEnumSize];
typedef struct IRParam {
enum {
IRParamNull = 0,
IRParamLiteral,
IRParamAddr,
} kind;
union {
Value Literal;
size_t Addr;
};
} IRParam;
typedef struct IRArgs {
struct IRArgs *next;
IRParam param;
} IRArgs;
typedef struct IRTok {
size_t ln, col;
IRInstr instr;
union {
struct {
size_t addr;
IRParam val;
} Unary;
struct {
size_t addr;
IRParam lhs, rhs;
2021-12-23 20:10:02 +01:00
} Binary;
2021-12-21 01:18:22 +01:00
2021-12-21 13:59:08 +01:00
struct {
size_t iaddr;
} Jmp;
2021-12-21 01:18:22 +01:00
struct {
size_t iaddr;
IRParam condition;
} CJmp;
2021-12-22 16:09:52 +01:00
struct {
size_t ret_addr;
size_t fid;
size_t n_args;
2021-12-22 16:09:52 +01:00
IRParam *args;
} CallI;
2021-12-30 17:59:28 +01:00
struct {
size_t arr_addr;
size_t len, cap;
IRParam *vals;
} ArrMake;
2021-12-21 01:18:22 +01:00
};
} IRTok;
2021-12-29 13:27:58 +01:00
typedef struct IRItem {
struct IRItem *next;
IRTok tok;
} IRItem;
typedef struct IRList {
IRItem *begin, *end;
Pool *p;
IRItem **index; /* index to pointer, irlist_update_index() must be called before use */
size_t len;
} IRList;
void irlist_init_long(IRList *v);
void irlist_init_short(IRList *v);
void irlist_term(IRList *v);
void irlist_app(IRList *v, IRTok t);
void irlist_eat_irlist(IRList *v, IRList *other);
void irlist_update_index(IRList *v); /* should be used very conservatively */
void print_ir(IRList *v, const BuiltinFunc *builtin_funcs);
void optimize_ir(IRList *v);
2021-12-21 01:18:22 +01:00
#endif /* IR_H */