static type_t *type_void;
static type_t *type_int;
-static symbol_t *symbol_builtin_alloca;
-static symbol_t *symbol_builtin_nanf;
-
static int next_value_number_function;
static ir_node *continue_label;
static ir_node *break_label;
type in firm */
type_void->base.firm_type = ir_type_void;
-
- symbol_builtin_alloca = symbol_table_insert("__builtin_alloca");
- symbol_builtin_nanf = symbol_table_insert("__builtin_nanf");
}
void exit_ast2firm(void)
dbg_info *dbgi = get_dbg_info(&call->expression.source_position);
assert(call->function->type == EXPR_BUILTIN_SYMBOL);
- builtin_symbol_expression_t *builtin
- = (builtin_symbol_expression_t*) call->function;
- symbol_t *symbol = builtin->symbol;
+ builtin_symbol_expression_t *builtin = &call->function->builtin_symbol;
+ symbol_t *symbol = builtin->symbol;
+ type_t *type = builtin->expression.datatype;
+ type = skip_typeref(type);
- if(symbol == symbol_builtin_alloca) {
+ switch(symbol->ID) {
+ case T___builtin_alloca: {
if(call->arguments == NULL || call->arguments->next != NULL) {
panic("invalid number of parameters on __builtin_alloca");
}
ir_node *res = new_Proj(alloca, mode_P_data, pn_Alloc_res);
return res;
- } else if(symbol == symbol_builtin_nanf) {
+ }
+ case T___builtin_nan:
+ case T___builtin_nanf:
+ case T___builtin_nand: {
/* Ignore string for now... */
- ir_mode *mode = mode_D;
+ assert(type->type == TYPE_FUNCTION);
+ ir_mode *mode = get_ir_mode(type->function.result_type);
tarval *tv = get_mode_NAN(mode);
ir_node *res = new_d_Const(dbgi, mode, tv);
return res;
- } else {
+ }
+ default:
panic("Unsupported builtin found\n");
}
}
switch(symbol->ID) {
case T___builtin_alloca:
return make_function_1_type(type_void_ptr, type_size_t);
- case T___builtin_nanf:
+ case T___builtin_nan:
return make_function_1_type(type_double, type_string);
+ case T___builtin_nanf:
+ return make_function_1_type(type_float, type_string);
+ case T___builtin_nand:
+ return make_function_1_type(type_long_double, type_string);
default:
panic("not implemented builtin symbol found");
}