static ir_type *create_bitfield_type(bitfield_type_t *const type)
{
type_t *base = skip_typeref(type->base_type);
- assert(base->kind == TYPE_ATOMIC);
+ assert(base->kind == TYPE_ATOMIC || base->kind == TYPE_ENUM);
ir_type *irbase = get_ir_type(base);
unsigned size = fold_constant(type->size);
id = mangle(id_underscore, get_entity_ident(ent));
}
- decl_modifiers_t decl_modifiers = declaration->decl_modifiers;
+ decl_modifiers_t decl_modifiers = declaration->modifiers;
if (decl_modifiers & DM_DLLIMPORT) {
/* add prefix for imported symbols */
id = mangle(id_imp, id);
dbg_info *const dbgi = get_dbg_info(&declaration->source_position);
entity = new_d_entity(global_type, id, ir_type_method, dbgi);
set_entity_ld_ident(entity, create_ld_ident(entity, declaration));
- if (declaration->storage_class == STORAGE_CLASS_STATIC &&
- declaration->init.statement == NULL) {
- /* this entity was declared, but never defined */
- set_entity_peculiarity(entity, peculiarity_description);
+
+ /* static inline => local
+ * extern inline => local
+ * inline without definition => local
+ * inline with definition => external_visible */
+
+ if (declaration->is_inline && declaration->storage_class == STORAGE_CLASS_NONE
+ && declaration->init.statement != NULL) {
+ set_entity_visibility(entity, visibility_external_visible);
}
- if (declaration->storage_class == STORAGE_CLASS_STATIC
+ else if (declaration->storage_class == STORAGE_CLASS_STATIC
|| declaration->is_inline) {
+ if (declaration->init.statement == NULL) {
+ /* this entity was declared, but is defined nowhere */
+ set_entity_peculiarity(entity, peculiarity_description);
+ }
set_entity_visibility(entity, visibility_local);
} else if (declaration->init.statement != NULL) {
set_entity_visibility(entity, visibility_external_visible);
return;
}
+ type_t *type = skip_typeref(declaration->type);
+
if (initializer->kind == INITIALIZER_VALUE) {
initializer_value_t *initializer_value = &initializer->value;
dbg_info *dbgi
ir_entity *entity = declaration->v.entity;
- set_entity_variability(entity, variability_initialized);
+ if (type->base.qualifiers & TYPE_QUALIFIER_CONST) {
+ set_entity_variability(entity, variability_constant);
+ } else {
+ set_entity_variability(entity, variability_initialized);
+ }
set_atomic_ent_value(entity, value);
}
} else {
ir_entity *entity = declaration->v.entity;
ir_initializer_t *irinitializer
- = create_ir_initializer(initializer, declaration->type);
+ = create_ir_initializer(initializer, type);
- set_entity_variability(entity, variability_initialized);
+ if (type->base.qualifiers & TYPE_QUALIFIER_CONST) {
+ set_entity_variability(entity, variability_constant);
+ } else {
+ set_entity_variability(entity, variability_initialized);
+ }
set_entity_initializer(entity, irinitializer);
}
}
}
}
+static void add_function_pointer(ir_type *segment, ir_entity *method,
+ const char *unique_template)
+{
+ ir_type *method_type = get_entity_type(method);
+ ident *id = id_unique(unique_template);
+ ir_type *ptr_type = new_type_pointer(id, method_type, mode_P_code);
+
+ ident *ide = id_unique(unique_template);
+ ir_entity *ptr = new_entity(segment, ide, ptr_type);
+ ir_graph *irg = get_const_code_irg();
+ ir_node *val = new_rd_SymConst_addr_ent(NULL, irg, mode_P_code,
+ method, NULL);
+
+ set_entity_compiler_generated(ptr, 1);
+ set_entity_variability(ptr, variability_constant);
+ set_atomic_ent_value(ptr, val);
+}
+
/**
* Create code for a function.
*/
if (declaration->init.statement == NULL)
return;
+ if (declaration->modifiers & DM_CONSTRUCTOR) {
+ ir_type *segment = get_segment_type(IR_SEGMENT_CONSTRUCTORS);
+ add_function_pointer(segment, function_entity, "constructor_ptr.%u");
+ }
+ if (declaration->modifiers & DM_DESTRUCTOR) {
+ ir_type *segment = get_segment_type(IR_SEGMENT_DESTRUCTORS);
+ add_function_pointer(segment, function_entity, "destructor_ptr.%u");
+ }
+
current_function_decl = declaration;
current_function_name = NULL;
current_funcsig = NULL;
/* set inline flags */
if (declaration->is_inline)
set_irg_inline_property(irg, irg_inline_recomended);
- handle_decl_modifier_irg(irg, declaration->decl_modifiers);
+ handle_decl_modifier_irg(irg, declaration->modifiers);
next_value_number_function = 0;
initialize_function_parameters(declaration);