Gen state, test if
This commit is contained in:
parent
545b77c6be
commit
5db78f0b81
2
Makefile
2
Makefile
@ -4,7 +4,7 @@
|
||||
CFLAGS= -Wfatal-errors -Wall -Wextra
|
||||
LDFLAGS= -s -no-pie -z noexecstack
|
||||
NASMFLAGS=-Fdwarf -felf64
|
||||
OBJS= str.o tok.o vec.o lex.o pnode.o reg.o mem.o state.o err.o x86_64.o run.o ir.o rpn.o
|
||||
OBJS= str.o tok.o vec.o lex.o pnode.o reg.o mem.o state.o err.o x86_64.o run.o ir.o rpn.o gen.o
|
||||
LIB= libpar.a
|
||||
TESTS_x86_64= $(notdir $(basename $(shell find tests/x86_64/ -name '*.par')))
|
||||
PAR= ./par
|
||||
|
9
gen.h
9
gen.h
@ -5,12 +5,15 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include"ir.h"
|
||||
#include"x86_64.h"
|
||||
#include"run.h"
|
||||
// #include"ir.h"
|
||||
// #include"x86_64.h"
|
||||
// #include"run.h"
|
||||
#include"mem.h"
|
||||
|
||||
typedef struct Gen
|
||||
{
|
||||
size_t labelno;
|
||||
Var vars;
|
||||
} Gen;
|
||||
|
||||
Gen gen_new(void);
|
||||
|
2
main.c
2
main.c
@ -201,7 +201,7 @@ int main(int argc,char**argv)
|
||||
break;
|
||||
|
||||
case M_X86_64:
|
||||
gen_x86_64(&state.parser.root,state.outfile);
|
||||
gen_x86_64(&state.gen,&state.parser.root,state.outfile);
|
||||
break;
|
||||
|
||||
}
|
||||
|
1
state.c
1
state.c
@ -22,6 +22,7 @@ State state_new(void)
|
||||
State st=(State){
|
||||
.lexer=lex_new(),
|
||||
.parser=parser_new(),
|
||||
.gen=gen_new(),
|
||||
.input_buffer=str_new(),
|
||||
.infile=stdin,
|
||||
.outfile=NULL,
|
||||
|
1
state.h
1
state.h
@ -24,6 +24,7 @@ typedef struct State
|
||||
Parser parser;
|
||||
Str input_buffer;
|
||||
Vec errors;
|
||||
Gen gen;
|
||||
FILE*infile;
|
||||
FILE*outfile;
|
||||
char*infilename;
|
||||
|
9
tests/x86_64/if.par
Normal file
9
tests/x86_64/if.par
Normal file
@ -0,0 +1,9 @@
|
||||
#:123
|
||||
fn main()
|
||||
{
|
||||
if(false)
|
||||
x=12;
|
||||
if(true)
|
||||
x=(256-128)-5;
|
||||
ret;
|
||||
}
|
29
x86_64.c
29
x86_64.c
@ -12,9 +12,8 @@ void gen_x86_64_prolog(PNode*pn,FILE*file,size_t stacksize);
|
||||
void gen_x86_64_epilog(PNode*pn,FILE*file);
|
||||
void gen_x86_64_eval(PNode*pn,FILE*file);
|
||||
|
||||
void gen_x86_64(PNode*pn,FILE*file)
|
||||
void gen_x86_64(Gen*gen,PNode*pn,FILE*file)
|
||||
{
|
||||
size_t labelno=1;
|
||||
|
||||
if(!pn)
|
||||
{
|
||||
@ -38,7 +37,7 @@ void gen_x86_64(PNode*pn,FILE*file)
|
||||
fprintf(file,"global %s\n%s:\n",vec_at(&pn->tokens,0,Tok*)->str.buffer,vec_at(&pn->tokens,0,Tok*)->str.buffer);
|
||||
gen_x86_64_prolog(pn,file,0);
|
||||
for(size_t i=0;i<pn->pnodes.size;++i)
|
||||
gen_x86_64(vec_at(&pn->pnodes,i,PNode*),file);
|
||||
gen_x86_64(gen,vec_at(&pn->pnodes,i,PNode*),file);
|
||||
//gen_x86_64_epilog(pn,file);
|
||||
break;
|
||||
|
||||
@ -156,28 +155,30 @@ void gen_x86_64(PNode*pn,FILE*file)
|
||||
gen_x86_64_eval(pn,file);
|
||||
fprintf(file,"\tcmp eax,0\n");
|
||||
}
|
||||
fprintf(file,"\tjz .L%02lu\n",++labelno);
|
||||
++gen->labelno;
|
||||
fprintf(file,"\tjz .L%02lu\n",gen->labelno);
|
||||
|
||||
for(size_t i=0;i<pn->pnodes.size;++i)
|
||||
gen_x86_64(vec_at(&pn->pnodes,i,PNode*),file);
|
||||
gen_x86_64(gen,vec_at(&pn->pnodes,i,PNode*),file);
|
||||
|
||||
fprintf(file,".L%02lu\n",labelno);
|
||||
fprintf(file,".L%02lu:\n",gen->labelno);
|
||||
break;
|
||||
|
||||
case PWHILE:
|
||||
fprintf(file,".L%02lu:\n",++labelno);
|
||||
++gen->labelno;
|
||||
fprintf(file,".L%02lu:\n",gen->labelno);
|
||||
if(pn->tokens.size>1)
|
||||
{
|
||||
gen_x86_64_eval(pn,file);
|
||||
fprintf(file,"\tcmp eax,0\n");
|
||||
}
|
||||
fprintf(file,"\tjz .L%02lu\n",++labelno);
|
||||
fprintf(file,"\tjz .L%02lu\n",++gen->labelno);
|
||||
|
||||
for(size_t i=0;i<pn->pnodes.size;++i)
|
||||
gen_x86_64(vec_at(&pn->pnodes,i,PNode*),file);
|
||||
gen_x86_64(gen,vec_at(&pn->pnodes,i,PNode*),file);
|
||||
|
||||
fprintf(file,"\tjmp .L%02lu\n",labelno-1);
|
||||
fprintf(file,".L%02lu\n",labelno);
|
||||
fprintf(file,"\tjmp .L%02lu\n",gen->labelno-1);
|
||||
fprintf(file,".L%02lu:\n",gen->labelno);
|
||||
break;
|
||||
|
||||
case PCOMMENT:
|
||||
@ -186,7 +187,7 @@ void gen_x86_64(PNode*pn,FILE*file)
|
||||
|
||||
case PBLOCK:
|
||||
for(size_t i=0;i<pn->pnodes.size;++i)
|
||||
gen_x86_64(vec_at(&pn->pnodes,i,PNode*),file);
|
||||
gen_x86_64(gen,vec_at(&pn->pnodes,i,PNode*),file);
|
||||
break;
|
||||
|
||||
case PEMPTY:
|
||||
@ -194,7 +195,7 @@ void gen_x86_64(PNode*pn,FILE*file)
|
||||
if(pn->parentnode==NULL)
|
||||
{
|
||||
for(size_t i=0;i<pn->pnodes.size;++i)
|
||||
gen_x86_64(vec_at(&pn->pnodes,i,PNode*),file);
|
||||
gen_x86_64(gen,vec_at(&pn->pnodes,i,PNode*),file);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -215,7 +216,7 @@ void gen_x86_64(PNode*pn,FILE*file)
|
||||
}
|
||||
|
||||
//for(size_t i=0;i<pn->pnodes.size;++i)
|
||||
//gen_x86_64(vec_at(&pn->pnodes,i,PNode*),file);
|
||||
//gen_x86_64(gen,vec_at(&pn->pnodes,i,PNode*),file);
|
||||
}
|
||||
|
||||
void gen_x86_64_prolog(PNode*pn,FILE*file,size_t stacksize)
|
||||
|
Loading…
Reference in New Issue
Block a user