lr/gen.h

90 lines
2.1 KiB
C

/***********
* State for code
* generator
***********/
#pragma once
#include"mem.h"
#include"i386.h"
#include"pnode.h"
#include"x86_64.h"
// Build architecture types
enum {M_I386=1,M_IR,M_RUN,M_X86_64};
// Used to abstract different architectures
typedef struct LangDef
{
const char*acc_32;
const char*acc_wordsize;
const char*add_32;
const char*add_wordsize;
const char*bp;
const char*cmp_32;
const char*cmp_wordsize;
const char*div_32;
const char*div_wordsize;
const char*lea_wordsize;
const char*mov_32;
const char*mov_wordsize;
const char*mul_32;
const char*mul_wordsize;
const char*pop_wordsize;
const char*push_wordsize;
const char*registers_abi_32[6];
const char*registers_abi_wordsize[6];
const char*scratch1_32;
const char*scratch1_wordsize;
const char*sp;
const char*sub_32;
const char*sub_wordsize;
const char*xor_32;
const char*xor_wordsize;
size_t wordsize;
}LangDef;
typedef struct Gen
{
PNode*stackptr;
const PNode*rootnode;
size_t labelno;
uint32_t buildarch;
bool showrpn;
bool showeval;
LangDef ld;
} Gen;
#define AM(x,y) ((((uint32_t)(x&0xff))<<8)|(y&0xff))
enum EVAL_ELEM_TYPE {EE_I32=1,EE_IDENT,EE_VAR,EE_FUNC,EE_ACC,EE_SEP};
typedef struct eval_elem
{
size_t type;
VTYPE vtype;
int32_t vstackloc;
union
{
int32_t i32;
char*name;
}val;
}eval_elem;
/* static void gen_print_string(Gen*gen,const PNode*pn,FILE*file,const Str*str) */
Gen gen_new(void);
Vec gen_i2r(const Vec*tokens);
bool gen_findret(const PNode*pn,bool found);
size_t gen_stacksize(const Gen*gen,const PNode*pn);
void gen(Gen*gen,PNode*pn,FILE*file);
void gen_code(Gen*gen,PNode*pn,FILE*file);
void gen_declare_function(Gen*gen,PNode*pn,FILE*file);
void gen_declare_variable(Gen*gen,PNode*pn,FILE*file);
void gen_epilog(Gen*gen,const PNode*pn,FILE*file);
void gen_eval(Gen*gen,const PNode*pn,FILE*file);
void gen_eval_analyze(const PNode*pn);
void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file,Vec*stack);
void gen_free(Gen*gen);
void gen_prolog(Gen*gen,const PNode*pn,FILE*file,size_t stacksize);
void gen_setrootnode(Gen*gen,PNode*rootnode);
void vec_print_tokens(Vec*tokens);