00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef CBZ_MEMORYMODEL_H
00039 #define CBZ_MEMORYMODEL_H
00040
00041 #include "pointeroptions.h"
00042 #include "location.h"
00043 #include "unification.h"
00044
00045 class memoryBlock;
00046
00047 class memoryModel
00048 {
00049 public:
00050
00051 typedef pair< Location *, declNode * > memorymodel_key;
00052
00053 typedef map< memorymodel_key , memoryBlock *> memorymodel_map;
00054 typedef memorymodel_map::iterator memorymodel_map_p;
00055 typedef memorymodel_map::const_iterator memorymodel_map_cp;
00056
00057 typedef map< procNode *, memorymodel_map > proc_memorymodel_map;
00058 typedef proc_memorymodel_map::iterator proc_memorymodel_map_p;
00059 typedef proc_memorymodel_map::const_iterator proc_memorymodel_map_cp;
00060
00061 typedef pair< stmtNode *, declNode * > ci_memorymodel_key;
00062
00063 typedef map< ci_memorymodel_key , memoryBlock *> ci_memorymodel_map;
00064 typedef ci_memorymodel_map::iterator ci_memorymodel_map_p;
00065 typedef ci_memorymodel_map::const_iterator ci_memorymodel_map_cp;
00066
00067
00068 typedef map< constNode *, memoryBlock *> string_constant_map;
00069 typedef string_constant_map::iterator string_constant_map_p;
00070
00071 private:
00072
00080 TREE proc_memorymodel_map _memory_blocks;
00081
00088 TREE ci_memorymodel_map _ci_memory_blocks;
00089
00095 string_constant_map _string_constants;
00096
00099 int Counter;
00100
00103 memoryBlock * Null;
00104
00110 memoryBlock * _string_constant;
00111
00113 UnificationBasedPtr *_unification_based;
00114
00116 map<declNode*,declNode*> _copy_decl;
00117
00118 public:
00119
00123 memoryModel();
00124
00130 ~memoryModel();
00131
00136 void clear();
00137
00140 int size();
00141
00144
00145
00148 memoryBlock * null() const { return Null; }
00149
00151
00152 inline UnificationBasedPtr *unification() const { return _unification_based; }
00153
00156 inline void unification(UnificationBasedPtr *u) { _unification_based=u; }
00157
00162 static bool is_in_non_unify_list(UnifyTypes & non_unify_types,
00163 UnifyType *obj);
00164
00165
00170 memoryBlock * lookup(Location * location, declNode * decl);
00171
00176 memoryBlock * lookup(stmtNode * location, declNode * decl);
00177
00184 memoryBlock * lookup_variable(Location * location,
00185 declNode * decl,
00186 procNode * local_to);
00187
00194 memoryBlock * lookup_heap_object(const string & name,
00195 stmtLocation * allocation_site,
00196 stmtNode * allocation_stmt,
00197 declNode * decl,
00198 bool synthetic_decl);
00199
00204 memoryBlock * lookup_string_constant(constNode * the_string);
00205
00216 memoryBlock * generate_su_field(const string & field_name,
00217 declNode * field_decl,
00218 memoryBlock * container);
00219
00225 void update_def_use_chains();
00226
00231 int counter() { Counter++; return Counter; }
00232
00235 void stats(ostream & out);
00236
00237 void print(ostream & o) const;
00238
00239 private:
00240
00257 memoryBlock * create_memory_object(Location * location,
00258 declNode * decl,
00259 bool synthetic_decl,
00260 memoryBlock * container,
00261 procNode * local_to,
00262 declNode * org_field_decl = 0,
00263 bool is_alloc = false,
00264 bool is_array_elt = false);
00265
00270 memoryBlock * create_memory_object(stmtNode * location,
00271 declNode * decl,
00272 bool synthetic_decl,
00273 memoryBlock * container,
00274 procNode * local_to,
00275 bool is_alloc = false);
00276
00294 void generate_array_elements_for(memoryBlock * array_object);
00295
00296
00301 void initialize_struct(memoryBlock * struct_object,
00302 sueNode * sue_type,
00303 expr_list & inits);
00304 };
00305
00306 #endif //