static bool constant_folding;
static bool initializer_use_bitfield_basetype;
-extern bool have_const_functions;
-
static const entity_t *current_function_entity;
static ir_node *current_function_name;
static ir_node *current_funcsig;
}
if (modifiers & DM_CONST) {
add_entity_additional_properties(irentity, mtp_property_const);
- have_const_functions = true;
}
}
if (modifiers & DM_USED) {
* Creates a SymConst for a given entity.
*
* @param dbgi debug info
- * @param mode the (reference) mode for the SymConst
* @param entity the entity
*/
-static ir_node *create_symconst(dbg_info *dbgi, ir_mode *mode,
- ir_entity *entity)
+static ir_node *create_symconst(dbg_info *dbgi, ir_entity *entity)
{
assert(entity != NULL);
union symconst_symbol sym;
sym.entity_p = entity;
- return new_d_SymConst(dbgi, mode, sym, symconst_addr_ent);
+ return new_d_SymConst(dbgi, mode_P, sym, symconst_addr_ent);
}
static ir_node *create_conv(dbg_info *dbgi, ir_node *value, ir_mode *dest_mode)
}
set_entity_initializer(entity, initializer);
- return create_symconst(dbgi, mode_P_data, entity);
+ return create_symconst(dbgi, entity);
}
/**
}
set_entity_initializer(entity, initializer);
- return create_symconst(dbgi, mode_P_data, entity);
+ return create_symconst(dbgi, entity);
}
static bool try_create_integer(literal_expression_t *literal,
assert(entity != NULL);
ir_node *in[3];
in[0] = get_trampoline_region(dbgi, entity);
- in[1] = create_symconst(dbgi, mode, entity);
+ in[1] = create_symconst(dbgi, entity);
in[2] = get_irg_frame(current_ir_graph);
ir_node *irn = new_d_Builtin(dbgi, get_store(), 3, in, ir_bk_inner_trampoline, get_unknown_type());
return new_d_strictConv(dbgi, node, mode);
}
-/**
- * Returns the address of a global variable.
- *
- * @param dbgi debug info
- * @param variable the variable
- */
-static ir_node *get_global_var_address(dbg_info *const dbgi,
- const variable_t *const variable)
-{
- ir_entity *const irentity = variable->v.entity;
- if (variable->thread_local) {
- ir_node *const no_mem = new_NoMem();
- ir_node *const tls = get_irg_tls(current_ir_graph);
- return new_d_simpleSel(dbgi, no_mem, tls, irentity);
- } else {
- return create_symconst(dbgi, mode_P_data, irentity);
- }
-}
-
/**
* Returns the correct base address depending on whether it is a parameter or a
* normal local variable.
return create_conv(NULL, value, get_ir_mode_arithmetic(type));
}
case DECLARATION_KIND_FUNCTION: {
- ir_mode *const mode = get_ir_mode_storage(type);
- return create_symconst(dbgi, mode, entity->function.irentity);
+ return create_symconst(dbgi, entity->function.irentity);
}
case DECLARATION_KIND_INNER_FUNCTION: {
ir_mode *const mode = get_ir_mode_storage(type);
if (!entity->function.goto_to_outer && !entity->function.need_closure) {
/* inner function not using the closure */
- return create_symconst(dbgi, mode, entity->function.irentity);
+ return create_symconst(dbgi, entity->function.irentity);
} else {
/* need trampoline here */
return create_trampoline(dbgi, mode, entity->function.irentity);
}
case DECLARATION_KIND_GLOBAL_VARIABLE: {
const variable_t *variable = &entity->variable;
- ir_node *const addr = get_global_var_address(dbgi, variable);
+ ir_node *const addr = create_symconst(dbgi, variable->v.entity);
return deref_address(dbgi, variable->base.type, addr);
}
* as an indicator for no real address) */
return NULL;
case DECLARATION_KIND_GLOBAL_VARIABLE: {
- ir_node *const addr = get_global_var_address(dbgi, &entity->variable);
+ ir_node *const addr = create_symconst(dbgi, entity->variable.v.entity);
return addr;
}
case DECLARATION_KIND_LOCAL_VARIABLE_ENTITY: {
return entity->variable.v.vla_base;
case DECLARATION_KIND_FUNCTION: {
- type_t *const type = skip_typeref(entity->declaration.type);
- ir_mode *const mode = get_ir_mode_storage(type);
- return create_symconst(dbgi, mode, entity->function.irentity);
+ return create_symconst(dbgi, entity->function.irentity);
}
case DECLARATION_KIND_INNER_FUNCTION: {
ir_mode *const mode = get_ir_mode_storage(type);
if (!entity->function.goto_to_outer && !entity->function.need_closure) {
/* inner function not using the closure */
- return create_symconst(dbgi, mode, entity->function.irentity);
+ return create_symconst(dbgi, entity->function.irentity);
} else {
/* need trampoline here */
return create_trampoline(dbgi, mode, entity->function.irentity);
}
}
-static ir_node *create_cast(dbg_info *dbgi, ir_node *value_node,
+static ir_node *create_cast(dbg_info *dbgi, ir_node *value_node,
type_t *from_type, type_t *type)
{
type = skip_typeref(type);
const variable_t *to_var = type->pointer.base_variable;
if (from_var != to_var) {
if (from_var != NULL) {
- ir_node *const addr = get_global_var_address(dbgi, from_var);
+ ir_node *const addr = create_symconst(dbgi, from_var->v.entity);
ir_node *const base = deref_address(dbgi, from_var->base.type, addr);
value_node = new_d_Add(dbgi, value_node, base, get_ir_mode_storage(from_type));
}
if (to_var != NULL) {
- ir_node *const addr = get_global_var_address(dbgi, to_var);
+ ir_node *const addr = create_symconst(dbgi, to_var->v.entity);
ir_node *const base = deref_address(dbgi, to_var->base.type, addr);
value_node = new_d_Sub(dbgi, value_node, base, mode);
}
/* check for __based */
const variable_t *const base_var = value_type->pointer.base_variable;
if (base_var != NULL) {
- ir_node *const addr = get_global_var_address(dbgi, base_var);
+ ir_node *const addr = create_symconst(dbgi, base_var->v.entity);
ir_node *const base = deref_address(dbgi, base_var->base.type, addr);
value_node = new_d_Add(dbgi, value_node, base, get_ir_mode_storage(value_type));
}
set_entity_initializer(init_entity, irinitializer);
- ir_node *const src_addr = create_symconst(dbgi, mode_P_data, init_entity);
+ ir_node *const src_addr = create_symconst(dbgi, init_entity);
ir_node *const copyb = new_d_CopyB(dbgi, memory, addr, src_addr, irtype);
ir_node *const copyb_mem = new_Proj(copyb, mode_M, pn_CopyB_M);
}
}
-static void ms_try_statement_to_firm(ms_try_statement_t *statement)
+static void ms_try_statement_to_firm(ms_try_statement_t *statement)
{
statement_to_firm(statement->try_statement);
warningf(&statement->base.source_position, "structured exception handling ignored");
}
-static void leave_statement_to_firm(leave_statement_t *statement)
+static void leave_statement_to_firm(leave_statement_t *statement)
{
errorf(&statement->base.source_position, "__leave not supported yet");
}