File: symacc.h

package info (click to toggle)
flang 20181226-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 181,072 kB
  • sloc: cpp: 1,182,685; ansic: 598,652; objc: 103,775; f90: 57,054; python: 15,041; fortran: 13,601; lisp: 10,416; perl: 2,460; asm: 2,148; sh: 1,544; awk: 995; cs: 565; xml: 403; lex: 295; makefile: 225; pascal: 130
file content (406 lines) | stat: -rw-r--r-- 11,599 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
/*
 * Copyright (c) 1994-2018, NVIDIA CORPORATION.  All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

#ifndef SYMACC_H_
#define SYMACC_H_

#include "scutil.h"
#include "gbldefs.h"
#include "global.h"
struct SYM;
#include "symtab.h"
#include "sharedefs.h"

/**
 * \file
 * \brief Various definitions for symacc.
 */

#ifdef __cplusplus
/** Must have same layout as a T* */
template <typename T, typename Index> class IndexBy
{
  T *rep;

public:
  T &operator[](Index index)
  {
    return rep[index];
  }
  /* Rest of operators are required to make macro NEED work.
     Their functionality is deliberately minimized with intent
     to minimize accidental use outside macro NEED.  It would
     be better that "operator void*" have the explicit keyword, but
     Microsoft 10.0 Open Tools does not support that C++11 feature. */
  operator char*() const
  {
    return reinterpret_cast<char*>(rep);
  }
  void operator=(T *ptr)
  {
    rep = ptr;
  }
  bool operator!() const
  {
    return !rep;
  }
  void *operator+(int offset) const
  {
    return reinterpret_cast<void *>(rep + offset);
  }
};

#define INDEX_BY(T, Index) IndexBy<T, Index>
#else
#define INDEX_BY(T, Index) T *
#endif

#if defined(__cplusplus)
extern "C" {
#endif

/* FIXME: down the file there are declarations that depend on ST_MAX
   etc. and not guarded by #ifdef INIT.  Either INIT is always
   defined or there exist alternative definitions for these values
   somewhere.  This needs to be unified and cleaned.  */
#ifdef INIT
#define ST_MAX 1
#define SC_MAX 1
#define TY_MAX 1
#define OC_MAX 1
#define NMPTRP(s, v) (stb.stg_base[s].nmptr = (v))
#define HASHLKP(s, v) (stb.stg_base[s].hashlk = (v))
#define NMPTRG(s) stb.stg_base[s].nmptr
#define HASHLKG(s) stb.stg_base[s].hashlk
#define SYMNAME(s) (stb.n_base + stb.stg_base[s].nmptr)
#endif

/* hashtab stuff */
#define HASHSIZE 9973
#define HASH_CON(p) ((p[0] ^ p[1]) % HASHSIZE)
#define HASH_ID(hv, p, len)                            \
  hv = p[(len)-1] | (*p << 16) | (p[(len) >> 1] << 8); \
  if ((int)(len) > 3)                                  \
    hv ^= (p[1] << 4);                                 \
  hv %= HASHSIZE;
#define HASH_STR(hv, p, len)     \
  if (len) {                     \
    /*hv =*/HASH_ID(hv, p, len); \
  } else                         \
    hv = 0;

/* limits */
#define MAX_NMPTR 134217728

/* for exclusive use by NEWSYM */
void realloc_sym_storage();

/* symbol creation macros */
#ifdef UTILSYMTAB
#define NEWSYM(sptr)         \
  sptr = (SPTR)stb.stg_avail++; \
  if (sptr >= stb.stg_size)    \
    realloc_sym_storage();   \
  BZERO(&stb.stg_base[sptr], char, sizeof(SYM))

#else
#define NEWSYM(sptr)         \
  sptr = (SPTR)STG_NEXT(stb);

#endif

#define LINKSYM(sptr, hashval)        \
  HASHLKP(sptr, stb.hashtb[hashval]); \
  stb.hashtb[hashval] = sptr

#define ADDSYM(sptr, hashval) \
  NEWSYM(sptr);               \
  LINKSYM(sptr, hashval)

/*  symbol table typedef declarations */

#ifndef PGHPF
typedef struct SYM {
  SYMTYPE stype : 8;
  SC_KIND sc : 8;
  unsigned b3 : 8;
  unsigned b4 : 8;
  DTYPE dtype;
  SPTR hashlk;
  SPTR symlk;
  INT scope;
  INT nmptr;
  unsigned f1 : 1, f2 : 1, f3 : 1, f4 : 1, f5 : 1, f6 : 1, f7 : 1, f8 : 1;
  unsigned f9 : 1, f10 : 1, f11 : 1, f12 : 1, f13 : 1, f14 : 1, f15 : 1, f16 : 1;
  unsigned f17 : 1, f18 : 1, f19 : 1, f20 : 1, f21 : 1, f22 : 1, f23 : 1, f24 : 1;
  unsigned f25 : 1, f26 : 1, f27 : 1, f28 : 1, f29 : 1, f30 : 1, f31 : 1, f32 : 1;
  INT w8;
  INT w9;
  ISZ_T w10;
  INT w11;
  INT w12;
  INT w13;
  ISZ_T w14;
  INT w15;
  INT w16;
  INT w17;
  INT w18;
  unsigned f33 : 1, f34 : 1, f35 : 1, f36 : 1, f37 : 1, f38 : 1, f39 : 1, f40 : 1;
  unsigned f41 : 1, f42 : 1, f43 : 1, f44 : 1, f45 : 1, f46 : 1, f47 : 1, f48 : 1;
  unsigned f49 : 1, f50 : 1, f51 : 1, f52 : 1, f53 : 1, f54 : 1, f55 : 1, f56 : 1;
  unsigned f57 : 1, f58 : 1, f59 : 1, f60 : 1, f61 : 1, f62 : 1, f63 : 1, f64 : 1;
  INT w20;
  unsigned f65 : 1, f66 : 1, f67 : 1, f68 : 1, f69 : 1, f70 : 1, f71 : 1, f72 : 1;
  unsigned f73 : 1, f74 : 1, f75 : 1, f76 : 1, f77 : 1, f78 : 1, f79 : 1, f80 : 1;
  unsigned f81 : 1, f82 : 1, f83 : 1, f84 : 1, f85 : 1, f86 : 1, f87 : 1, f88 : 1;
  unsigned f89 : 1, f90 : 1, f91 : 1, f92 : 1, f93 : 1, f94 : 1, f95 : 1, f96 : 1;
  INT w22;
  INT w23;
  INT w24;
  unsigned f97 : 1, f98 : 1, f99 : 1, f100 : 1, f101 : 1, f102 : 1, f103 : 1,
      f104 : 1;
  unsigned f105 : 1, f106 : 1, f107 : 1, f108 : 1, f109 : 1, f110 : 1, f111 : 1,
      f112 : 1;
  unsigned f113 : 1, f114 : 1, f115 : 1, f116 : 1, f117 : 1, f118 : 1, f119 : 1,
      f120 : 1;
  unsigned f121 : 1, f122 : 1, f123 : 1, f124 : 1, f125 : 1, f126 : 1, f127 : 1,
      f128 : 1;
  INT w26;
  INT w27;
  INT w28;
  INT w29;
  INT w30;
  INT w31;
  INT w32;
} SYM;
#endif

#ifdef PGHPF
typedef struct SYM {
  SYMTYPE stype : 8;
  SC_KIND sc : 8;
  unsigned b3 : 8;
  unsigned b4 : 8;
  INT dtype;
  SPTR hashlk;
  SPTR symlk;
  INT scope;
  INT nmptr;
  unsigned f1 : 1, f2 : 1, f3 : 1, f4 : 1, f5 : 1, f6 : 1, f7 : 1, f8 : 1;
  unsigned f9 : 1, f10 : 1, f11 : 1, f12 : 1, f13 : 1, f14 : 1, f15 : 1, f16 : 1;
  unsigned f17 : 1, f18 : 1, f19 : 1, f20 : 1, f21 : 1, f22 : 1, f23 : 1, f24 : 1;
  unsigned f25 : 1, f26 : 1, f27 : 1, f28 : 1, f29 : 1, f30 : 1, f31 : 1, f32 : 1;
#if defined(INTIS64)
  unsigned fldum : 32;
#endif
  unsigned f33 : 1, f34 : 1, f35 : 1, f36 : 1, f37 : 1, f38 : 1, f39 : 1, f40 : 1;
  unsigned f41 : 1, f42 : 1, f43 : 1, f44 : 1, f45 : 1, f46 : 1, f47 : 1, f48 : 1;
  unsigned f49 : 1, f50 : 1, f51 : 1, f52 : 1, f53 : 1, f54 : 1, f55 : 1, f56 : 1;
  unsigned f57 : 1, f58 : 1, f59 : 1, f60 : 1, f61 : 1, f62 : 1, f63 : 1, f64 : 1;
#if defined(INTIS64)
  unsigned fldum2 : 32;
#endif
  INT w9;
  ISZ_T w10;
  INT w11;
  INT w12;
  INT w13;
  ISZ_T w14;
  INT w15;
  INT w16;
  INT w17;
  INT w18;
  INT w19;
  INT w20;
  INT w21;
  INT w22;
  INT w23;
  INT w24;
  INT w25;
  INT w26;
  INT w27;
  INT w28;
  INT uname;
  INT w30;
  INT w31;
  INT w32;
  unsigned f65 : 1, f66 : 1, f67 : 1, f68 : 1, f69 : 1, f70 : 1, f71 : 1, f72 : 1;
  unsigned f73 : 1, f74 : 1, f75 : 1, f76 : 1, f77 : 1, f78 : 1, f79 : 1, f80 : 1;
  unsigned f81 : 1, f82 : 1, f83 : 1, f84 : 1, f85 : 1, f86 : 1, f87 : 1, f88 : 1;
  unsigned f89 : 1, f90 : 1, f91 : 1, f92 : 1, f93 : 1, f94 : 1, f95 : 1, f96 : 1;
#if defined(INTIS64)
  unsigned fldum3 : 32;
#endif
  INT w34;
  INT w35;
  INT w36;
  unsigned f97 : 1, f98 : 1, f99 : 1, f100 : 1, f101 : 1, f102 : 1, f103 : 1,
      f104 : 1;
  unsigned f105 : 1, f106 : 1, f107 : 1, f108 : 1, f109 : 1, f110 : 1, f111 : 1,
      f112 : 1;
  unsigned f113 : 1, f114 : 1, f115 : 1, f116 : 1, f117 : 1, f118 : 1, f119 : 1,
      f120 : 1;
  unsigned f121 : 1, f122 : 1, f123 : 1, f124 : 1, f125 : 1, f126 : 1, f127 : 1,
      f128 : 1;
#if defined(INTIS64)
  unsigned fldum4 : 32;
#endif
  INT lineno;
  INT w39;
  INT w40;
} SYM;
#endif

/*   symbol table data declarations:  */
typedef struct {
  const char *stypes[ST_MAX + 1];
  OVCLASS ovclass[ST_MAX + 1];
  const char *ocnames[OC_MAX + 1];
  const char *scnames[SC_MAX + 1];
  const char *tynames[TY_MAX + 1];
  SPTR i0, i1;
  SPTR k0, k1;
  SPTR flt0, dbl0, quad0;
  SPTR fltm0, dblm0, quadm0; /* floating point minus 0 */
  SPTR flt1, dbl1, quad1;
  SPTR flt2, dbl2, quad2;
  SPTR flthalf, dblhalf, quadhalf;
  struct{
    STG_MEMBERS(ISZ_T);
  }dt;
  int curr_scope;
  SPTR hashtb[HASHSIZE + 1];
  SPTR firstusym, firstosym;
  STG_MEMBERS(SYM);
  char *n_base;
  int n_size;
  int namavl;
  int lbavail;
  int lb_string_avail;
  INT *w_base;
  int w_size;
  int wrdavl;
#ifdef PGC
  /* signed/unsigned char: DT_SCHAR/DT_UCHAR.  Macro DT_CHAR is aliased
   * to this member.  WARNING:  value is not defined until scan_init().
   */
  int dt_char;
#endif
#ifdef LONG_DOUBLE_X87
  int x87_0, x87_m0, x87_1, x87_2; /* 80-bit X87 0.0, -0.0, and 1.0 */
#endif
#ifdef DOUBLE_DOUBLE
  /* double-double 0.0, -0.0, and 1.0 */
  int doubledouble_0, doubledouble_m0, doubledouble_1;
#endif
#ifdef LONG_DOUBLE_FLOAT128
  /* __float128 0.0, -0.0, 1.0, .5, and 2.0 */
  SPTR float128_0, float128_m0, float128_1;
  SPTR float128_half, float128_2;
#endif
#ifdef PGHPF
  /* These members are the integer, real, complex, and logical dtypes which
   * are the default data types for the target.  The value of one of these
   * members will be one of the respective DT_xxx values.  The macros DT_INT,
   * DT_REAL, DT_CMPLX, and DT_LOG are #define'd to these members; these
   * definitions occur in symtab.h.
   * dt_ptr (macro DT_PTR) is the integer type which should be used for
   * cray pointers.  The problem is for some machines (SGI), the default
   * integer type is 32 bits, but the pointer type is 64 bits.
   */
  DTYPE dt_int;    /* default integer - DT_INT   */
  DTYPE dt_real;   /* default real    - DT_REAL  */
  DTYPE dt_cmplx;  /* default cmplx   - DT_CMPLX */
  DTYPE dt_log;    /* default logical - DT_LOG   */
  DTYPE dt_dble;   /* default double precision - DT_DBLE */
  DTYPE dt_dcmplx; /* default double cmplx - DT_DCMPLX */
  DTYPE dt_ptr;    /* default pointer integer - DT_PTR */
  /* The following members are the default integer, real, complex, and
   * logical dtypes as specified by the user.  Normally these are set to
   * the target default data types.  However, the user may override these
   * with options -i8 and/or -r8.
  */
  struct {
    DTYPE dt_int;
    DTYPE dt_real;
    DTYPE dt_cmplx;
    DTYPE dt_log;
  } user;
#endif
} STB;

extern STB stb;

#ifdef __cplusplus
inline SPTR SymConval1(SPTR sptr) {
  return static_cast<SPTR>(CONVAL1G(sptr));
}
inline SPTR SymConval2(SPTR sptr) {
  return static_cast<SPTR>(CONVAL2G(sptr));
}
#else
#define SymConval1 CONVAL1G
#define SymConval2 CONVAL2G
#endif

/** mode parameter for installsym_ex. */
typedef enum IS_MODE {
  /* Create new symbol if it does not already exist. */
  IS_GET,
  /* Create new symbol always and do NOT insert it in the hash table. */
  IS_QUICK
} IS_MODE;

void sym_init_first(void);
SPTR lookupsym(const char *, int);
SPTR lookupsymbol(const char *);
SPTR lookupsymf(const char *, ...);
#define installsym(name, olength) installsym_ex(name, olength, IS_GET)
SPTR installsym_ex(const char *name, int olength, IS_MODE mode);
int putsname(const char *, int);
char *local_sname(char *);
void add_fp_constants(void);
bool is_flt0(SPTR sptr);
bool is_dbl0(SPTR sptr);
bool is_quad0(SPTR sptr);
bool is_x87_0(SPTR sptr);
bool is_doubledouble_0(SPTR sptr);
bool is_cmplx_flt0(SPTR sptr);
bool is_creal_flt0(SPTR sptr);
bool is_cimag_flt0(SPTR sptr);
bool is_cmplx_dbl0(SPTR sptr);
bool is_cmplx_quad0(SPTR sptr);
bool is_cmplx_x87_0(SPTR sptr);
bool is_cmplx_doubledouble_0(SPTR sptr);

void put_err(int sev, const char *txt);

#ifdef UTILSYMTAB
#undef assert
#define assert(cond, txt, val, sev) \
  if (cond); else symini_interr((txt), (val), (sev))
#endif

void symini_errfatal(int n);
void symini_error(int n, int s, int l, const char *c1, const char *c2);
void symini_interr(const char *txt, int val, int sev);

#if defined(__cplusplus)
}
#endif

#endif // SYMACC_H_