Adding from astcodegen.c

This commit is contained in:
Wolfgang (Blub) Bumiller 2012-04-25 13:24:25 +02:00
parent e9b581adfb
commit 6236a0c464

74
ast.c
View file

@ -153,3 +153,77 @@ void ast_function_delete(ast_function *self)
MEM_VECTOR_CLEAR(self, blocks); MEM_VECTOR_CLEAR(self, blocks);
mem_d(self); mem_d(self);
} }
/*********************************************************************/
/* AST codegen aprt
*/
static qbool ast_value_gen_global(ir_builder *ir, ast_value *self, ir_value **out)
{
ir_value *v;
*out = NULL;
/* Generate functions */
if (self->vtype == qc_function && self->has_constval)
{
/* Without has_constval it would be invalid... function pointers actually have
* type qc_pointer and next with type qc_function
*/
ast_function *func = self->cvalue.vfunc;
(void)func;
if (!ast_function_codegen(func, ir))
return ifalse;
/* Here we do return NULL anyway */
return itrue;
}
else if (self->vtype == qc_function && !self->has_constval) {
fprintf(stderr,
"!v->has_constval <- qc_function body missing - FIXME: remove when implementing prototypes\n");
fprintf(stderr, "Value: %s\n", self->_name);
abort();
}
v = ir_builder_create_global(ir, self->_name, self->vtype);
self->ir_v = v;
*out = v;
return itrue;
}
qbool ast_value_codegen(ast_value *self, ast_function *func, ir_value **out)
{
if (!func)
return ast_value_gen_global(parser.ir, self, out);
return ifalse;
}
qbool ast_function_codegen(ast_function *self, ir_builder *builder)
{
size_t i;
for (i = 0; i < self->blocks_count; ++i)
{
ast_expression *expr;
ir_value *out;
expr = (ast_expression*)self->blocks[i];
if (!(expr->expression.codegen)(expr, self, &out))
{
/* there was an error while building this expression... */
return ifalse;
}
(void)out;
}
return itrue;
}
qbool ast_block_codegen(ast_block *self, ir_function *func, ir_value **out)
{
return ifalse;
}
qbool ast_bin_store_codegen(ast_binary *self, ir_function *func, ir_value **out)
{
return ifalse;
}