Gen state, test if

This commit is contained in:
corey 2023-11-09 11:38:11 -06:00
parent 545b77c6be
commit 5db78f0b81
8 changed files with 36 additions and 20 deletions

View File

@ -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
View File

@ -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
View File

@ -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;
}

View File

@ -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,

View File

@ -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
View File

@ -0,0 +1,9 @@
#:123
fn main()
{
if(false)
x=12;
if(true)
x=(256-128)-5;
ret;
}

View File

@ -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)

View File

@ -3,6 +3,7 @@
#include<stdio.h>
#include"state.h"
#include"mem.h"
#include"gen.h"
void gen_x86_64(PNode*pn,FILE*file);
void gen_x86_64(Gen*gen,PNode*pn,FILE*file);
void gen_x86_64_eval(PNode*pn,FILE*file);