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 #define ALIGNS 5
00038 #define align_index(x) (al_off[x>>3])
00039 #define basic_index(x) (x)
00040 #define alignment_to_align(x) (al_off[x])
00041
00042
00043 static const INT16 al_off[17]= {0,
00044 0,
00045 1,
00046 0,
00047 2,
00048 0,0,0,
00049 3,
00050 0,0,0,0,0,0,0,
00051 4
00052 };
00053
00054 static const STRING alstr[ALIGNS-1]= {
00055 ".align1",
00056 ".align2",
00057 ".align4",
00058 ".align8",
00059 };
00060
00061 static const STRING logstr[ALIGNS-1]= { ".log.1",".log.2",".log.4",".log.8" } ;
00062
00063 static TY_IDX unaligned_type [MTYPE_LAST+1][ALIGNS];
00064 static TY_IDX basic_logical_ty[NUM_LOG_KINDS][ALIGNS];
00065
00066 static const TYPE_ID Mtypes[ALIGNS][Vector_Mask+1] = {
00067 {
00068 MTYPE_V,
00069 MTYPE_I1,
00070 MTYPE_U1,
00071 MTYPE_V,
00072 MTYPE_I1,
00073 MTYPE_I1,
00074 MTYPE_I1,
00075 MTYPE_I1,
00076 MTYPE_I1,
00077 MTYPE_F4,
00078 MTYPE_C4,
00079 MTYPE_I1,
00080 MTYPE_I1,
00081 MTYPE_I1,
00082 MTYPE_V
00083 },{
00084 MTYPE_V,
00085 MTYPE_I2,
00086 MTYPE_U2,
00087 MTYPE_V,
00088 MTYPE_I2,
00089 MTYPE_I2,
00090 MTYPE_I2,
00091 MTYPE_I2,
00092 MTYPE_I2,
00093 MTYPE_F4,
00094 MTYPE_C4,
00095 MTYPE_I2,
00096 MTYPE_I2,
00097 MTYPE_I2,
00098 MTYPE_V
00099
00100 },{
00101 MTYPE_V,
00102 MTYPE_I4,
00103 MTYPE_U4,
00104 MTYPE_V,
00105 MTYPE_I4,
00106 MTYPE_I4,
00107 MTYPE_I4,
00108 MTYPE_I4,
00109 MTYPE_I4,
00110 MTYPE_F4,
00111 MTYPE_C4,
00112 MTYPE_I4,
00113 MTYPE_I4,
00114 MTYPE_I4,
00115 MTYPE_V
00116 },{
00117 MTYPE_V,
00118 MTYPE_I8,
00119 MTYPE_U8,
00120 MTYPE_V,
00121 MTYPE_I8,
00122 MTYPE_I8,
00123 MTYPE_I8,
00124 MTYPE_I8,
00125 MTYPE_I8,
00126 MTYPE_F8,
00127 MTYPE_C8,
00128 MTYPE_I8,
00129 MTYPE_I8,
00130 MTYPE_I8,
00131 MTYPE_V
00132 },{
00133 MTYPE_V,
00134 MTYPE_I8,
00135 MTYPE_U8,
00136 MTYPE_V,
00137 MTYPE_I8,
00138 MTYPE_I8,
00139 MTYPE_I8,
00140 MTYPE_I8,
00141 MTYPE_I8,
00142 MTYPE_FQ,
00143 MTYPE_CQ,
00144 MTYPE_I8,
00145 MTYPE_I8,
00146 MTYPE_I8,
00147 MTYPE_V
00148 }} ;
00149
00150
00151
00152
00153 #define MAX_ALIGN 16
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 static ARB_HANDLE decl_bounds;
00168 static INT32 top_of_decl_bounds = ANULL ;
00169 static INT32 co_top_decl_bounds = ANULL ;
00170
00171 static TY_IDX ty_dim1 ;
00172 static INT64 last_bitsize;
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 static DISTRIBUTE_TYPE decl_distribution[MAX_ARY_DIMS];
00188 static union {
00189 WN *wn;
00190 INT val;
00191 } decl_cyclic_val[MAX_ARY_DIMS];
00192 static WN *decl_onto[MAX_ARY_DIMS];
00193 static WN_PRAGMA_ID decl_distributed_pragma_id;
00194 static BOOL distribute_onto;
00195 WN *decl_distribute_pragmas;
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 static const STRING dope_name [DOPE_NM] = {
00207 "base",
00208 "el_len",
00209 "assoc",
00210 "ptr_alloc",
00211 "p_or_a",
00212 "a_contig",
00213 "unused_1",
00214 "num_dims",
00215 "type_code",
00216 "orig_base",
00217 "orig_size",
00218 };
00219
00220 static const int dope_bofst[DOPE_NM] = {
00221 0,0,0,1,2,4,5,29,0,0,0
00222 };
00223
00224 static const int dope_bsize[DOPE_NM] = {
00225 0,0,1,1,2,1,56,3,64,0,0
00226 };
00227
00228 static TYPE_ID *dope_btype;
00229 static INT *dope_offset;
00230
00231
00232 static TYPE_ID dope_btype_64[DOPE_NM] = {
00233 MTYPE_U8,MTYPE_I8,MTYPE_U4,
00234 MTYPE_U4,MTYPE_U4,MTYPE_U4,
00235 MTYPE_U8,MTYPE_U4,
00236 MTYPE_U8,MTYPE_U8,
00237 MTYPE_I8
00238 };
00239
00240 static int dope_offset_64 [DOPE_NM] = {
00241 ADDR_OFFSET,8,16,16,16,16,16,20,24,32,40
00242 };
00243
00244
00245 static TYPE_ID dope_btype_32[DOPE_NM] = {
00246 MTYPE_U4,MTYPE_I4,MTYPE_U4,
00247 MTYPE_U4,MTYPE_U4,MTYPE_U4,
00248 MTYPE_U8,MTYPE_U4,
00249 MTYPE_U8,MTYPE_U4,
00250 MTYPE_I4
00251 };
00252
00253 static int dope_offset_32 [DOPE_NM] = {
00254 ADDR_OFFSET,4,8,8,8,8,8,12,16,24,28
00255 };
00256
00257 static const STRING bound_name [BOUND_NM] = {
00258 "lb",
00259 "ext",
00260 "str_m",
00261 } ;
00262
00263
00264
00265
00266
00267
00268
00269
00270 static const char * const dope_str = ".dope." ;
00271 static const char * const dope_invariant_str = ".flds." ;
00272 #define DOPENM_LEN 6
00273
00274
00275
00276
00277
00278
00279 #define IS_SHARED_DOPE_BASE(ty) (TY_kind(ty) == KIND_SCALAR && !TY_is_character(ty))
00280 #define NUM_LOGICAL_DOPE_TYPES 4
00281 #define NUM_DOPE_TYPES MTYPE_LAST + 1 + NUM_LOGICAL_DOPE_TYPES
00282 #define LOGICAL_OFFSET(bt) (MTYPE_LAST + (bt - MTYPE_I1 + 1))
00283
00284
00285
00286
00287
00288
00289
00290 TY_IDX DOPE_bound_ty;
00291 INT32 DOPE_bound_sz;
00292 INT32 DOPE_dim_offset;
00293 INT32 DOPE_sz;
00294
00295
00296
00297
00298
00299 TY_IDX logical4_ty;
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 typedef struct {
00311 TY_IDX dty ;
00312 FLD_IDX dty_last ;
00313 INT32 ncompos ;
00314 BOOL seq ;
00315 BOOL hosted ;
00316 } dtype_t ;
00317
00318 static INT32 dtype_stk_size = 0;
00319 static dtype_t *dtype_stk=NULL;
00320 static INT32 dtype_top = -1 ;
00321
00322 #define STK_SIZE_CHANGE 100;
00323
00324
00325
00326
00327
00328
00329 #define NL_Name_Length 36
00330
00331
00332 #define MTYPE_MemorySize(x) (MTYPE_size_min(x) >> 3)
00333
00334
00335
00336
00337
00338
00339
00340
00341 #define ALIGN_Dims 0
00342 #define OFFSET_Dims_ndims 1
00343 #define OFFSET_Dims_nels 2
00344 #define OFFSET_Dims_baseoff 3
00345 #define OFFSET_Dims_span 4
00346 #define ALIGN_Nlentry 5
00347 #define OFFSET_Nlentry_varname 6
00348 #define OFFSET_Nlentry_varaddr 7
00349 #define OFFSET_Nlentry_type 8
00350 #define OFFSET_Nlentry_dimp 9
00351 #define SIZE_Nlentry 10
00352 #define ALIGN_Namelist 11
00353 #define OFFSET_Namelist_nlname 12
00354 #define OFFSET_Namelist_nlvnames 13
00355
00356 static INT NL_Table_Index;
00357
00358 static WN_OFFSET NL_Tables[][2] = {
00359 4, 8,
00360 0, 0,
00361 4, 8,
00362 8, 16,
00363 12, 24,
00364 4, 8,
00365 0, 0,
00366 36, 40,
00367 40, 48,
00368 44, 56,
00369 48, 64,
00370 4, 8,
00371 0, 0,
00372 36, 40
00373 };
00374
00375
00376 #define GET_HOST_SYMTAB ((SYMTAB_level(Current_Symtab) == 1) ? Current_Symtab : SYMTAB_parent(Current_Symtab))
00377
00378
00379
00380
00381 static TY_IDX Last_TY_Created = 0 ;
00382
00383
00384
00385
00386 static BOOL in_hosted_dtype = FALSE ;
00387
00388
00389
00390
00391
00392 static FLD_HANDLE cwh_types_fld_util(char* name_string, TY_IDX fld_ty, OFFSET_64 offset, BOOL global) ;
00393 static void cwh_types_fill_type(INT32 flag_bits, TYPE *t, TY_IDX ty) ;
00394 static TY_IDX cwh_types_dim_struct_TY(void);
00395 static TY_IDX cwh_types_dim_TY(INT32 num_dims) ;
00396 static void cwh_types_push_dtype(dtype_t d) ;
00397 static dtype_t cwh_types_pop_dtype(void) ;
00398 static ST * cwh_types_formal_util(TY_IDX ty) ;
00399 static BOOL cwh_types_in_dtype(void) ;
00400 static TY_IDX cwh_types_mk_namelist_item_TY(void) ;
00401 static TY_IDX cwh_types_mk_unique_pointer_TY(TY_IDX ty, BOOL host) ;
00402 static TY_IDX cwh_types_mk_misaligned_TY(TY_IDX ty, mUINT16 alignment) ;
00403
00404 static TY_IDX cwh_types_mk_array_TY(ARB_HANDLE bounds,INT16 n,TY_IDX base, INT64 size);
00405 static TY_IDX cwh_types_mk_basic_TY (BASIC_TYPE, INTPTR size, mUINT16 alignment) ;
00406 static TY_IDX cwh_types_mk_struct(INT64 size, INT32 align, FLD_HANDLE list,char *name) ;
00407 static TY_IDX cwh_types_shared_dope(FLD_HANDLE list,int ndims, BOOL is_ptr);
00408 static TY_IDX cwh_types_mk_dope_invariant_TY(void);
00409 static TY_IDX cwh_types_new_TY(BOOL global,INT32 align) ;
00410 static ST * cwh_types_make_bounds_ST(void) ;