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
00039
00040
00041
00042
00043
00044
00045
00046 #pragma ident "@(#) libf/fort/allocation.c 92.6 10/29/99 21:39:27"
00047
00048 #include <fortran.h>
00049 #include <stddef.h>
00050 #include <string.h>
00051 #include <liberrno.h>
00052 #include <cray/dopevec.h>
00053 #include <cray/portdefs.h>
00054
00055 #ifdef _LITTLE_ENDIAN
00056 #include <stdlib.h>
00057 #endif
00058 #include "defalias.h"
00059 #ifdef KEY
00060 # ifdef _DEBUG
00061 # include <stdio.h>
00062 # endif
00063 #endif
00064
00065 extern long _zero_entity;
00066
00067 #define NaN32 0xffa5a5a5
00068 #define NaN64 0xffa5a5a5fff5a5a5ll
00069
00070 static short ps_debug_alloc = -1;
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 #if defined(__mips)
00082
00083 extern void *_sma_fortran_allocate_global(size_t sz, int lstat);
00084 #pragma weak _sma_fortran_allocate_global
00085 extern void _sma_fortran_deallocate_global(void *p);
00086 #pragma weak _sma_fortran_deallocate_global
00087 #endif
00088
00089 #ifndef ALLOC_VERSION
00090 #define ALLOC_VERSION 1
00091 #endif
00092
00093 typedef struct AllocHead {
00094 unsigned int version :8;
00095 #ifdef _UNICOS
00096 unsigned int :32;
00097 #elif defined(__mips) || defined(_LITTLE_ENDIAN)
00098 unsigned int :24;
00099 unsigned int :8;
00100 #endif
00101 unsigned int :7;
00102 unsigned int imalloc :1;
00103 unsigned int icount :16;
00104
00105 DopeVectorType *dv[1];
00106 } AllocHeadType;
00107
00108 short get_debug_alloc_state()
00109 {
00110 char * debugenv;
00111
00112 debugenv = getenv ("OPEN64_FDEBUG_ALLOC");
00113 if (!debugenv) {
00114 return 0;
00115 }
00116 else if (strcasecmp (debugenv, "ZERO") == 0) {
00117 return 1;
00118 }
00119 else if (strcasecmp (debugenv, "NaN") == 0) {
00120 return 2;
00121 }
00122 else if (strcasecmp (debugenv, "NaN4") == 0) {
00123 return 2;
00124 }
00125 else if (strcasecmp (debugenv, "NaN32") == 0) {
00126 return 2;
00127 }
00128 else if (strcasecmp (debugenv, "NaN8") == 0) {
00129 return 3;
00130 }
00131 else if (strcasecmp (debugenv, "NaN64") == 0) {
00132 return 3;
00133 }
00134
00135 return 0;
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 void
00159 _ALLOCATE(AllocHeadType *aloclist,
00160 _f_int *statvar)
00161 {
00162 int loopcount = 0;
00163 int lstat = 0;
00164 int errflag = 0;
00165 DopeVectorType *dva;
00166 int i, j;
00167 int iarray=0;
00168 int bytalign=0;
00169 long nbytes;
00170 long fcdleng = 0;
00171 ptrdiff_t *base;
00172 int imalocflg = 0;
00173
00174
00175 if (ps_debug_alloc == -1) {
00176 ps_debug_alloc = get_debug_alloc_state();
00177 }
00178
00179
00180 loopcount = aloclist->icount;
00181 imalocflg = aloclist->imalloc;
00182
00183
00184 if(statvar != NULL)
00185 lstat = 1;
00186
00187
00188 while(loopcount--) {
00189 dva = aloclist->dv[iarray];
00190 switch(dva->p_or_a) {
00191 case POINTTR:
00192 {
00193
00194 dva->ptr_alloc = 1;
00195 break;
00196 }
00197
00198 case ALLOC_ARRY:
00199 {
00200
00201 if(dva->assoc) {
00202 if(lstat) {
00203 *statvar = FEALALLO;
00204 return;
00205 }
00206 _lerror (_LELVL_ABORT, FEALALLO);
00207 }
00208 break;
00209 }
00210 }
00211
00212
00213 if (dva->type_lens.type == DVTYPE_ASCII) {
00214 bytalign = 1;
00215 #if defined(_ADDR64) || defined(_WORD32) || defined(__mips) || \
00216 defined(_LITTLE_ENDIAN)
00217 nbytes = _fcdlen (dva->base_addr.charptr);
00218 #else
00219
00220
00221
00222
00223
00224 nbytes = dva->base_addr.a.el_len >> 3;
00225 #endif
00226
00227 fcdleng = nbytes;
00228 } else if (dva->type_lens.type == DVTYPE_DERIVEDWORD ||
00229 dva->type_lens.type == DVTYPE_DERIVEDBYTE) {
00230
00231
00232
00233
00234 nbytes = dva->base_addr.a.el_len >> 3;
00235 } else
00236
00237
00238
00239 nbytes = dva->type_lens.int_len >> 3;
00240
00241
00242 base = (void *) &_zero_entity;
00243
00244
00245 for (i = 0; i < dva->n_dim; i++)
00246 nbytes *= dva->dimension[i].extent;
00247
00248
00249
00250 if (nbytes != 0) {
00251 #if defined(_CRAYT3E)
00252
00253 if (imalocflg != 0 ) {
00254 base = (void *) _shmalloc (nbytes);
00255 } else
00256 #endif
00257 base = (void *) malloc (nbytes);
00258
00259 if (base == NULL) {
00260 if(lstat) {
00261 *statvar = FENOMEMY;
00262 return;
00263 }
00264 _lerror (_LELVL_ABORT, FENOMEMY);
00265 }
00266
00267
00268 if (ps_debug_alloc > 0) {
00269 if (ps_debug_alloc == 1) {
00270 memset (base, 0, nbytes);
00271 }
00272 else if (ps_debug_alloc == 2) {
00273 unsigned * surrogate = (unsigned *) &(base[0]);
00274 if (nbytes % sizeof (unsigned) == 0) {
00275 for (i = 0, j = 0; j < nbytes; i ++, j += sizeof (unsigned)) {
00276 surrogate[i] = NaN32;
00277 }
00278 }
00279 }
00280 else if (ps_debug_alloc == 3) {
00281 uint64 * surrogate = (uint64 *) &(base[0]);
00282 if (nbytes % sizeof (uint64) == 0) {
00283 for (i = 0, j = 0; j < nbytes; i ++, j += sizeof (uint64)) {
00284 surrogate[i] = NaN64;
00285 }
00286 }
00287 }
00288 }
00289 }
00290 #ifdef KEY
00291 # ifdef _DEBUG
00292 if (ps_debug_alloc > 0) {
00293 fprintf(stderr, "allocation.c malloc: %p\n",
00294 (void *) base);
00295 }
00296 # endif
00297 #endif
00298
00299
00300
00301
00302 if (bytalign)
00303 dva->base_addr.charptr =
00304 _cptofcd( (char *) base, fcdleng);
00305 else
00306 dva->base_addr.a.ptr = base;
00307
00308
00309
00310 dva->assoc = 1;
00311
00312
00313 dva->orig_base = dva->base_addr.a.ptr;
00314
00315
00316 dva->orig_size = nbytes << 3;
00317
00318 iarray++;
00319 }
00320
00321 if(lstat)
00322 *statvar = errflag;
00323 }
00324
00325 #ifdef KEY
00326 extern void _DEALLOC(AllocHeadType *);
00327
00328
00329
00330
00331
00332
00333
00334
00335 #define DOPE_ALLOC_INFO(dva) ((DopeAllocType *) (dva->dimension + dva->n_dim))
00336
00337
00338
00339
00340
00341 #define DOPE_VECTOR_SIZE(dva) \
00342 ((sizeof *dva) - (sizeof dva->dimension) + \
00343 (dva->n_dim * sizeof(struct DvDimen)) + \
00344 (dva->alloc_cpnt ? \
00345 (sizeof(DopeAllocType) + \
00346 alloc_info->n_alloc_cpnt * sizeof(unsigned long)) : \
00347 0))
00348
00349
00350
00351
00352
00353 static unsigned long
00354 count_elements(DopeVectorType *dva) {
00355 unsigned long n_elements = 1;
00356 int d = 0;
00357 for (; d < dva->n_dim; d += 1) {
00358 n_elements *= (unsigned long)
00359 (dva->dimension[d].extent - dva->dimension[d].low_bound + 1);
00360 }
00361 return n_elements;
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377 static void
00378 recursive_dealloc(DopeVectorType *dva, int version, int imalloc) {
00379
00380 # define BITSTOBYTES(x) ((x) >> 3)
00381 DopeAllocType *alloc_info = DOPE_ALLOC_INFO(dva);
00382 unsigned long n_allocatable_cpnt = alloc_info->n_alloc_cpnt;
00383
00384 AllocHeadType *alist = alloca((sizeof *alist) +
00385 (sizeof alist->dv) * (n_allocatable_cpnt - 1));
00386 memset(alist, 0, sizeof *alist);
00387 alist->version = version;
00388 alist->imalloc = imalloc;
00389
00390 int n_elements = count_elements(dva);
00391 char *element = (char *) dva->base_addr.a.ptr;
00392 int bytes_per_element = BITSTOBYTES(dva->base_addr.a.el_len);
00393 int e = 0;
00394 for (; e < n_elements; e += 1) {
00395 int i = 0;
00396 alist->icount = 0;
00397 for (; i < n_allocatable_cpnt; i += 1) {
00398 DopeVectorType *d = (DopeVectorType *)
00399 (element + (BITSTOBYTES(alloc_info->alloc_cpnt_offset[i])));
00400 if (d->assoc) {
00401 alist->dv[alist->icount++] = d;
00402 }
00403 }
00404 _DEALLOC(alist);
00405 element += bytes_per_element;
00406 }
00407 }
00408
00409
00410
00411
00412
00413
00414
00415
00416 void
00417 _ASSIGN_ALLOCATABLE(DopeVectorType *dest, DopeVectorType *src, int version,
00418 int imalloc) {
00419
00420 #ifdef _DEBUG
00421
00422 if (ps_debug_alloc == -1) {
00423 ps_debug_alloc = get_debug_alloc_state();
00424 }
00425 #endif
00426
00427
00428
00429 unsigned int src_nelements = count_elements(src);
00430
00431
00432 AllocHeadType list;
00433 list.version = version;
00434 list.imalloc = imalloc;
00435 list.icount = 1;
00436 list.dv[0] = dest;
00437 _DEALLOC(&list);
00438
00439
00440
00441 DopeAllocType *alloc_info = DOPE_ALLOC_INFO(src);
00442 int save_alloc_cpnt = dest->alloc_cpnt;
00443 memcpy(dest, src, DOPE_VECTOR_SIZE(src));
00444
00445 if (src->p_or_a != ALLOC_ARRY) {
00446 dest->assoc = 1;
00447 dest->ptr_alloc = 0;
00448 dest->p_or_a = ALLOC_ARRY;
00449 dest->a_contig = 1;
00450 dest->alloc_cpnt = save_alloc_cpnt;
00451 }
00452
00453 int el_len_bytes = (src->type_lens.type == DVTYPE_ASCII) ?
00454 src->base_addr.a.el_len :
00455 (src->base_addr.a.el_len / 8);
00456 size_t nbytes = el_len_bytes * src_nelements;
00457
00458
00459 if (src->assoc) {
00460
00461 dest->base_addr.a.ptr = malloc(nbytes);
00462 if (dest->base_addr.a.ptr == NULL) {
00463 _lerror (_LELVL_ABORT, FENOMEMY);
00464 }
00465 #ifdef KEY
00466 # ifdef _DEBUG
00467 if (ps_debug_alloc > 0) {
00468 fprintf(stderr, "allocation.c malloc: %p\n",
00469 (void *) dest->base_addr.a.ptr);
00470 }
00471 # endif
00472 #endif
00473
00474
00475 if (src->a_contig) {
00476 memcpy(dest->base_addr.a.ptr, src->base_addr.a.ptr, nbytes);
00477 }
00478 else {
00479 _Copyin(dest->base_addr.a.ptr, src);
00480 }
00481
00482
00483
00484 if (src->alloc_cpnt) {
00485 unsigned int n_alloc_cpnt = alloc_info->n_alloc_cpnt;
00486 char *src_element = src->base_addr.a.ptr;
00487 char *dest_element = dest->base_addr.a.ptr;
00488 int e = 0;
00489 for (; e < src_nelements; e += 1) {
00490 int i = 0;
00491 for (; i < n_alloc_cpnt; i += 1) {
00492 unsigned int alloc_cpnt_offset =
00493 BITSTOBYTES(alloc_info->alloc_cpnt_offset[i]);
00494 DopeVectorType *src_cpnt =
00495 (DopeVectorType *) (src_element + alloc_cpnt_offset);
00496 DopeVectorType *dest_cpnt =
00497 (DopeVectorType *) (dest_element + alloc_cpnt_offset);
00498
00499 dest_cpnt->base_addr.a.ptr = 0;
00500 dest_cpnt->assoc = 0;
00501 _ASSIGN_ALLOCATABLE(dest_cpnt, src_cpnt, version, imalloc);
00502 }
00503 src_element += el_len_bytes;
00504 dest_element += el_len_bytes;
00505 }
00506 }
00507 }
00508
00509 else {
00510 dest->base_addr.a.ptr = 0;
00511 }
00512
00513 }
00514 #endif
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536 void
00537 _DEALLOCATE(AllocHeadType *aloclist,
00538 _f_int *statvar)
00539 {
00540 int bytalign = 0;
00541 int errflag = 0;
00542 int i;
00543 int iarray = 0;
00544 int imalocflg = 0;
00545 int loopcount = 0;
00546 int lstat = 0;
00547 long fcdleng = 0;
00548 long nsize;
00549 DopeVectorType *dva;
00550 ptrdiff_t *base;
00551
00552
00553 loopcount = aloclist->icount;
00554 imalocflg = aloclist->imalloc;
00555
00556
00557 if(statvar != NULL)
00558 lstat = 1;
00559
00560
00561 while(loopcount--) {
00562 dva = aloclist->dv[iarray];
00563
00564
00565
00566
00567
00568
00569 if (((dva->p_or_a == POINTTR) && (!dva->ptr_alloc)) ||
00570 ((dva->p_or_a == POINTTR) && (dva->ptr_alloc) &&
00571 (!dva->assoc)) ||
00572 ((dva->p_or_a == ALLOC_ARRY) && (!dva->assoc))) {
00573
00574 if(lstat) {
00575 *statvar = FENODEAL;
00576 return;
00577 }
00578 _lerror (_LELVL_ABORT, FENODEAL);
00579 }
00580
00581
00582
00583 if (dva->type_lens.type == DVTYPE_ASCII) {
00584
00585
00586 bytalign = 1;
00587 base = (void *) _fcdtocp (dva->base_addr.charptr);
00588 fcdleng = _fcdlen(dva->base_addr.charptr);
00589 nsize = fcdleng << 3;
00590
00591 } else if (dva->type_lens.type == DVTYPE_DERIVEDWORD ||
00592 dva->type_lens.type == DVTYPE_DERIVEDBYTE) {
00593
00594
00595 nsize = dva->base_addr.a.el_len;
00596
00597
00598 base = (void*) dva->base_addr.a.ptr;
00599
00600 } else {
00601
00602 base = (void*) dva->base_addr.a.ptr;
00603 nsize = dva->type_lens.int_len;
00604 }
00605
00606
00607 for (i = 0; i < dva->n_dim; i++)
00608 nsize *= dva->dimension[i].extent;
00609
00610
00611 #ifdef KEY
00612
00613
00614
00615
00616
00617
00618 if (dva->orig_size && dva->orig_size != nsize ) {
00619 #else
00620 if (dva->orig_size != nsize ) {
00621 #endif
00622 if(lstat) {
00623 *statvar = FEDEASIZ;
00624 return;
00625 }
00626 _lerror (_LELVL_ABORT, FEDEASIZ, dva->orig_size, nsize);
00627 #ifdef KEY
00628 }
00629 #else
00630 }
00631 #endif
00632
00633 #ifdef KEY
00634 if (dva->alloc_cpnt) {
00635 recursive_dealloc(dva, aloclist->version, aloclist->imalloc);
00636 }
00637 # ifdef _DEBUG
00638 if (ps_debug_alloc > 0) {
00639 fprintf(stderr, "allocation.c free: %p\n", (void *) base);
00640 }
00641 # endif
00642 #endif
00643
00644
00645 if (nsize != 0)
00646 #if defined(_CRAYT3E)
00647 if (imalocflg != 0) {
00648
00649 _shfree (base);
00650 } else
00651 #endif
00652 #if !defined(__mips)
00653 free (base);
00654 #else
00655 {
00656
00657 if (!_sma_fortran_deallocate_global)
00658 free (base);
00659 else
00660 _sma_fortran_deallocate_global(base);
00661 }
00662 #endif
00663
00664
00665 dva->assoc = 0;
00666 dva->ptr_alloc = 0;
00667
00668 if (bytalign)
00669 dva->base_addr.charptr =
00670 _cptofcd( (void *) NULL, fcdleng);
00671 else
00672 dva->base_addr.a.ptr = (void *) NULL;
00673 dva->orig_base = dva->base_addr.a.ptr;
00674 dva->orig_size = 0;
00675
00676 iarray++;
00677 }
00678
00679
00680 if(lstat)
00681 *statvar = errflag;
00682 }
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697 void
00698 _DEALLOC(AllocHeadType *aloclist)
00699 {
00700 int loopcount = 0;
00701 int lstat = 0;
00702 DopeVectorType *dva;
00703 int iarray=0;
00704 long fcdleng = 0;
00705 int bytalign = 0;
00706 ptrdiff_t *base;
00707 int imalocflg = 0;
00708
00709
00710 loopcount = aloclist->icount;
00711 imalocflg = aloclist->imalloc;
00712
00713
00714 while(loopcount--) {
00715 dva = aloclist->dv[iarray];
00716
00717
00718 if (!dva->assoc)
00719 return;
00720
00721
00722 if (dva->type_lens.type == DVTYPE_ASCII ) {
00723 bytalign = 1;
00724 base = (void *) _fcdtocp (dva->base_addr.charptr);
00725 fcdleng = _fcdlen(dva->base_addr.charptr);
00726 } else
00727 base = (void*) dva->base_addr.a.ptr;
00728
00729 #ifdef KEY
00730 if (dva->alloc_cpnt) {
00731 recursive_dealloc(dva, aloclist->version, aloclist->imalloc);
00732 }
00733 # ifdef _DEBUG
00734 if (ps_debug_alloc > 0) {
00735 fprintf(stderr, "allocation.c free: %p\n", (void *) base);
00736 }
00737 # endif
00738 #endif
00739
00740
00741 if (dva->orig_size != 0) {
00742 #if defined(_CRAYMPP) && !defined (_CRAYT3E)
00743 if (_issddptr(base)) {
00744 extern void _shfree(void *);
00745 _shfree(_sdd_read_base((void *) base));
00746 } else
00747 #elif defined(_CRAYT3E)
00748 if (imalocflg != 0) {
00749
00750 _shfree (base);
00751 } else
00752 #endif
00753 free (base);
00754 }
00755
00756
00757 dva->assoc = 0;
00758 dva->ptr_alloc = 0;
00759
00760
00761 if (bytalign)
00762 dva->base_addr.charptr =
00763 _cptofcd( (void *) NULL, fcdleng);
00764 else
00765 dva->base_addr.a.ptr = (void *) NULL;
00766
00767 dva->orig_base = dva->base_addr.a.ptr;
00768 dva->orig_size = 0;
00769
00770 iarray++;
00771 }
00772 }
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792 void
00793 _REALLOC(DopeVectorType *array,
00794 #if (defined(__mips) && (_MIPS_SZLONG == 64)) || defined(_LITTLE_ENDIAN)
00795 _f_int8 *length)
00796 #else
00797 _f_int *length)
00798 #endif
00799 {
00800 long fcdleng = 0;
00801 int bytalign = 0;
00802 ptrdiff_t *base;
00803 long newlen;
00804 long bitlen;
00805 int debyteflag = 0;
00806 long oldlen;
00807 int i, j;
00808
00809 bitlen = *length;
00810 newlen = bitlen >> 3;
00811 oldlen = array->orig_size >> 3;
00812
00813
00814 if (ps_debug_alloc == -1) {
00815 ps_debug_alloc = get_debug_alloc_state();
00816 }
00817
00818
00819
00820 if (array->type_lens.type == DVTYPE_ASCII) {
00821 bytalign = 1;
00822 base = (void *) _fcdtocp (array->base_addr.charptr);
00823 fcdleng = _fcdlen(array->base_addr.charptr);
00824 } else if (array->type_lens.type == DVTYPE_DERIVEDWORD ||
00825 array->type_lens.type == DVTYPE_DERIVEDBYTE) {
00826 base = (void *) array->base_addr.a.ptr;
00827 debyteflag = 1;
00828 } else
00829 base = (void *) array->base_addr.a.ptr;
00830
00831
00832 if (base == (ptrdiff_t *) &_zero_entity)
00833 base = (ptrdiff_t *) NULL;
00834
00835
00836 base = (void *) realloc (base,newlen);
00837
00838 if (base == NULL && newlen != 0)
00839 _lerror (_LELVL_ABORT, FENOMEMY);
00840
00841 if (ps_debug_alloc > 0 && newlen > oldlen) {
00842 if (ps_debug_alloc == 1) {
00843 memset ((char *) base + oldlen, 0, newlen - oldlen);
00844 }
00845 else if (ps_debug_alloc == 2) {
00846 if ((newlen-oldlen) % sizeof (unsigned) == 0) {
00847 unsigned * surrogate = (unsigned *) &(base[0]) + (oldlen / sizeof (unsigned));
00848 for (i = 0, j = 0;
00849 j < newlen-oldlen;
00850 i ++, j += sizeof (unsigned)) {
00851 surrogate[i] = NaN32;
00852 }
00853 }
00854 }
00855 else if (ps_debug_alloc == 3) {
00856 if ((newlen-oldlen) % sizeof (uint64) == 0) {
00857 uint64 * surrogate = (uint64 *) &(base[0]) + (oldlen / sizeof (uint64));
00858 for (i = 0, j = 0;
00859 j < newlen - oldlen;
00860 i ++, j += sizeof (uint64)) {
00861 surrogate[i] = NaN64;
00862 }
00863 }
00864 }
00865 }
00866
00867 array->assoc = (newlen == 0) ? 0 : 1;
00868
00869
00870 if (bytalign)
00871 array->base_addr.charptr =
00872 _cptofcd( (char *) base, fcdleng);
00873 else
00874 array->base_addr.a.ptr = base;
00875
00876 array->orig_base = array->base_addr.a.ptr;
00877 array->orig_size = bitlen;
00878 if (debyteflag)
00879 array->base_addr.a.el_len = bitlen;
00880 }
00881
00882 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911 #define FLAG_POINTER(x) ((x&1)!=0)
00912 #define FLAG_TRAPUV(x) ((x&4)!=0)
00913
00914 void*
00915 _F90_ALLOCATE_B(long size,
00916 int assoc,
00917 int flags,
00918 int *statvar,
00919 void *oldval)
00920 {
00921 int lstat = 0;
00922 int errflag = 0;
00923 ptrdiff_t *base;
00924 char *p;
00925 size_t nbytes;
00926 long i, j;
00927
00928
00929 if (ps_debug_alloc == -1) {
00930 ps_debug_alloc = get_debug_alloc_state();
00931 }
00932
00933
00934 if(statvar != NULL)
00935 lstat = 1;
00936
00937 if (!FLAG_POINTER(flags)) {
00938 if(assoc) {
00939 if(lstat) {
00940 *statvar = FEALALLO;
00941
00942
00943 return(oldval);
00944 }
00945 _lerror (_LELVL_ABORT, FEALALLO);
00946 }
00947 }
00948
00949 #ifdef KEY // bug 8994: if size wraps around and become -ve under -m32, we want
00950
00951
00952 nbytes = size;
00953 #else
00954 nbytes = size > 0 ? size : 0;
00955 #endif
00956
00957
00958
00959
00960 base = (void *) &_zero_entity;
00961
00962
00963
00964
00965
00966 if (size != 0) {
00967
00968 #if defined(_LITTLE_ENDIAN)
00969 base = (void *) malloc (nbytes);
00970 #else
00971
00972 if (!_sma_fortran_allocate_global)
00973 base = (void *) malloc (nbytes);
00974 else
00975 base = (void *)
00976 _sma_fortran_allocate_global(nbytes,lstat);
00977 #endif
00978
00979
00980 if (base == NULL) {
00981 if(lstat) {
00982 *statvar = FENOMEMY;
00983 return(base);
00984 }
00985 _lerror (_LELVL_ABORT, FENOMEMY);
00986 }
00987
00988
00989
00990 if (ps_debug_alloc > 0) {
00991 if (ps_debug_alloc == 1) {
00992 memset (base, 0, nbytes);
00993 }
00994 else if (ps_debug_alloc == 2) {
00995 unsigned * surrogate = (unsigned *) &(base[0]);
00996 if (nbytes % sizeof (unsigned) == 0) {
00997 for (i = 0, j = 0; j < nbytes; i ++, j += sizeof (unsigned)) {
00998 surrogate[i] = NaN32;
00999 }
01000 }
01001 }
01002 else if (ps_debug_alloc == 3) {
01003 uint64 * surrogate = (uint64 *) &(base[0]);
01004 if (nbytes % sizeof (uint64) == 0) {
01005 for (i = 0, j = 0; j < nbytes; i ++, j += sizeof (uint64)) {
01006 surrogate[i] = NaN64;
01007 }
01008 }
01009 }
01010 }
01011 }
01012
01013 #ifdef KEY
01014 # ifdef _DEBUG
01015 if (ps_debug_alloc > 0) {
01016 fprintf(stderr, "allocation.c malloc: %p\n", (void *) base);
01017 }
01018 # endif
01019 #endif
01020
01021 if (FLAG_TRAPUV(flags)) {
01022
01023
01024
01025
01026 for (p = (void *) base, i = 0; i < nbytes; i += 4) {
01027 *p = 0xff; ++p;
01028 *p = 0xfa; ++p;
01029 *p = 0x5a; ++p;
01030 *p = 0x5a; ++p;
01031 }
01032
01033 }
01034
01035 return (base);
01036 }
01037
01038 #if defined(BUILD_OS_DARWIN)
01039
01040 void *
01041 _F90_ALLOCATE(long size, int assoc, int flags, int *statvar, void *oldval) {
01042 return _F90_ALLOCATE_B(size, assoc, flags, statvar, oldval);
01043 }
01044 #else
01045 defalias(_F90_ALLOCATE_B, _F90_ALLOCATE);
01046 #endif
01047
01048 #endif
01049 #ifdef _DEBUG
01050
01051
01052
01053
01054
01055 void
01056 print_dope_vector(DopeVectorType *dv, FILE *f)
01057 {
01058 static char *P_OR_A[] = { "NOT_P_OR_A", "POINTTR", "ALLOC_ARRY" };
01059 if (0 == f)
01060 {
01061 f = stderr;
01062 }
01063
01064 fprintf(f, "%p: DopeVectorType:\n", (void *) dv);
01065 fprintf(f, "+%u: ptr=%p\n",
01066 (unsigned int) (((char *) &dv->base_addr.a.ptr) - (char *) dv),
01067 dv->base_addr.a.ptr);
01068 fprintf(f, "+%u: el_len=%lu\n",
01069 (unsigned int) (((char *) &dv->base_addr.a.el_len) - (char *) dv),
01070 dv->base_addr.a.el_len);
01071 #ifdef KEY
01072 fprintf(f, "assoc, ptr_alloc, p_or_a, a_contig, alloc_cpnt=%d %d %s %d %d\n",
01073 dv->assoc, dv->ptr_alloc, P_OR_A[dv->p_or_a], dv->a_contig, dv->alloc_cpnt);
01074 #else
01075 fprintf(f, "assoc, ptr_alloc, p_or_a, a_contig=%d %d %s %d\n",
01076 dv->assoc, dv->ptr_alloc, P_OR_A[dv->p_or_a], dv->a_contig);
01077 #endif
01078 fprintf(f, "n_dim=%u\n", dv->n_dim);
01079 fprintf(f, "+%u: type_lens.type/dpflag/kind/int_len/dec_len=%d/%d/%d/%d/%d\n",
01080 (unsigned int) (((char *)&dv->type_lens) - (char *) dv),
01081 (int) dv->type_lens.type,
01082 (int) dv->type_lens.dpflag,
01083 (int) dv->type_lens.kind_or_star,
01084 (int) dv->type_lens.int_len,
01085 (int) dv->type_lens.dec_len);
01086 fprintf(f, "+%u: orig_base=%p\n",
01087 (unsigned int) (((char *)&dv->orig_base) - (char *) dv),
01088 dv->orig_base);
01089 fprintf(f, "+%u: orig_size=%lu\n",
01090 (unsigned int) (((char *)&dv->orig_size) - (char *) dv),
01091 dv->orig_size);
01092 int i;
01093 for (i = 0; i < dv->n_dim; i += 1)
01094 {
01095 struct DvDimen *dimen = &(dv->dimension[i]);
01096 fprintf(f, "+%u: low_bound, extent, stride_mult=%ld %ld %ld\n",
01097 (unsigned int) (((char*)dimen) - (char *)dv),
01098 dimen->low_bound, dimen->extent, dimen->stride_mult);
01099 }
01100 #ifdef KEY
01101 if (dv->alloc_cpnt) {
01102 DopeAllocType *alloc_info = DOPE_ALLOC_INFO(dv);
01103 unsigned long n_alloc_cpnt = alloc_info->n_alloc_cpnt;
01104 printf("+%u: n_alloc_cpnt=%lu\n",
01105 (unsigned int) (((char*)alloc_info) - (char *)dv), n_alloc_cpnt);
01106 for (i = 0; i < n_alloc_cpnt; i += 1)
01107 {
01108 printf("+%u: alloc_cpnt_offset=%lu\n",
01109 (unsigned int) (((char*)&(alloc_info->alloc_cpnt_offset[i])) -
01110 (char *)dv),
01111 alloc_info->alloc_cpnt_offset[i]);
01112 }
01113 }
01114 #endif
01115 }
01116 #endif