X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Ftr%2Fentity.c;h=3b9f828870e0a5d08f26821263c4357f1aeb25a4;hb=d1c320e0ad36adec0906a6a246db5de17a228934;hp=611522888ad9f7f11da6a71e0059e4c400635534;hpb=89f9163de1bb311215bc07bce4e6d1358ec7cbd0;p=libfirm diff --git a/ir/tr/entity.c b/ir/tr/entity.c index 611522888..3b9f82887 100644 --- a/ir/tr/entity.c +++ b/ir/tr/entity.c @@ -1,34 +1,40 @@ /* - * Project: libFIRM - * File name: ir/tr/entity.c - * Purpose: Representation of all program known entities. - * Author: Martin Trapp, Christian Schaefer - * Modified by: Goetz Lindenmaier, Michael Beck - * Created: - * CVS-ID: $Id$ - * Copyright: (c) 1998-2007 Universität Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +/** + * @file + * @brief Representation of all program known entities. + * @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck + * @version $Id$ */ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STDLIB_H -# include -#endif -#ifdef HAVE_STDDEF_H -# include -#endif +#include +#include +#include #include "firm_common_t.h" #include "xmalloc.h" #include "entity_t.h" -#include "mangle.h" -#include "typegmod.h" #include "array.h" #include "irtools.h" #include "irhooks.h" @@ -42,14 +48,43 @@ #include "callgraph.h" /* for dumping debug output */ -/*******************************************************************/ +/** + * An interval initializer. + */ +typedef struct interval_initializer interval_initializer; + +/** + * A value initializer. + */ +typedef struct value_initializer value_initializer; + +struct interval_initializer { + int first_index; /**< The first index of the initialized interval. */ + int last_index; /**< The last index of the initialized interval. */ + interval_initializer *next; /**< Points to the next interval initializer. */ +}; + +struct value_initializer { + ir_entity *ent; /**< The initialized entity. */ + value_initializer *next; /**< Points to the next value initializer. */ +}; + +typedef union initializer { + ir_node *value; /**< The value of the initializer. */ + ir_node **values; /**< The values of an interval. */ + value_initializer *val_init; /**< Points the the head of the next value initializers. */ + interval_initializer *int_init; /**< Points to the head of the next value initializers. */ +} initializer; + +/*-----------------------------------------------------------------*/ /** general **/ -/*******************************************************************/ +/*-----------------------------------------------------------------*/ ir_entity *unknown_entity = NULL; ir_entity *get_unknown_entity(void) { return unknown_entity; } +/** The name of the unknown entity. */ #define UNKNOWN_ENTITY_NAME "unknown_entity" /*-----------------------------------------------------------------*/ @@ -108,11 +143,13 @@ new_rd_entity(dbg_info *db, ir_type *owner, ident *name, ir_type *type) res->allocation = allocation_automatic; res->visibility = visibility_local; res->volatility = volatility_non_volatile; + res->align = align_is_aligned; res->stickyness = stickyness_unsticky; res->peculiarity = peculiarity_existent; res->address_taken = ir_address_taken_unknown; res->final = 0; res->compiler_gen = 0; + res->backend_marked = 0; res->offset = -1; res->offset_bit_remainder = 0; res->link = NULL; @@ -195,7 +232,7 @@ static void free_entity_attrs(ir_entity *ent) { } if (is_compound_entity(ent)) { if (ent->attr.cmpd_attr.val_paths) { - for (i = 0; i < get_compound_ent_n_values(ent); i++) + for (i = get_compound_ent_n_values(ent) - 1; i >= 0; --i) if (ent->attr.cmpd_attr.val_paths[i]) { /* free_compound_graph_path(ent->attr.cmpd_attr.val_paths[i]) ; * @@@ warum nich? */ /* Geht nich: wird mehrfach verwendet!!! ==> mehrfach frei gegeben. */ @@ -445,7 +482,7 @@ void _set_entity_volatility(ent, vol); } /* set_entity_volatility */ -/* return the name of the volatility */ +/* Return the name of the volatility. */ const char *get_volatility_name(ir_volatility var) { #define X(a) case a: return #a @@ -457,6 +494,28 @@ const char *get_volatility_name(ir_volatility var) #undef X } /* get_volatility_name */ +ir_align +(get_entity_align)(const ir_entity *ent) { + return _get_entity_align(ent); +} /* get_entity_align */ + +void +(set_entity_align)(ir_entity *ent, ir_align a) { + _set_entity_align(ent, a); +} /* set_entity_align */ + +/* Return the name of the alignment. */ +const char *get_align_name(ir_align a) +{ +#define X(a) case a: return #a + switch (a) { + X(align_non_aligned); + X(align_is_aligned); + default: return "BAD VALUE"; + } +#undef X +} /* get_align_name */ + ir_peculiarity (get_entity_peculiarity)(const ir_entity *ent) { return _get_entity_peculiarity(ent); @@ -487,6 +546,16 @@ void (set_entity_compiler_generated)(ir_entity *ent, int flag) { _set_entity_compiler_generated(ent, flag); } /* set_entity_compiler_generated */ +/* Checks if an entity is marked by the backend */ +int (is_entity_backend_marked)(const ir_entity *ent) { + return _is_entity_backend_marked(ent); +} /* is_entity_backend_marked */ + +/* Sets/resets the compiler generated flag */ +void (set_entity_backend_marked)(ir_entity *ent, int flag) { + _set_entity_backend_marked(ent, flag); +} /* set_entity_backend_marked */ + /* Checks if the address of an entity was taken. */ ir_address_taken_state (get_entity_address_taken)(const ir_entity *ent) { return _get_entity_address_taken(ent); @@ -609,7 +678,6 @@ ir_node *copy_const_value(dbg_info *dbg, ir_node *n) { case iro_Unknown: nn = new_d_Unknown(m); break; default: - DDMN(n); assert(0 && "opcode invalid or not implemented"); nn = NULL; break; @@ -787,7 +855,8 @@ static int equal_paths(compound_graph_path *path1, int *visited_indices, compoun * Returns the position of a value with the given path. * The path must contain array indices for all array element entities. * - * @todo This implementation is very low and should be replaced when the new tree oriented + * @todo This implementation is very slow (O(number of initializers^2) and should + * be replaced when the new tree oriented * value representation is finally implemented. */ static int get_compound_ent_pos_by_path(ir_entity *ent, compound_graph_path *path) { @@ -1172,6 +1241,8 @@ int is_method_entity(ir_entity *ent) { /** * @todo not implemented!!! */ int equal_entity(ir_entity *ent1, ir_entity *ent2) { + (void) ent1; + (void) ent2; fprintf(stderr, " calling unimplemented equal entity!!! \n"); return 1; } /* equal_entity */ @@ -1263,6 +1334,14 @@ ir_type *(get_entity_repr_class)(const ir_entity *ent) { return _get_entity_repr_class(ent); } /* get_entity_repr_class */ +dbg_info *(get_entity_dbg_info)(const ir_entity *ent) { + return _get_entity_dbg_info(ent); +} /* get_entity_dbg_info */ + +void (set_entity_dbg_info)(ir_entity *ent, dbg_info *db) { + _set_entity_dbg_info(ent, db); +} /* set_entity_dbg_info */ + /* Initialize entity module. */ void firm_init_entity(void) {