-fpic implemented
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 2 Apr 2008 14:25:36 +0000 (14:25 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 2 Apr 2008 14:25:36 +0000 (14:25 +0000)
[r19070]

ast2firm.c
driver/firm_cmdline.c
driver/firm_cmdline.h

index ffddd48..0baaaab 100644 (file)
@@ -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);
index e06fc70..955813d 100644 (file)
@@ -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 */
index d6816bb..79e54a4 100644 (file)
@@ -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 */