From: Michael Beck Date: Wed, 2 Apr 2008 14:25:36 +0000 (+0000) Subject: -fpic implemented X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=31b78ca8ffddd0f74a9fa9fb18e001fd8651be5a;p=cparser -fpic implemented [r19070] --- diff --git a/ast2firm.c b/ast2firm.c index ffddd48..0baaaab 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -306,10 +306,13 @@ static ir_type *create_atomic_type(const atomic_type_t *type) */ 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; @@ -1086,13 +1089,19 @@ static ir_node *wide_character_constant_to_firm(const const_expression_t *cnst) 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, @@ -1129,7 +1138,7 @@ 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( @@ -1172,7 +1181,7 @@ static ir_node *wide_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, @@ -1235,7 +1244,7 @@ static ir_node *get_global_var_address(dbg_info *const dbgi, } default: - return create_symconst(dbgi, mode_P_data, entity); + return create_global(dbgi, mode_P_data, entity); } } @@ -1278,7 +1287,7 @@ static ir_node *reference_expression_to_firm(const reference_expression_t *ref) } 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); @@ -1316,7 +1325,7 @@ static ir_node *reference_addr(const reference_expression_t *ref) 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); @@ -3477,7 +3486,7 @@ static void create_local_initializer(initializer_t *initializer, dbg_info *dbgi, 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); diff --git a/driver/firm_cmdline.c b/driver/firm_cmdline.c index e06fc70..955813d 100644 --- a/driver/firm_cmdline.c +++ b/driver/firm_cmdline.c @@ -59,6 +59,7 @@ struct a_firm_opt firm_opt = { /* 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, @@ -111,6 +112,7 @@ static const struct params { { 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" }, @@ -407,7 +409,7 @@ void print_firm_version(FILE *f) { 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); } @@ -415,8 +417,8 @@ void print_firm_version(FILE *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 */ diff --git a/driver/firm_cmdline.h b/driver/firm_cmdline.h index d6816bb..79e54a4 100644 --- a/driver/firm_cmdline.h +++ b/driver/firm_cmdline.h @@ -72,6 +72,7 @@ struct a_firm_opt { a_byte os_support; /**< current os support */ a_byte honor_restrict; /**< enable restrict keyword */ a_byte lower_bitfields; /**< lower bitfield access */ + a_byte pic; /**< generate position independent code */ a_byte ycomp_dbg; /**< yComp debugger extension */ char *ycomp_host; /**< The host, yComp is running on */ int ycomp_port; /**< The port, yComp is listening on */