*/
static ir_type *create_complex_type(const complex_type_t *type)
{
+ /*
dbg_info *dbgi = get_dbg_info(&type->base.source_position);
atomic_type_kind_t kind = type->akind;
ir_mode *mode = _atomic_modes[kind];
ident *id = get_mode_ident(mode);
+ */
+ (void)type;
/* FIXME: finish the array */
return NULL;
return new_d_Const(dbgi, mode, tv);
}
-static ir_node *create_symconst(dbg_info *dbgi, ir_mode *mode,
+static ir_node *create_global(dbg_info *dbgi, ir_mode *mode,
ir_entity *entity)
{
assert(entity != NULL);
- union symconst_symbol sym;
- sym.entity_p = entity;
- return new_d_SymConst(dbgi, mode, sym, symconst_addr_ent);
+ if(firm_opt.pic) {
+ ir_graph *irg = current_ir_graph;
+ return new_d_simpleSel(dbgi, get_irg_no_mem(irg),
+ get_irg_globals(irg), entity);
+ } else {
+ symconst_symbol sym;
+ sym.entity_p = entity;
+ return new_d_SymConst(dbgi, mode, sym, symconst_addr_ent);
+ }
}
static ir_node *string_to_firm(const source_position_t *const src_pos,
set_array_entity_values(entity, tvs, slen);
free(tvs);
- return create_symconst(dbgi, mode_P_data, entity);
+ return create_global(dbgi, mode_P_data, entity);
}
static ir_node *string_literal_to_firm(
set_array_entity_values(entity, tvs, slen);
free(tvs);
- return create_symconst(dbgi, mode_P_data, entity);
+ return create_global(dbgi, mode_P_data, entity);
}
static ir_node *deref_address(type_t *const type, ir_node *const addr,
}
default:
- return create_symconst(dbgi, mode_P_data, entity);
+ return create_global(dbgi, mode_P_data, entity);
}
}
}
case DECLARATION_KIND_FUNCTION: {
ir_mode *const mode = get_ir_mode(type);
- return create_symconst(dbgi, mode, declaration->v.entity);
+ return create_global(dbgi, mode, declaration->v.entity);
}
case DECLARATION_KIND_GLOBAL_VARIABLE: {
ir_node *const addr = get_global_var_address(dbgi, declaration);
case DECLARATION_KIND_FUNCTION: {
type_t *const type = skip_typeref(ref->base.type);
ir_mode *const mode = get_ir_mode(type);
- return create_symconst(dbgi, mode, declaration->v.entity);
+ return create_global(dbgi, mode, declaration->v.entity);
}
case DECLARATION_KIND_GLOBAL_VARIABLE: {
ir_node *const addr = get_global_var_address(dbgi, declaration);
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_global(dbgi, mode_P_data, 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_regular);
/* os_support = */ OS_SUPPORT_LINUX,
/* honor_restrict = */ TRUE,
/* lower_bitfields = */ TRUE,
+ /* pic = */ FALSE,
/* ycomp_dbg = */ FALSE,
/* ycomp_host = */ FIRM_YCOMP_DEFAULT_HOST,
/* ycomp_port = */ FIRM_YCOMP_DEFAULT_PORT,
{ X("help"), NULL, 0, "print FCC related help options" },
/* firm optimization options */
+ { X("pic"), &firm_opt.pic, 1, "firm: generate position independent code" },
{ X("g0"), &firm_opt.debug_mode, DBG_MODE_BACKSTORE, "firm: Debug Mode: use back stores" },
{ X("g1"), &firm_opt.debug_mode, DBG_MODE_FULL, "firm: Debug Mode: no register variables" },
{ X("no-opt"), NULL, 0, "firm: disable all FIRM optimizations" },
firm_get_version(&version);
fprintf(f, "Firm C-Compiler using libFirm (%u.%u", version.major, version.minor);
- if(version.revision[0] != 0) {
+ if (version.revision[0] != 0) {
fputc(' ', f);
fputs(version.revision, f);
}
fputc(' ', f);
fputs(version.build, f);
}
- fputs(")\n", f);
- fprintf(f, "(C) 2006-2007 Michael Beck\n"
- "(C) 1995-2007 University of Karlsruhe\n"
+ fprintf(f, "}\n"
+ "(C) 2005-2008 Michael Beck\n"
+ "(C) 1995-2008 University of Karlsruhe\n"
"Using ");
} /* print_firm_version */