removed warnings
[libfirm] / ir / tr / entity.h
index e70924c..31e25e3 100644 (file)
@@ -1,46 +1,46 @@
 /*
-**  Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
-**  All rights reserved.
-**
-**  Authors: Martin Trapp, Christian Schaefer,
-**           Goetz Lindenmaier
-**
-**  entity.h:  entities represent all program known objects.
-**
-**  An entity is the representation of program known objects in Firm.
-**  The primary concept of entities is to represent members of complex
-**  types, i.e., fields and methods of classes.  As not all programming
-**  language model all variables and methods as members of some class,
-**  the concept of entities is extended to cover also local and global
-**  variables, and arbitrary procedures.
-**
-**  An entity always specifies the type of the object it represents and
-**  the type of the object it is a part of, the owner of the entity.
-**  Originally this is the type of the class of which the entity is a
-**  member.
-**  The owner of local variables is the procedure they are defined in.
-**  The owner of global variables and procedures visible in the whole
-**  program is a universally defined class type "GlobalType".  The owner
-**  of procedures defined in the scope of an other procedure is the
-**  enclosing procedure.
-**
-**  In detail the datastructure entity has the following fields:
-**
-**  ident *name     Name of this entity as specified in the source code.
-**                  Only unequivocal in conjuction with scope.
-**  ident *ld_name  Unique name of this entity, i.e., the mangled
-**                  name.  E.g., for a class `A' with field `a' this
-**                  is the ident for `A_a'.
-**  type *type      The type of this entity, e.g., a method type, a
-**                  basic type of the language or a class itself.
-**  type *owner;    The class this entity belongs to.  In case of local
-**                 variables the method they are defined in.
-**  int offset;     Offset in byte for this entity.  Fixed when layout
-**                 of owner is determined.
-**  ir_graph *irg;  If (type == method_type) this is the corresponding irg.
-**                 The ir_graph constructor automatically sets this field.
-**                  If (type != method_type) access of this field will cause
-**                  an assertion.
+*  Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
+*  All rights reserved.
+*
+*  Authors: Martin Trapp, Christian Schaefer,
+*           Goetz Lindenmaier
+*
+*  entity.h:  entities represent all program known objects.
+*
+*  An entity is the representation of program known objects in Firm.
+*  The primary concept of entities is to represent members of complex
+*  types, i.e., fields and methods of classes.  As not all programming
+*  language model all variables and methods as members of some class,
+*  the concept of entities is extended to cover also local and global
+*  variables, and arbitrary procedures.
+*
+*  An entity always specifies the type of the object it represents and
+*  the type of the object it is a part of, the owner of the entity.
+*  Originally this is the type of the class of which the entity is a
+*  member.
+*  The owner of local variables is the procedure they are defined in.
+*  The owner of global variables and procedures visible in the whole
+*  program is a universally defined class type "GlobalType".  The owner
+*  of procedures defined in the scope of an other procedure is the
+*  enclosing procedure.
+*
+*  In detail the datastructure entity has the following fields:
+*
+*  ident *name     Name of this entity as specified in the source code.
+*                  Only unequivocal in conjuction with scope.
+*  ident *ld_name  Unique name of this entity, i.e., the mangled
+*                  name.  E.g., for a class `A' with field `a' this
+*                  is the ident for `A_a'.
+*  type *type      The type of this entity, e.g., a method type, a
+*                  basic type of the language or a class itself.
+*  type *owner;    The class this entity belongs to.  In case of local
+*          variables the method they are defined in.
+*  int offset;     Offset in byte for this entity.  Fixed when layout
+*          of owner is determined.
+*  ir_graph *irg;  If (type == method_type) this is the corresponding irg.
+*          The ir_graph constructor automatically sets this field.
+*                  If (type != method_type) access of this field will cause
+*                  an assertion.
 */
 
 /* $Id$ */
@@ -50,6 +50,7 @@
 
 # include "ident.h"
 # include "type.h"
+# include "dbginfo.h"
 
 /*******************************************************************/
 /** general                                                       **/
@@ -62,59 +63,54 @@ void init_entity (void);
 /** ENTITY                                                        **/
 /*******************************************************************/
 
+/* to resolve recursion between entity.h and irgraph.h */
 #ifndef _IR_GRAPH_TYPEDEF_
 #define _IR_GRAPH_TYPEDEF_
-/* to resolve recursion between entity.h and irgraph.h */
 typedef struct ir_graph ir_graph;
 #endif
 
-/****s* entity/entity
+/**
  *
- * NAME
- *   entity - An abstract data type to represent program entites.
- * NOTE
+ *   An abstract data type to represent program entites.
  *
- * ATTRIBUTES
- *   owner      A compound type this entity is a part of.
- *   type       The type of this entity.
- *   name       The string that represents this entity in the source program.
- *   allocation A flag saying whether the entity is dynamically or statically
+ *   @param owner      A compound type this entity is a part of.
+ *   @param type       The type of this entity.
+ *   @param name       The string that represents this entity in the source program.
+ *   @param allocation A flag saying whether the entity is dynamically or statically
  *              allocated (values: dynamic_allocated,  static_allocated,
  *              automatic_allocated).
- *   visibility A flag indicating the visibility of this entity (values: local,
+ *   @param visibility A flag indicating the visibility of this entity (values: local,
  *              external_visible,  external_allocated)
- *   variability A flag indicating the variability of this entity (values:
+ *   @param variability A flag indicating the variability of this entity (values:
  *              uninitialized, initalized, part_constant, constant)
- *   volatility @@@
- *   offset     The offset of the entity within the compound object.  Only set
+ *   @param volatility @@@
+ *   @param offset     The offset of the entity within the compound object.  Only set
  *              if the owner in the state "layout_fixed".
- *   overwrites A list of entities overwritten by this entity.  This list is only
+ *   @param overwrites A list of entities overwritten by this entity.  This list is only
  *              existent if the owner of this entity is a class.  The members in
  *              this list must be entities of super classes.
- *   overwrittenby A list of entities that overwrite this entity.  This list is only
+ *   @param overwrittenby A list of entities that overwrite this entity.  This list is only
  *              existent if the owner of this entity is a class.  The members in
  *              this list must be entities of sub classes.
- *   link       A void* to associate some additional information with the entity.
- *   irg        If the entity is a method this is the ir graph that represents the
+ *   @param link       A void* to associate some additional information with the entity.
+ *   @param irg        If the entity is a method this is the ir graph that represents the
  *              code of the method.
- *   peculiarity The peculiarity of the entity.  If the entity is a method this
+ *   @param peculiarity The peculiarity of the entity.  If the entity is a method this
  *              indicates whether the entity represents
  *              a real method or whether it only exists to describe an interface.
  *              In that case there nowhere exists code for this entity and this entity
  *              is never dynamically used in the code.
  *              Values: description, existent.  Default: existent.
- *   visited    visited flag.  Master flag is entity_visited.
+ *   @param visited   visited flag.  Master flag is type_visited.
  *
- *  These fields can only be accessed via access functions.
+ *  @param These fields can only be accessed via access functions.
  *
- * SEE ALSO
- *   type
- * SOURCE
+ * @see  type
  */
 
+/* to resolve recursion between entity.h and type.h */
 #ifndef _ENTITY_TYPEDEF_
 #define _ENTITY_TYPEDEF_
-/* to resolve recursion between entity.h and type.h */
 typedef struct entity entity;
 #endif
 
@@ -125,10 +121,12 @@ typedef struct entity entity;
    is type_method, then it is static_allocated and constant.  The constant
    value is a pointer to the method.
    Visibility is local, offset -1, and it is not volatile. */
-entity     *new_entity (type *owner, ident *name, type *type);
+entity     *new_entity (type *owner, ident *name, type *tp);
+entity     *new_d_entity (type *owner, ident *name, type *tp, dbg_info *db);
 /* Copies the entity if the new_owner is different from the
    owner of the old entity.  Else returns the old entity.
-   Automatically inserts the new entity as a member of owner. */
+   Automatically inserts the new entity as a member of owner.
+   Resets the overwrites/overwritten_by fields. */
 entity     *copy_entity_own (entity *old, type *new_owner);
 /* Copies the entity if the new_name is different from the
    name of the old entity.  Else returns the old entity.
@@ -151,20 +149,25 @@ void        set_entity_ld_ident (entity *ent, ident *ld_ident);
 const char *get_entity_ld_name (entity *end);
 
 type       *get_entity_owner (entity *ent);
-/* Sets the owner field in entity to owner. */
+/* Sets the owner field in entity to owner.  Don't forget to add
+   ent to owner!! */
 void        set_entity_owner (entity *ent, type *owner);
 INLINE void assert_legal_owner_of_ent(type *owner);
 
 type     *get_entity_type (entity *ent);
-void      set_entity_type (entity *ent, type *type);
+void      set_entity_type (entity *ent, type *tp);
 
 typedef enum {
-  automatic_allocated,/* The entity is allocated during runtime, implicitly
-                        as component of a compound type.   This is the default. */
-  dynamic_allocated,  /* The entity is allocated during runtime, explicitly
-                        by an Alloc node. */
-  static_allocated    /* The entity is allocated statically.  We can use a
-                         SymConst(?) as address of the entity. */
+  automatic_allocated, /* The entity is allocated during runtime, implicitly
+                         as component of a compound type.   This is the default. */
+  parameter_allocated, /* The entity is a parameter.  It is also automatic allocated.
+                         We distinguish the allocation of paramters from the allocation
+                         of local variables as their placement depends on the calling
+                         conventions. */
+  dynamic_allocated,   /* The entity is allocated during runtime, explicitly
+                         by an Alloc node. */
+  static_allocated     /* The entity is allocated statically.  We can use a
+                          SymConst(?) as address of the entity. */
 } ent_allocation;
 
 ent_allocation get_entity_allocation (entity *ent);
@@ -189,7 +192,7 @@ void           set_entity_visibility (entity *ent, ent_visibility vis);
 /* This enumeration flags the variability of entities. */
 typedef enum {
   uninitialized,    /* The content of the entity is completely unknown. */
-  initialized,       /* After allocation the entity is initalized with the
+  initialized,      /* After allocation the entity is initalized with the
                       value given somewhere in the entity. */
   part_constant,    /* For entities of compound types.  Some members of the entity
                       are constant.  The others are uninitialized.  Those members
@@ -200,10 +203,10 @@ typedef enum {
 ent_variability get_entity_variability (entity *ent);
 void            set_entity_variability (entity *ent, ent_variability var);
 
-/* This enumeration flags the volatility of entities. */
+/** This enumeration flags the volatility of entities. */
 typedef enum {
-  non_volatile,    /* The entity is not volatile */
-  is_volatile      /* The entity is volatile */
+  non_volatile,    /**< The entity is not volatile */
+  is_volatile      /**< The entity is volatile */
 } ent_volatility;
 
 ent_volatility get_entity_volatility (entity *ent);
@@ -247,6 +250,7 @@ int      get_compound_ent_n_values(entity *ent);
 ir_node *get_compound_ent_value(entity *ent, int pos);
 entity  *get_compound_ent_value_member(entity *ent, int pos);
 void     set_compound_ent_value(entity *ent, ir_node *val, entity *member, int pos);
+void     remove_compound_ent_value(entity *ent, entity *value_ent);
 /* Inits the entity ent witch must be of a one dimensional
    array type with the values given in the values array.
    The array must have a lower and an upper bound.  Keeps the
@@ -267,13 +271,27 @@ void set_array_entity_values(entity *ent, tarval **values, int num_vals);
    both relations, they only differ in the order of arguments. */
 void    add_entity_overwrites   (entity *ent, entity *overwritten);
 int     get_entity_n_overwrites (entity *ent);
+int     get_entity_overwrites_index(entity *ent, entity *overwritten);
 entity *get_entity_overwrites   (entity *ent, int pos);
 void    set_entity_overwrites   (entity *ent, int pos, entity *overwritten);
+void    remove_entity_overwrites(entity *ent, entity *overwritten);
 
 void    add_entity_overwrittenby   (entity *ent, entity *overwrites);
 int     get_entity_n_overwrittenby (entity *ent);
+int     get_entity_overwrittenby_index(entity *ent, entity *overwrites);
 entity *get_entity_overwrittenby   (entity *ent, int pos);
 void    set_entity_overwrittenby   (entity *ent, int pos, entity *overwrites);
+void    remove_entity_overwrittenby(entity *ent, entity *overwrites);
+
+/**
+ *   Checks whether a pointer points to an entity.
+ *
+ *   @param thing     an arbitrary pointer
+ *
+ *   @return
+ *       true if the thing is an entity, else false
+ */
+int is_entity (void *thing);
 
 /* Returns true if the type of the entity is a primitive, pointer
    enumeration or method type. */
@@ -290,31 +308,14 @@ int is_compound_entity(entity *ent);
 bool equal_entity(entity *ent1, entity *ent2);
 
 
-unsigned long get_entity_visited(entity *entity);
-void        set_entity_visited(entity *entity, unsigned long num);
+unsigned long get_entity_visited(entity *ent);
+void        set_entity_visited(entity *ent, unsigned long num);
 /* Sets visited field in entity to entity_visited. */
-void        mark_entity_visited(entity *entity);
-
+void        mark_entity_visited(entity *ent);
+bool        entity_visited(entity *ent);
+bool        entity_not_visited(entity *ent);
 
-/*****/
 
 
-/****v* entity/visited
- *
- * NAME
- *   entity_visited -  visited flag to traverse the entity information
- * PURPOSE
- *   Increase this flag by one before traversing the entity information.
- *   Mark entity nodes as visited by set_entity_visited(entity, value) or
- *   mark_entity_visited.
- *   Check whether node was already visited by comparing get_entity_visited(entity)
- *   and entity_visited.
- *   Or use the function to walk all entities.
- * SEE ALSO
- * SOURCE
- */
-extern unsigned long entity_visited;
-/*****/
-
 
 # endif /* _ENTITY_H_ */