|
|
1.1 root 1: /****************************************************************
2: Copyright 1990, 1991, 1992, 1993 by AT&T Bell Laboratories, Bellcore.
3:
4: Permission to use, copy, modify, and distribute this software
5: and its documentation for any purpose and without fee is hereby
6: granted, provided that the above copyright notice appear in all
7: copies and that both that the copyright notice and this
8: permission notice and warranty disclaimer appear in supporting
9: documentation, and that the names of AT&T Bell Laboratories or
10: Bellcore or any of their entities not be used in advertising or
11: publicity pertaining to distribution of the software without
12: specific, written prior permission.
13:
14: AT&T and Bellcore disclaim all warranties with regard to this
15: software, including all implied warranties of merchantability
16: and fitness. In no event shall AT&T or Bellcore be liable for
17: any special, indirect or consequential damages or any damages
18: whatsoever resulting from loss of use, data or profits, whether
19: in an action of contract, negligence or other tortious action,
20: arising out of or in connection with the use or performance of
21: this software.
22: ****************************************************************/
23:
24: #include "sysdep.h"
25:
26: #include "ftypes.h"
27: #include "defines.h"
28: #include "machdefs.h"
29:
30: #define MAXDIM 20
31: #define MAXINCLUDES 10
32: #define MAXLITERALS 200 /* Max number of constants in the literal
33: pool */
34: #define MAXTOKENLEN 302 /* length of longest token */
35: #define MAXCTL 20
36: #define MAXHASH 401
37: #define MAXSTNO 801
38: #define MAXEXT 200
39: #define MAXEQUIV 150
40: #define MAXLABLIST 258 /* Max number of labels in an alternate
41: return CALL or computed GOTO */
42: #define MAXCONTIN 99 /* Max continuation lines */
43:
44: /* These are the primary pointer types used in the compiler */
45:
46: typedef union Expression *expptr, *tagptr;
47: typedef struct Chain *chainp;
48: typedef struct Addrblock *Addrp;
49: typedef struct Constblock *Constp;
50: typedef struct Exprblock *Exprp;
51: typedef struct Nameblock *Namep;
52:
53: extern FILEP opf();
54: extern FILEP infile;
55: extern FILEP diagfile;
56: extern FILEP textfile;
57: extern FILEP asmfile;
58: extern FILEP c_file; /* output file for all functions; extern
59: declarations will have to be prepended */
60: extern FILEP pass1_file; /* Temp file to hold the function bodies
61: read on pass 1 */
62: extern FILEP expr_file; /* Debugging file */
63: extern FILEP initfile; /* Intermediate data file pointer */
64: extern FILEP blkdfile; /* BLOCK DATA file */
65:
66: extern int current_ftn_file;
67: extern int maxcontin;
68:
69: extern char *blkdfname, *initfname, *sortfname;
70: extern long int headoffset; /* Since the header block requires data we
71: don't know about until AFTER each
72: function has been processed, we keep a
73: pointer to the current (dummy) header
74: block (at the top of the assembly file)
75: here */
76:
77: extern char main_alias[]; /* name given to PROGRAM psuedo-op */
78: extern char token [ ];
79: extern int toklen;
80: extern long lineno;
81: extern char *infname;
82: extern int needkwd;
83: extern struct Labelblock *thislabel;
84:
85: /* Used to allow runtime expansion of internal tables. In particular,
86: these values can exceed their associated constants */
87:
88: extern int maxctl;
89: extern int maxequiv;
90: extern int maxstno;
91: extern int maxhash;
92: extern int maxext;
93:
94: extern flag nowarnflag;
95: extern flag ftn66flag; /* Generate warnings when weird f77
96: features are used (undeclared dummy
97: procedure, non-char initialized with
98: string, 1-dim subscript in EQUIV) */
99: extern flag no66flag; /* Generate an error when a generic
100: function (f77 feature) is used */
101: extern flag noextflag; /* Generate an error when an extension to
102: Fortran 77 is used (hex/oct/bin
103: constants, automatic, static, double
104: complex types) */
105: extern flag zflag; /* enable double complex intrinsics */
106: extern flag shiftcase;
107: extern flag undeftype;
108: extern flag shortsubs; /* Use short subscripts on arrays? */
109: extern flag onetripflag; /* if true, always execute DO loop body */
110: extern flag checksubs;
111: extern flag debugflag;
112: extern int nerr;
113: extern int nwarn;
114:
115: extern int parstate;
116: extern flag headerdone; /* True iff the current procedure's header
117: data has been written */
118: extern int blklevel;
119: extern flag saveall;
120: extern flag substars; /* True iff some formal parameter is an
121: asterisk */
122: extern int impltype[ ];
123: extern ftnint implleng[ ];
124: extern int implstg[ ];
125:
126: extern int tycomplex, tyint, tyioint, tyreal;
127: extern int tylog, tylogical; /* TY____ of the implementation of logical.
128: This will be LONG unless '-2' is given
129: on the command line */
130: extern int type_choice[];
131: extern char *typename[];
132:
133: extern int typesize[]; /* size (in bytes) of an object of each
134: type. Indexed by TY___ macros */
135: extern int typealign[];
136: extern int proctype; /* Type of return value in this procedure */
137: extern char * procname; /* External name of the procedure, or last ENTRY name */
138: extern int rtvlabel[ ]; /* Return value labels, indexed by TY___ macros */
139: extern Addrp retslot;
140: extern Addrp xretslot[];
141: extern int cxslot; /* Complex return argument slot (frame pointer offset)*/
142: extern int chslot; /* Character return argument slot (fp offset) */
143: extern int chlgslot; /* Argument slot for length of character buffer */
144: extern int procclass; /* Class of the current procedure: either CLPROC,
145: CLMAIN, CLBLOCK or CLUNKNOWN */
146: extern ftnint procleng; /* Length of function return value (e.g. char
147: string length). If this is -1, then the length is
148: not known at compile time */
149: extern int nentry; /* Number of entry points (other than the original
150: function call) into this procedure */
151: extern flag multitype; /* YES iff there is more than one return value
152: possible */
153: extern int blklevel;
154: extern long lastiolabno;
155: extern int lastlabno;
156: extern int lastvarno;
157: extern int lastargslot; /* integer offset pointing to the next free
158: location for an argument to the current routine */
159: extern int argloc;
160: extern int autonum[]; /* for numbering
161: automatic variables, e.g. temporaries */
162: extern int retlabel;
163: extern int ret0label;
164: extern int dorange; /* Number of the label which terminates
165: the innermost DO loop */
166: extern int regnum[ ]; /* Numbers of DO indicies named in
167: regnamep (below) */
168: extern Namep regnamep[ ]; /* List of DO indicies in registers */
169: extern int maxregvar; /* number of elts in regnamep */
170: extern int highregvar; /* keeps track of the highest register
171: number used by DO index allocator */
172: extern int nregvar; /* count of DO indicies in registers */
173:
174: extern chainp templist[];
175: extern int maxdim;
176: extern chainp earlylabs;
177: extern chainp holdtemps;
178: extern struct Entrypoint *entries;
179: extern struct Rplblock *rpllist;
180: extern struct Chain *curdtp;
181: extern ftnint curdtelt;
182: extern chainp allargs; /* union of args in entries */
183: extern int nallargs; /* total number of args */
184: extern int nallchargs; /* total number of character args */
185: extern flag toomanyinit; /* True iff too many initializers in a
186: DATA statement */
187:
188: extern flag inioctl;
189: extern int iostmt;
190: extern Addrp ioblkp;
191: extern int nioctl;
192: extern int nequiv;
193: extern int eqvstart; /* offset to eqv number to guarantee uniqueness
194: and prevent <something> from going negative */
195: extern int nintnames;
196:
197: /* Chain of tagged blocks */
198:
199: struct Chain
200: {
201: chainp nextp;
202: char * datap; /* Tagged block */
203: };
204:
205: extern chainp chains;
206:
207: /* Recall that field is intended to hold four-bit characters */
208:
209: /* This structure exists only to defeat the type checking */
210:
211: struct Headblock
212: {
213: field tag;
214: field vtype;
215: field vclass;
216: field vstg;
217: expptr vleng; /* Expression for length of char string -
218: this may be a constant, or an argument
219: generated by mkarg() */
220: } ;
221:
222: /* Control construct info (for do loops, else, etc) */
223:
224: struct Ctlframe
225: {
226: unsigned ctltype:8;
227: unsigned dostepsign:8; /* 0 - variable, 1 - pos, 2 - neg */
228: unsigned dowhile:1;
229: int ctlabels[4]; /* Control labels, defined below */
230: int dolabel; /* label marking end of this DO loop */
231: Namep donamep; /* DO index variable */
232: expptr domax; /* constant or temp variable holding MAX
233: loop value; or expr of while(expr) */
234: expptr dostep; /* expression */
235: Namep loopname;
236: };
237: #define endlabel ctlabels[0]
238: #define elselabel ctlabels[1]
239: #define dobodylabel ctlabels[1]
240: #define doposlabel ctlabels[2]
241: #define doneglabel ctlabels[3]
242: extern struct Ctlframe *ctls; /* Keeps info on DO and BLOCK IF
243: structures - this is the stack
244: bottom */
245: extern struct Ctlframe *ctlstack; /* Pointer to current nesting
246: level */
247: extern struct Ctlframe *lastctl; /* Point to end of
248: dynamically-allocated array */
249:
250: typedef struct {
251: int type;
252: chainp cp;
253: } Atype;
254:
255: typedef struct {
256: int defined, dnargs, nargs, changes;
257: Atype atypes[1];
258: } Argtypes;
259:
260: /* External Symbols */
261:
262: struct Extsym
263: {
264: char *fextname; /* Fortran version of external name */
265: char *cextname; /* C version of external name */
266: field extstg; /* STG -- should be COMMON, UNKNOWN or EXT
267: */
268: unsigned extype:4; /* for transmitting type to output routines */
269: unsigned used_here:1; /* Boolean - true on the second pass
270: through a function if the block has
271: been referenced */
272: unsigned exused:1; /* Has been used (for help with error msgs
273: about externals typed differently in
274: different modules) */
275: unsigned exproto:1; /* type specified in a .P file */
276: unsigned extinit:1; /* Procedure has been defined,
277: or COMMON has DATA */
278: unsigned extseen:1; /* True if previously referenced */
279: chainp extp; /* List of identifiers in the common
280: block for this function, stored as
281: Namep (hash table pointers) */
282: chainp allextp; /* List of lists of identifiers; we keep one
283: list for each layout of this common block */
284: int curno; /* current number for this common block,
285: used for constructing appending _nnn
286: to the common block name */
287: int maxno; /* highest curno value for this common block */
288: ftnint extleng;
289: ftnint maxleng;
290: Argtypes *arginfo;
291: };
292: typedef struct Extsym Extsym;
293:
294: extern Extsym *extsymtab; /* External symbol table */
295: extern Extsym *nextext;
296: extern Extsym *lastext;
297: extern int complex_seen, dcomplex_seen;
298:
299: /* Statement labels */
300:
301: struct Labelblock
302: {
303: int labelno; /* Internal label */
304: unsigned blklevel:8; /* level of nesting , for branch-in-loop
305: checking */
306: unsigned labused:1;
307: unsigned fmtlabused:1;
308: unsigned labinacc:1; /* inaccessible? (i.e. has its scope
309: vanished) */
310: unsigned labdefined:1; /* YES or NO */
311: unsigned labtype:2; /* LAB{FORMAT,EXEC,etc} */
312: ftnint stateno; /* Original label */
313: char *fmtstring; /* format string */
314: };
315:
316: extern struct Labelblock *labeltab; /* Label table - keeps track of
317: all labels, including undefined */
318: extern struct Labelblock *labtabend;
319: extern struct Labelblock *highlabtab;
320:
321: /* Entry point list */
322:
323: struct Entrypoint
324: {
325: struct Entrypoint *entnextp;
326: Extsym *entryname; /* Name of this ENTRY */
327: chainp arglist;
328: int typelabel; /* Label for function exit; this
329: will return the proper type of
330: object */
331: Namep enamep; /* External name */
332: };
333:
334: /* Primitive block, or Primary block. This is a general template returned
335: by the parser, which will be interpreted in context. It is a template
336: for an identifier (variable name, function name), parenthesized
337: arguments (array subscripts, function parameters) and substring
338: specifications. */
339:
340: struct Primblock
341: {
342: field tag;
343: field vtype;
344: unsigned parenused:1; /* distinguish (a) from a */
345: Namep namep; /* Pointer to structure Nameblock */
346: struct Listblock *argsp;
347: expptr fcharp; /* first-char-index-pointer (in
348: substring) */
349: expptr lcharp; /* last-char-index-pointer (in
350: substring) */
351: };
352:
353:
354: struct Hashentry
355: {
356: int hashval;
357: Namep varp;
358: };
359: extern struct Hashentry *hashtab; /* Hash table */
360: extern struct Hashentry *lasthash;
361:
362: struct Intrpacked /* bits for intrinsic function description */
363: {
364: unsigned f1:3;
365: unsigned f2:4;
366: unsigned f3:7;
367: unsigned f4:1;
368: };
369:
370: struct Nameblock
371: {
372: field tag;
373: field vtype;
374: field vclass;
375: field vstg;
376: expptr vleng; /* length of character string, if applicable */
377: char *fvarname; /* name in the Fortran source */
378: char *cvarname; /* name in the resulting C */
379: chainp vlastdim; /* datap points to new_vars entry for the */
380: /* system variable, if any, storing the final */
381: /* dimension; we zero the datap if this */
382: /* variable is needed */
383: unsigned vprocclass:3; /* P____ macros - selects the varxptr
384: field below */
385: unsigned vdovar:1; /* "is it a DO variable?" for register
386: and multi-level loop checking */
387: unsigned vdcldone:1; /* "do I think I'm done?" - set when the
388: context is sufficient to determine its
389: status */
390: unsigned vadjdim:1; /* "adjustable dimension?" - needed for
391: information about copies */
392: unsigned vsave:1;
393: unsigned vimpldovar:1; /* used to prevent erroneous error messages
394: for variables used only in DATA stmt
395: implicit DOs */
396: unsigned vis_assigned:1;/* True if this variable has had some
397: label ASSIGNED to it; hence
398: varxptr.assigned_values is valid */
399: unsigned vimplstg:1; /* True if storage type is assigned implicitly;
400: this allows a COMMON variable to participate
401: in a DIMENSION before the COMMON declaration.
402: */
403: unsigned vcommequiv:1; /* True if EQUIVALENCEd onto STGCOMMON */
404: unsigned vfmt_asg:1; /* True if char *var_fmt needed */
405: unsigned vpassed:1; /* True if passed as a character-variable arg */
406: unsigned vknownarg:1; /* True if seen in a previous entry point */
407: unsigned visused:1; /* True if variable is referenced -- so we */
408: /* can omit variables that only appear in DATA */
409: unsigned vnamelist:1; /* Appears in a NAMELIST */
410: unsigned vimpltype:1; /* True if implicitly typed and not
411: invoked as a function or subroutine
412: (so we can consistently type procedures
413: declared external and passed as args
414: but never invoked).
415: */
416: unsigned vtypewarned:1; /* so we complain just once about
417: changed types of external procedures */
418: unsigned vinftype:1; /* so we can restore implicit type to a
419: procedure if it is invoked as a function
420: after being given a different type by -it */
421: unsigned vinfproc:1; /* True if -it infers this to be a procedure */
422: unsigned vcalled:1; /* has been invoked */
423: unsigned vdimfinish:1; /* need to invoke dim_finish() */
424: unsigned vrefused:1; /* Need to #define name_ref (for -s) */
425: unsigned vsubscrused:1; /* Need to #define name_subscr (for -2) */
426:
427: /* The vardesc union below is used to store the number of an intrinsic
428: function (when vstg == STGINTR and vprocclass == PINTRINSIC), or to
429: store the index of this external symbol in extsymtab (when vstg ==
430: STGEXT and vprocclass == PEXTERNAL) */
431:
432: union {
433: int varno; /* Return variable for a function.
434: This is used when a function is
435: assigned a return value. Also
436: used to point to the COMMON
437: block, when this is a field of
438: that block. Also points to
439: EQUIV block when STGEQUIV */
440: struct Intrpacked intrdesc; /* bits for intrinsic function*/
441: } vardesc;
442: struct Dimblock *vdim; /* points to the dimensions if they exist */
443: ftnint voffset; /* offset in a storage block (the variable
444: name will be "v.%d", voffset in a
445: common blck on the vax). Also holds
446: pointers for automatic variables. When
447: STGEQUIV, this is -(offset from array
448: base) */
449: union {
450: chainp namelist; /* points to names in the NAMELIST,
451: if this is a NAMELIST name */
452: chainp vstfdesc; /* points to (formals, expr) pair */
453: chainp assigned_values; /* list of integers, each being a
454: statement label assigned to
455: this variable in the current function */
456: } varxptr;
457: int argno; /* for multiple entries */
458: Argtypes *arginfo;
459: };
460:
461:
462: /* PARAMETER statements */
463:
464: struct Paramblock
465: {
466: field tag;
467: field vtype;
468: field vclass;
469: field vstg;
470: expptr vleng;
471: char *fvarname;
472: char *cvarname;
473: expptr paramval;
474: } ;
475:
476:
477: /* Expression block */
478:
479: struct Exprblock
480: {
481: field tag;
482: field vtype;
483: field vclass;
484: field vstg;
485: expptr vleng; /* in the case of a character expression, this
486: value is inherited from the children */
487: unsigned opcode;
488: expptr leftp;
489: expptr rightp;
490: };
491:
492:
493: union Constant
494: {
495: struct {
496: char *ccp0;
497: ftnint blanks;
498: } ccp1;
499: ftnint ci; /* Constant long integer */
500: double cd[2];
501: char *cds[2];
502: };
503: #define ccp ccp1.ccp0
504:
505: struct Constblock
506: {
507: field tag;
508: field vtype;
509: field vclass;
510: field vstg; /* vstg = 1 when using Const.cds */
511: expptr vleng;
512: union Constant Const;
513: };
514:
515:
516: struct Listblock
517: {
518: field tag;
519: field vtype;
520: chainp listp;
521: };
522:
523:
524:
525: /* Address block - this is the FINAL form of identifiers before being
526: sent to pass 2. We'll want to add the original identifier here so that it can
527: be preserved in the translation.
528:
529: An example identifier is q.7. The "q" refers to the storage class
530: (field vstg), the 7 to the variable number (int memno). */
531:
532: struct Addrblock
533: {
534: field tag;
535: field vtype;
536: field vclass;
537: field vstg;
538: expptr vleng;
539: /* put union...user here so the beginning of an Addrblock
540: * is the same as a Constblock.
541: */
542: union {
543: Namep name; /* contains a pointer into the hash table */
544: char ident[IDENT_LEN + 1]; /* C string form of identifier */
545: char *Charp;
546: union Constant Const; /* Constant value */
547: struct {
548: double dfill[2];
549: field vstg1;
550: } kludge; /* so we can distinguish string vs binary
551: * floating-point constants */
552: } user;
553: long memno; /* when vstg == STGCONST, this is the
554: numeric part of the assembler label
555: where the constant value is stored */
556: expptr memoffset; /* used in subscript computations, usually */
557: unsigned istemp:1; /* used in stack management of temporary
558: variables */
559: unsigned isarray:1; /* used to show that memoffset is
560: meaningful, even if zero */
561: unsigned ntempelt:10; /* for representing temporary arrays, as
562: in concatenation */
563: unsigned dbl_builtin:1; /* builtin to be declared double */
564: unsigned charleng:1; /* so saveargtypes can get i/o calls right */
565: unsigned cmplx_sub:1; /* used in complex arithmetic under -s */
566: unsigned skip_offset:1; /* used in complex arithmetic under -s */
567: unsigned parenused:1; /* distinguish (a) from a */
568: ftnint varleng; /* holds a copy of a constant length which
569: is stored in the vleng field (e.g.
570: a double is 8 bytes) */
571: int uname_tag; /* Tag describing which of the unions()
572: below to use */
573: char *Field; /* field name when dereferencing a struct */
574: }; /* struct Addrblock */
575:
576:
577: /* Errorbock - placeholder for errors, to allow the compilation to
578: continue */
579:
580: struct Errorblock
581: {
582: field tag;
583: field vtype;
584: };
585:
586:
587: /* Implicit DO block, especially related to DATA statements. This block
588: keeps track of the compiler's location in the implicit DO while it's
589: running. In particular, the isactive and isbusy flags tell where
590: it is */
591:
592: struct Impldoblock
593: {
594: field tag;
595: unsigned isactive:1;
596: unsigned isbusy:1;
597: Namep varnp;
598: Constp varvp;
599: chainp impdospec;
600: expptr implb;
601: expptr impub;
602: expptr impstep;
603: ftnint impdiff;
604: ftnint implim;
605: struct Chain *datalist;
606: };
607:
608:
609: /* Each of these components has a first field called tag. This union
610: exists just for allocation simplicity */
611:
612: union Expression
613: {
614: field tag;
615: struct Addrblock addrblock;
616: struct Constblock constblock;
617: struct Errorblock errorblock;
618: struct Exprblock exprblock;
619: struct Headblock headblock;
620: struct Impldoblock impldoblock;
621: struct Listblock listblock;
622: struct Nameblock nameblock;
623: struct Paramblock paramblock;
624: struct Primblock primblock;
625: } ;
626:
627:
628:
629: struct Dimblock
630: {
631: int ndim;
632: expptr nelt; /* This is NULL if the array is unbounded */
633: expptr baseoffset; /* a constant or local variable holding
634: the offset in this procedure */
635: expptr basexpr; /* expression for comuting the offset, if
636: it's not constant. If this is
637: non-null, the register named in
638: baseoffset will get initialized to this
639: value in the procedure's prolog */
640: struct
641: {
642: expptr dimsize; /* constant or register holding the size
643: of this dimension */
644: expptr dimexpr; /* as above in basexpr, this is an
645: expression for computing a variable
646: dimension */
647: } dims[1]; /* Dimblocks are allocated with enough
648: space for this to become dims[ndim] */
649: };
650:
651:
652: /* Statement function identifier stack - this holds the name and value of
653: the parameters in a statement function invocation. For example,
654:
655: f(x,y,z)=x+y+z
656: .
657: .
658: y = f(1,2,3)
659:
660: generates a stack of depth 3, with <x 1>, <y 2>, <z 3> AT THE INVOCATION, NOT
661: at the definition */
662:
663: struct Rplblock /* name replacement block */
664: {
665: struct Rplblock *rplnextp;
666: Namep rplnp; /* Name of the formal parameter */
667: expptr rplvp; /* Value of the actual parameter */
668: expptr rplxp; /* Initialization of temporary variable,
669: if required; else null */
670: int rpltag; /* Tag on the value of the actual param */
671: };
672:
673:
674:
675: /* Equivalence block */
676:
677: struct Equivblock
678: {
679: struct Eqvchain *equivs; /* List (Eqvchain) of primblocks
680: holding variable identifiers */
681: flag eqvinit;
682: long int eqvtop;
683: long int eqvbottom;
684: int eqvtype;
685: } ;
686: #define eqvleng eqvtop
687:
688: extern struct Equivblock *eqvclass;
689:
690:
691: struct Eqvchain
692: {
693: struct Eqvchain *eqvnextp;
694: union
695: {
696: struct Primblock *eqvlhs;
697: Namep eqvname;
698: } eqvitem;
699: long int eqvoffset;
700: } ;
701:
702:
703:
704: /* For allocation purposes only, and to keep lint quiet. In particular,
705: don't count on the tag being able to tell you which structure is used */
706:
707:
708: /* There is a tradition in Fortran that the compiler not generate the same
709: bit pattern more than is necessary. This structure is used to do just
710: that; if two integer constants have the same bit pattern, just generate
711: it once. This could be expanded to optimize without regard to type, by
712: removing the type check in putconst() */
713:
714: struct Literal
715: {
716: short littype;
717: short litnum; /* numeric part of the assembler
718: label for this constant value */
719: int lituse; /* usage count */
720: union {
721: ftnint litival;
722: double litdval[2];
723: ftnint litival2[2]; /* length, nblanks for strings */
724: } litval;
725: char *cds[2];
726: };
727:
728: extern struct Literal *litpool;
729: extern int maxliterals, nliterals;
730: extern char Letters[];
731: #define letter(x) Letters[x]
732:
733: struct Dims { expptr lb, ub; };
734:
735:
736: /* popular functions with non integer return values */
737:
738:
739: int *ckalloc();
740: char *varstr(), *nounder(), *addunder();
741: char *copyn(), *copys();
742: chainp hookup(), mkchain(), revchain();
743: ftnint convci();
744: char *convic();
745: char *setdoto();
746: double convcd();
747: Namep mkname();
748: struct Labelblock *mklabel(), *execlab();
749: Extsym *mkext(), *newentry();
750: expptr addrof(), call1(), call2(), call3(), call4();
751: Addrp builtin(), mktmp(), mktmp0(), mktmpn(), autovar();
752: Addrp mkplace(), mkaddr(), putconst(), memversion();
753: expptr mkprim(), mklhs(), mkexpr(), mkconv(), mkfunct(), fixexpr(), fixtype();
754: expptr errnode(), mkaddcon(), mkintcon(), putcxop();
755: tagptr cpexpr();
756: ftnint lmin(), lmax(), iarrlen();
757: char *dbconst(), *flconst();
758:
759: void puteq (), putex1 ();
760: expptr putx (), putsteq (), putassign ();
761:
762: extern int forcedouble; /* force real functions to double */
763: extern int doin_setbound; /* special handling for array bounds */
764: extern int Ansi;
765: extern char *cds(), *cpstring(), *dtos(), *string_num();
766: extern char *c_type_decl();
767: extern char hextoi_tab[];
768: #define hextoi(x) hextoi_tab[(x) & 0xff]
769: extern char *casttypes[], *ftn_types[], *protorettypes[], *usedcasts[];
770: extern int Castargs, infertypes;
771: extern FILE *protofile;
772: extern void exit(), inferdcl(), protowrite(), save_argtypes();
773: extern char binread[], binwrite[], textread[], textwrite[];
774: extern char *ei_first, *ei_last, *ei_next;
775: extern char *wh_first, *wh_last, *wh_next;
776: extern void putwhile();
777: extern char *halign;
778: extern flag keepsubs;
779: #ifdef TYQUAD
780: extern flag use_tyquad;
781: #endif
782: extern int n_keywords, n_st_fields;
783: extern char *c_keywords[], *st_fields[];
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.