Symbol.hGo to the documentation of this file.00001
00002 #ifndef _SYMBOL_H
00003 #define _SYMBOL_H
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
00039
00040 #ifdef POLARIS_GNU_PRAGMAS
00041 #pragma interface
00042 #endif
00043
00044 #include "../ClassNames.h"
00045 #include "../String.h"
00046 #include "../ArrayBounds.h"
00047 #include "../ArrayDims.h"
00048 #include "../BinRep.h"
00049 #include "../RelinkableDef.h"
00050 #include "../Dictionary.h"
00051 #include "../Collection/List.h"
00052 #include "../p-assert.h"
00053 #include "../Type.h"
00054 #include "../VoidPtrDef.h"
00055
00056 class CommonBlock;
00057 class Equivalence;
00058 class Expression;
00059 class ExprTable;
00060 class Statement;
00061 class SharedDims;
00062 class VDL;
00063
00064
00065 enum SYMBOL_CLASS {
00066 UNDEFINED_CLASS = 0,
00067 PROGRAM_CLASS,
00068
00069 FUNCTION_CLASS,
00070 SUBROUTINE_CLASS,
00071 VARIABLE_CLASS,
00072 SYMBOLIC_CONSTANT_CLASS,
00073 BLOCK_DATA_CLASS,
00074 NAMELIST_CLASS
00075
00076
00077
00078
00079 };
00080
00081
00082 enum EXTERNAL_BOOL {
00083 IS_EXTERNAL = 1,
00084 NOT_EXTERNAL = 0
00085 };
00086
00087 enum INTRINSIC_BOOL {
00088 IS_INTRINSIC = 1,
00089 NOT_INTRINSIC = 0
00090 };
00091
00092 enum INITIAL_BOOL {
00093 IS_INITIALIZED = 1,
00094 NOT_INITIALIZED = 0
00095 };
00096
00097 enum FORMAL_BOOL {
00098 IS_FORMAL = 1,
00099 NOT_FORMAL = 0
00100 };
00101
00102 enum ALLOC_BOOL {
00103 IS_ALLOCATABLE = 1,
00104 NOT_ALLOCATABLE = 0
00105 };
00106
00107 enum SAVED_BOOL {
00108 IS_SAVED = 1,
00109 NOT_SAVED = 0
00110 };
00111
00112 enum GLOBAL_BOOL {
00113 IS_GLOBAL = 1,
00114 NOT_GLOBAL = 0
00115 };
00116
00117
00118 class Symbol : public RelinkableDef {
00119 friend ostream & operator << (ostream & o, const Symbol & other);
00120 friend class Symtab;
00121 friend class PostPass;
00122
00123 protected:
00124 SYMBOL_CLASS _sym_class;
00125 BinRep *_overflow;
00126 int _last_renaming_append;
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 void _ref_error(const char *func_name) const;
00139 int _get_size(const BinRep & insp,
00140 const BinRep & binstr_context) const;
00141 virtual void _dims(ArrayDims *);
00142 public:
00143 inline Symbol(const char *name, SYMBOL_CLASS cl);
00144
00145
00146
00147
00148
00149
00150
00151 virtual Symbol *clone() const = 0;
00152
00153
00154
00155 virtual Symbol *clone_all() const = 0;
00156
00157
00158
00159 Definition *definition_clone() const;
00160
00161
00162
00163 virtual ~Symbol();
00164
00165
00166 virtual void print(ostream & o) const = 0;
00167
00168
00169 inline SYMBOL_CLASS sym_class() const;
00170
00171
00172 inline const char *name_ref() const;
00173
00174
00175 inline void name(const char *new_name);
00176
00177
00178
00179 inline BinRep *overflow_ref() const;
00180
00181 virtual void fill_in(const BinRep & binstr,
00182 ExprTable & exprs,
00183 const Dictionary<VoidPtrDef>&stmts,
00184 const Dictionary<VoidPtrDef>&commons,
00185 const Dictionary<VoidPtrDef>&equivalences) = 0;
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 virtual INITIAL_BOOL initial_value() const;
00197 virtual void initial_value(INITIAL_BOOL ourbool);
00198
00199 virtual EXTERNAL_BOOL external() const;
00200 virtual void external(EXTERNAL_BOOL ourbool);
00201
00202 virtual INTRINSIC_BOOL intrinsic() const;
00203 virtual void intrinsic(INTRINSIC_BOOL ourbool);
00204
00205 virtual const Statement *entry_ref() const;
00206 virtual Statement *entry_ref() ;
00207 virtual void entry(Statement * s);
00208
00209 virtual const Type & type() const;
00210
00211
00212
00213 virtual void type(const Type & type);
00214
00215 virtual Equivalence *equivalence_ref() const;
00216 virtual void equivalence(Equivalence & e, int byte_base);
00217 virtual void clear_equivalence();
00218
00219 virtual void shared_expr(Expression *shared);
00220
00221
00222 virtual void set_to_private();
00223
00224 virtual Expression *shared_expr() const;
00225
00226
00227
00228
00229
00230 virtual const ArrayDims & dim() const;
00231 virtual ArrayDims & dim() ;
00232
00233 virtual const SharedDims & shared_dim() const;
00234 virtual SharedDims & shared_dim() ;
00235
00236 virtual FORMAL_BOOL formal() const;
00237 virtual void formal(FORMAL_BOOL ourbool);
00238
00239 virtual ALLOC_BOOL allocatable() const;
00240 virtual void allocatable(ALLOC_BOOL ourbool);
00241
00242 virtual GLOBAL_BOOL global() const;
00243 virtual void global(GLOBAL_BOOL ourbool);
00244
00245 virtual SAVED_BOOL saved() const;
00246 virtual void saved(SAVED_BOOL ourbool);
00247
00248 virtual const CommonBlock *common_ref() const;
00249 virtual CommonBlock *common_ref() ;
00250
00251 virtual void common(CommonBlock & cb, int index);
00252
00253
00254
00255 virtual void clear_common();
00256
00257
00258 virtual const Expression *expr_ref() const;
00259 virtual Expression *expr_ref() ;
00260 virtual void expr(Expression * e);
00261
00262 virtual int is_entry();
00263
00264 virtual int is_scalar() const;
00265
00266 virtual int is_array() const;
00267
00268 virtual int is_shared() const;
00269
00270 virtual int is_pointer() const;
00271
00272 virtual const Symbol & assoc_variable() const;
00273 virtual Symbol & assoc_variable() ;
00274
00275 virtual int size() const;
00276
00277
00278 virtual int structures_OK() const;
00279
00280
00281
00282
00283 virtual void exchange_convert( VDL &vdl );
00284
00285
00286 void renaming_suggestion(String & new_name);
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 };
00305
00306 Symbol *make_symbol(const char *name, const BinRep & binstr);
00307
00308 char *upcase_ch( const char *string );
00309
00310 inline
00311 Symbol::Symbol(const char *name, SYMBOL_CLASS cl)
00312 : RelinkableDef("")
00313 {
00314 #ifdef CLASS_INSTANCE_REGISTRY
00315 register_instance(SYMBOL, sizeof(Symbol), this);
00316 #endif
00317
00318 char *up_name = upcase_ch(name);
00319
00320 _sym_class = cl;
00321 _overflow = 0;
00322 _last_renaming_append = -1;
00323
00324 rename(up_name);
00325
00326 delete [] up_name;
00327 }
00328
00329 inline BinRep *
00330 Symbol::overflow_ref() const
00331 {
00332 return _overflow;
00333 }
00334
00335 inline SYMBOL_CLASS
00336 Symbol::sym_class() const
00337 {
00338 return _sym_class;
00339 }
00340
00341 inline const char *
00342 Symbol::name_ref() const
00343 {
00344 return (const char *)_tag;
00345 }
00346
00347 inline void
00348 Symbol::name(const char *new_name)
00349 {
00350 _tag = upcase_ch(new_name);
00351 }
00352
00353 inline int
00354 Symbol::is_pointer() const
00355 {
00356 return 0;
00357 }
00358
00359 #endif
00360
|