1 /*        Id: manifest.h,v 1.110 2015/08/11 20:08:22 ragge Exp        */
2 /*        $NetBSD: manifest.h,v 1.1.1.7 2016/02/09 20:29:14 plunky Exp $        */
3 /*
4  * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * Redistributions of source code and documentation must retain the above
11  * copyright notice, this list of conditions and the following disclaimer.
12  * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditionsand the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  * All advertising materials mentioning features or use of this software
16  * must display the following acknowledgement:
17  *        This product includes software developed or owned by Caldera
18  *        International, Inc.
19  * Neither the name of Caldera International, Inc. nor the names of other
20  * contributors may be used to endorse or promote products derived from
21  * this software without specific prior written permission.
22  *
23  * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
24  * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
25  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27  * DISCLAIMED.  IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE
28  * FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OFLIABILITY, WHETHER IN CONTRACT,
32  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
33  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  */
36 
37 #ifndef MANIFEST
38 #define   MANIFEST
39 
40 #include <stdio.h>
41 #include <string.h>
42 #include "config.h"
43 #include "macdefs.h"
44 #include "node.h"
45 #include "compat.h"
46 
47 /*
48  * Node types
49  */
50 #define LTYPE       02                  /* leaf */
51 #define UTYPE       04                  /* unary */
52 #define BITYPE      010                 /* binary */
53 
54 /*
55  * DSIZE is the size of the dope array
56  */
57 #define DSIZE       (MAXOP+1)
58 
59 /*
60  * Type names, used in symbol table building.
61  * The order of the integer types are important.
62  * Signed types must have bit 0 unset, unsigned types set (used below).
63  */
64 #define   UNDEF               0         /* free symbol table entry */
65 #define   BOOL                1         /* function argument */
66 #define   CHAR                2
67 #define   UCHAR               3
68 #define   SHORT               4
69 #define   USHORT              5
70 #define   INT                 6
71 #define   UNSIGNED  7
72 #define   LONG                8
73 #define   ULONG               9
74 #define   LONGLONG  10
75 #define   ULONGLONG 11
76 #define   FLOAT               12
77 #define   DOUBLE              13
78 #define   LDOUBLE             14
79 #define   STRTY               15
80 #define   UNIONTY             16
81 #define   XTYPE               17        /* Extended target-specific type */
82 /* #define          MOETY               18 */     /* member of enum */
83 #define   VOID                19
84 
85 #define   MAXTYPES  19        /* highest type+1 to be used by lang code */
86 /*
87  * Various flags
88  */
89 #define NOLAB       (-1)
90 
91 /*
92  * Type modifiers.
93  */
94 #define   PTR                 0x20
95 #define   FTN                 0x40
96 #define   ARY                 0x60
97 #define   CON                 0x20
98 #define   VOL                 0x40
99 
100 /*
101  * Type packing constants
102  */
103 #define TMASK       0x060
104 #define TMASK1      0x180
105 #define TMASK2      0x1e0
106 #define BTMASK      0x1f
107 #define BTSHIFT     5
108 #define TSHIFT      2
109 
110 /*
111  * Macros
112  */
113 #define MODTYPE(x,y)          x = ((x)&(~BTMASK))|(y)       /* set basic type of x to y */
114 #define BTYPE(x)    ((x)&BTMASK)                  /* basic type of x */
115 #define   ISLONGLONG(x)       ((x) == LONGLONG || (x) == ULONGLONG)
116 #define ISUNSIGNED(x)         (((x) <= ULONGLONG) && (((x) & 1) == (UNSIGNED & 1)))
117 #define UNSIGNABLE(x)         (((x)<=ULONGLONG&&(x)>=CHAR) && !ISUNSIGNED(x))
118 #define ENUNSIGN(x) enunsign(x)
119 #define DEUNSIGN(x) deunsign(x)
120 #define ISINTEGER(x)          ((x) >= BOOL && (x) <= ULONGLONG)
121 #define ISPTR(x)    (((x)&TMASK)==PTR)
122 #define ISFTN(x)    (((x)&TMASK)==FTN)  /* is x a function type? */
123 #define ISARY(x)    (((x)&TMASK)==ARY)  /* is x an array type? */
124 #define   ISCON(x)  (((x)&CON)==CON)    /* is x const? */
125 #define   ISVOL(x)  (((x)&VOL)==VOL)    /* is x volatile? */
126 #define INCREF(x)   ((((x)&~BTMASK)<<TSHIFT)|PTR|((x)&BTMASK))
127 #define INCQAL(x)   ((((x)&~BTMASK)<<TSHIFT)|((x)&BTMASK))
128 #define DECREF(x)   ((((x)>>TSHIFT)&~BTMASK)|((x)&BTMASK))
129 #define DECQAL(x)   ((((x)>>TSHIFT)&~BTMASK)|((x)&BTMASK))
130 #define SETOFF(x,y) { if ((x)%(y) != 0) (x) = (((x)/(y) + 1) * (y)); }
131                     /* advance x to a multiple of y */
132 #define NOFIT(x,y,z)          (((x)%(z) + (y)) > (z))
133                     /* can y bits be added to x without overflowing z */
134 
135 /* Endianness.      Target is expected to TARGET_ENDIAN to one of these  */
136 #define TARGET_LE   1
137 #define TARGET_BE   2
138 #define TARGET_PDP  3
139 #define TARGET_ANY  4
140 
141 #ifndef SPECIAL_INTEGERS
142 #define   ASGLVAL(lval, val)
143 #endif
144 
145 /*
146  * Pack and unpack field descriptors (size and offset)
147  */
148 #define PKFIELD(s,o)          (((o)<<7)| (s))
149 #define UPKFSZ(v)   ((v)&0177)
150 #define UPKFOFF(v)  ((v)>>7)
151 
152 /*
153  * Operator information
154  */
155 #define TYFLG       016
156 #define ASGFLG      01
157 #define LOGFLG      020
158 
159 #define SIMPFLG     040
160 #define COMMFLG     0100
161 #define DIVFLG      0200
162 #define FLOFLG      0400
163 #define LTYFLG      01000
164 #define CALLFLG     02000
165 #define MULFLG      04000
166 #define SHFFLG      010000
167 #define ASGOPFLG 020000
168 
169 #define SPFLG       040000
170 
171 #define   regno(p)  ((p)->n_rval)       /* register number */
172 
173 /*
174  *
175  */
176 extern int gflag, kflag, pflag;
177 extern int sspflag;
178 extern int xssa, xtailcall, xtemps, xdeljumps, xdce;
179 extern int xuchar;
180 
181 int yyparse(void);
182 void yyaccpt(void);
183 
184 /*
185  * List handling macros, similar to those in 4.4BSD.
186  * The double-linked list is insque-style.
187  */
188 /* Double-linked list macros */
189 #define   DLIST_INIT(h,f)               { (h)->f.q_forw = (h); (h)->f.q_back = (h); }
190 #define   DLIST_ENTRY(t)                struct { struct t *q_forw, *q_back; }
191 #define   DLIST_NEXT(h,f)               (h)->f.q_forw
192 #define   DLIST_PREV(h,f)               (h)->f.q_back
193 #define DLIST_ISEMPTY(h,f)    ((h)->f.q_forw == (h))
194 #define DLIST_ENDMARK(h)      (h)
195 #define   DLIST_FOREACH(v,h,f) \
196           for ((v) = (h)->f.q_forw; (v) != (h); (v) = (v)->f.q_forw)
197 #define   DLIST_FOREACH_REVERSE(v,h,f) \
198           for ((v) = (h)->f.q_back; (v) != (h); (v) = (v)->f.q_back)
199 #define   DLIST_INSERT_BEFORE(h,e,f) {  \
200           (e)->f.q_forw = (h);                    \
201           (e)->f.q_back = (h)->f.q_back;          \
202           (e)->f.q_back->f.q_forw = (e);          \
203           (h)->f.q_back = (e);                    \
204 }
205 #define   DLIST_INSERT_AFTER(h,e,f) {   \
206           (e)->f.q_forw = (h)->f.q_forw;          \
207           (e)->f.q_back = (h);                    \
208           (e)->f.q_forw->f.q_back = (e);          \
209           (h)->f.q_forw = (e);                    \
210 }
211 #define DLIST_REMOVE(e,f) {                        \
212           (e)->f.q_forw->f.q_back = (e)->f.q_back; \
213           (e)->f.q_back->f.q_forw = (e)->f.q_forw; \
214 }
215 
216 /* Single-linked list */
217 #define   SLIST_INIT(h)       \
218           { (h)->q_forw = NULL; (h)->q_last = &(h)->q_forw; }
219 #define   SLIST_SETUP(h) { NULL, &(h)->q_forw }
220 #define   SLIST_ENTRY(t)      struct { struct t *q_forw; }
221 #define   SLIST_HEAD(n,t) struct n { struct t *q_forw, **q_last; }
222 #define   SLIST_ISEMPTY(h) ((h)->q_last == &(h)->q_forw)
223 #define   SLIST_FIRST(h)      ((h)->q_forw)
224 #define   SLIST_FOREACH(v,h,f) \
225           for ((v) = (h)->q_forw; (v) != NULL; (v) = (v)->f.q_forw)
226 #define   SLIST_INSERT_FIRST(h,e,f) {             \
227           if ((h)->q_last == &(h)->q_forw)        \
228                     (h)->q_last = &(e)->f.q_forw; \
229           (e)->f.q_forw = (h)->q_forw;            \
230           (h)->q_forw = (e);                      \
231 }
232 #define   SLIST_INSERT_LAST(h,e,f) {    \
233           (e)->f.q_forw = NULL;                   \
234           *(h)->q_last = (e);           \
235           (h)->q_last = &(e)->f.q_forw; \
236 }
237 
238 #ifndef   MKEXT
239 /*
240  * Functions for inter-pass communication.
241  *
242  */
243 struct interpass {
244           DLIST_ENTRY(interpass) qelem;
245           int type;
246           int lineno;
247           union {
248                     NODE *_p;
249                     int _locctr;
250                     int _label;
251                     int _curoff;
252                     char *_name;
253           } _un;
254 };
255 
256 /*
257  * Special struct for prologue/epilogue.
258  * - ip_lblnum contains the lowest/highest+1 label used
259  * - ip_lbl is set before/after all code and after/before the prolog/epilog.
260  */
261 struct interpass_prolog {
262           struct interpass ipp_ip;
263           char *ipp_name;               /* Function name */
264           int ipp_vis;                  /* Function visibility */
265           TWORD ipp_type;               /* Function type */
266 #define   NIPPREGS  BIT2BYTE(MAXREGS)/sizeof(bittype)
267           bittype ipp_regs[NIPPREGS];
268                                         /* Bitmask of registers to save */
269           int ipp_autos;                /* Size on stack needed */
270           int ip_tmpnum;                /* # allocated temp nodes so far */
271           int ip_lblnum;                /* # used labels so far */
272           int *ip_labels;               /* labels used in computed goto */
273 #ifdef TARGET_IPP_MEMBERS
274           TARGET_IPP_MEMBERS
275 #endif
276 };
277 #else
278 struct interpass { int dummy; };
279 struct interpass_prolog;
280 #endif /* !MKEXT */
281 
282 /*
283  * Epilog/prolog takes following arguments (in order):
284  * - type
285  * - regs
286  * - autos
287  * - name
288  * - type
289  * - retlab
290  */
291 
292 #define   ip_node   _un._p
293 #define   ip_locc   _un._locctr
294 #define   ip_lbl    _un._label
295 #define   ip_name   _un._name
296 #define   ip_asm    _un._name
297 #define   ip_off    _un._curoff
298 
299 /* Types of inter-pass structs */
300 #define   IP_NODE             1
301 #define   IP_PROLOG 2
302 #define   IP_EPILOG 4
303 #define   IP_DEFLAB 5
304 #define   IP_DEFNAM 6
305 #define   IP_ASM              7
306 #define   MAXIP               7
307 
308 void send_passt(int type, ...);
309 
310 
311 /*
312  * Attributes common to all passes.
313  */
314 enum {
315           ATTR_NONE,
316 #ifdef GCC_COMPAT
317           GCC_ATYP_STDCALL,
318           GCC_ATYP_CDECL,
319 #endif
320 #ifdef ATTR_MI_TARGET
321           ATTR_MI_TARGET,
322 #endif
323           ATTR_MI_MAX
324 };
325 
326 struct attr *attr_add(struct attr *orig, struct attr *new);
327 struct attr *attr_new(int, int);
328 struct attr *attr_find(struct attr *, int);
329 struct attr *attr_copy(struct attr *src, struct attr *dst, int nelem);
330 struct attr *attr_dup(struct attr *ap);
331 
332 /*
333  * External declarations, typedefs and the like
334  */
335 
336 /* used for memory allocation */
337 typedef struct mark {
338           void *tmsav;
339           void *tasav;
340           int elem;
341 } MARK;
342 
343 /* memory management stuff */
344 void *permalloc(size_t);
345 void *tmpcalloc(size_t);
346 void *tmpalloc(size_t);
347 void tmpfree(void);
348 char *newstring(char *, size_t);
349 char *tmpstrdup(char *str);
350 void markset(struct mark *m);
351 void markfree(struct mark *m);
352 void *xmalloc(int size);
353 void *xcalloc(int a, int b);
354 void *xstrdup(char *s);
355 
356 int getlab(void);
357 
358 /* command-line processing */
359 void mflags(char *);
360 
361 void tprint(TWORD, TWORD);
362 
363 /* pass t communication subroutines */
364 void topt_compile(struct interpass *);
365 
366 /* pass 2 communication subroutines */
367 void pass2_compile(struct interpass *);
368 
369 /* node routines */
370 NODE *nfree(NODE *);
371 void tfree(NODE *);
372 NODE *tcopy(NODE *);
373 void walkf(NODE *, void (*f)(NODE *, void *), void *);
374 void fwalk(NODE *t, void (*f)(NODE *, int, int *, int *), int down);
375 void flist(NODE *p, void (*f)(NODE *, void *), void *);
376 void listf(NODE *p, void (*f)(NODE *));
377 NODE *listarg(NODE *p, int n, int *cnt);
378 void cerror(const char *s, ...);
379 void werror(const char *s, ...);
380 void uerror(const char *s, ...);
381 void mkdope(void);
382 void tcheck(void);
383 
384 extern    int nerrors;                  /* number of errors seen so far */
385 extern    int warniserr;                /* treat warnings as errors */
386 
387 /* gcc warning stuff */
388 #define   Wtruncate                     0
389 #define   Wstrict_prototypes            1
390 #define   Wmissing_prototypes           2
391 #define   Wimplicit_int                           3
392 #define   Wimplicit_function_declaration          4
393 #define   Wshadow                                 5
394 #define   Wpointer_sign                           6
395 #define   Wsign_compare                           7
396 #define   Wunknown_pragmas              8
397 #define   Wunreachable_code             9
398 #define   Wdeprecated_declarations      10
399 #define   Wattributes                             11
400 
401 void warner(int type, ...);
402 int Wset(char *, int, int);
403 void Wflags(char *);
404 TWORD deunsign(TWORD t);
405 TWORD enunsign(TWORD t);
406 #endif
407