mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-23 20:33:05 +00:00
Adding from astcodegen.c
This commit is contained in:
parent
e9b581adfb
commit
6236a0c464
1 changed files with 74 additions and 0 deletions
74
ast.c
74
ast.c
|
@ -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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue