1 /*
2  * Copyright (C) 2002-2009, Parrot Foundation.
3  */
4 
5 #ifndef PARROT_IMCC_SYMREG_H_GUARD
6 #define PARROT_IMCC_SYMREG_H_GUARD
7 
8 /* types */
9 
10 #define VARTYPE_BIT(n) ((UINTVAL)1 << (n))
11 enum VARTYPE {              /* variable type can be */
12     VTCONST         = VARTYPE_BIT(0),   /* constant */
13     VTREG           = VARTYPE_BIT(1),   /* register */
14     VTIDENTIFIER    = VARTYPE_BIT(2),   /* identifier */
15     VTADDRESS       = VARTYPE_BIT(3),   /* address */
16     VTREGKEY        = VARTYPE_BIT(4),   /* parrot [key;key..]), including registers */
17     VTPASM          = VARTYPE_BIT(5),   /* parrot register), colored from .emit */
18     VT_CONSTP       = VARTYPE_BIT(6),   /* pointer to constant value */
19     VT_PCC_SUB      = VARTYPE_BIT(7),   /* PCC subroutine call */
20     VT_FLAT         = VARTYPE_BIT(8),   /* var :flat */
21     VT_OPTIONAL     = VARTYPE_BIT(9),   /* var :optional */
22     /* include/parrot/packfile.h */
23     VT_ENCODED      = VARTYPE_BIT(16),  /* unicode string constant */
24     VT_OPT_FLAG     = VARTYPE_BIT(17),  /* var :opt_flag */
25     VT_NAMED        = VARTYPE_BIT(18),  /* var :named(name) */
26     VT_CALL_SIG     = VARTYPE_BIT(19)
27 };
28 #undef VARTYPE_BIT
29 
30 /* this VARTYPE needs register allocation and such */
31 #define VTREGISTER (VTREG | VTIDENTIFIER | VTREGKEY | VTPASM)
32 #define REG_NEEDS_ALLOC(r) ((r)->type & VTREGISTER)
33 
34 enum USAGE {
35     U_KEYED          = 1 << 0,       /* array, hash, keyed */
36     U_NEW            = 1 << 1,       /* PMC was inited */
37     U_GLOBAL         = 1 << 3,       /* symbol is global (fixup) */
38     U_LEXICAL        = 1 << 4,       /* symbol is lexical */
39     U_FIXUP          = 1 << 5,       /* maybe not global, force fixup */
40     U_SUBID_LOOKUP   = 1 << 6,       /* .const 'Sub' lookup is done by subid */
41     U_LEXINFO_LOOKUP = 1 << 7        /* .const 'LexInfo' lookup is done by subid */
42 };
43 
44 typedef struct _SymReg {
45     char                *name;
46     struct _SymReg      *subid;
47     struct _SymReg      *nextkey;       /* keys */
48     struct _SymReg      *reg;           /* key->register for VTREGKEYs */
49     struct pcc_sub_t    *pcc_sub;       /* PCC subroutine */
50     struct _SymReg      *used;          /* used register in invoke */
51     struct _SymReg      *next;          /* used in the symbols hash */
52     struct _Instruction *first_ins;     /* first and last instruction */
53     struct _Instruction *last_ins;      /* this symbol is in */
54     INTVAL               type;          /* Variable type */
55     INTVAL               usage;         /* s. USAGE above */
56     int                  set;           /* parent register set/file */
57     int                  want_regno;    /* wanted register number */
58     INTVAL               color;         /* Color: parrot register number
59                                          * and const table index of VTCONST */
60     int                  offset;        /* used for label fixup */
61     int                  use_count;     /* How often this symbol is used */
62     int                  lhs_use_count; /* Frequency of writing to this symbol*/
63     int                  pmc_type;      /* class enum */
64 } SymReg;
65 
66 typedef struct _SymHash {
67     SymReg     **data;
68     unsigned int size;
69     unsigned int entries;
70 } SymHash;
71 
72 /* namespaces */
73 
74 typedef struct ident_t Identifier;
75 struct ident_t {
76     char       *name;
77     Identifier *next;
78 };
79 
80 typedef struct namespace_t Namespace;
81 struct namespace_t {
82     Namespace  *parent;
83     char       *name;
84     Identifier *idents;
85 };
86 
87 typedef enum {
88     P_NONE           = 0x00,                  /* 0<<0 */
89     P_NEED_LEX       = 0x01,                  /* 1<<0 */
90     P_VTABLE         = SUB_COMP_FLAG_VTABLE,  /* 1<<1 0x2 */
91     P_METHOD         = SUB_COMP_FLAG_METHOD,  /* 1<<2 0x4 */
92     P_ANON           = SUB_FLAG_PF_ANON,      /* 1<<3 0x8    - private3 */
93     P_MAIN           = SUB_FLAG_PF_MAIN,      /* 1<<4 0x10   - private4 */
94     P_LOAD           = SUB_FLAG_PF_LOAD,      /* 1<<5 0x20   - private5 */
95     P_IMMEDIATE      = SUB_FLAG_PF_IMMEDIATE, /* 1<<6 0x40   - private6 */
96     P_POSTCOMP       = SUB_FLAG_PF_POSTCOMP,  /* 1<<7 0x80   - private7 */
97     P_INIT           = SUB_COMP_FLAG_PF_INIT, /* 1<<10 0x400 - 10       */
98     P_NSENTRY        = SUB_COMP_FLAG_NSENTRY  /* 1<<11 0x800 - 11       */
99 } pragma_enum_t;
100 
101 typedef struct pcc_sub_t {
102     SymReg *sub;
103     SymReg *cc;
104     SymReg **args;
105     SymReg **multi;
106     SymReg **ret;
107     SymReg *object;
108     SymReg **flags;       /* "load", "init", etc */
109     int    *arg_flags;    /* :slurpy, :optional, ... */
110     int    *ret_flags;    /* :slurpy, :optional, ... */
111     int     nargs;
112     int     nret;
113     int     nmulti;
114     int     nflags;
115     int     yield;
116     int     tailcall;
117     int     label;
118     INTVAL  pragma;
119 } pcc_sub_t;
120 
121 enum uniq_t {
122     U_add_once,
123     U_add_uniq_label,
124     U_add_uniq_sub,
125     U_add_all
126 };
127 
128 /* functions */
129 
130 /* HEADERIZER BEGIN: compilers/imcc/symreg.c */
131 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
132 
133 PARROT_CAN_RETURN_NULL
134 PARROT_WARN_UNUSED_RESULT
135 SymReg * _find_sym(
136     ARGMOD(imc_info_t * imcc),
137     ARGIN_NULLOK(const Namespace *nspace),
138     ARGIN(const SymHash *hsh),
139     ARGIN(const char *name))
140         __attribute__nonnull__(1)
141         __attribute__nonnull__(3)
142         __attribute__nonnull__(4)
143         FUNC_MODIFIES(* imcc);
144 
145 PARROT_CAN_RETURN_NULL
146 PARROT_WARN_UNUSED_RESULT
147 SymReg * _get_sym(ARGIN(const SymHash *hsh), ARGIN(const char *name))
148         __attribute__nonnull__(1)
149         __attribute__nonnull__(2);
150 
151 PARROT_WARN_UNUSED_RESULT
152 PARROT_CANNOT_RETURN_NULL
153 SymReg * _mk_address(
154     ARGMOD(imc_info_t * imcc),
155     ARGMOD(SymHash *hsh),
156     ARGIN(const char *name),
157     int uniq)
158         __attribute__nonnull__(1)
159         __attribute__nonnull__(2)
160         __attribute__nonnull__(3)
161         FUNC_MODIFIES(* imcc)
162         FUNC_MODIFIES(*hsh);
163 
164 PARROT_WARN_UNUSED_RESULT
165 PARROT_CANNOT_RETURN_NULL
166 SymReg * _mk_const(
167     ARGMOD(imc_info_t * imcc),
168     ARGMOD(SymHash *hsh),
169     ARGIN(const char *name),
170     int t)
171         __attribute__nonnull__(1)
172         __attribute__nonnull__(2)
173         __attribute__nonnull__(3)
174         FUNC_MODIFIES(* imcc)
175         FUNC_MODIFIES(*hsh);
176 
177 void _store_symreg(
178     ARGMOD(imc_info_t * imcc),
179     ARGMOD(SymHash *hsh),
180     ARGMOD(SymReg *r))
181         __attribute__nonnull__(1)
182         __attribute__nonnull__(2)
183         __attribute__nonnull__(3)
184         FUNC_MODIFIES(* imcc)
185         FUNC_MODIFIES(*hsh)
186         FUNC_MODIFIES(*r);
187 
188 void add_namespace(ARGMOD(imc_info_t * imcc), ARGMOD(IMC_Unit *unit))
189         __attribute__nonnull__(1)
190         __attribute__nonnull__(2)
191         FUNC_MODIFIES(* imcc)
192         FUNC_MODIFIES(*unit);
193 
194 void add_pcc_arg(
195     ARGMOD(imc_info_t * imcc),
196     ARGMOD(SymReg *r),
197     ARGMOD(SymReg *arg))
198         __attribute__nonnull__(1)
199         __attribute__nonnull__(2)
200         __attribute__nonnull__(3)
201         FUNC_MODIFIES(* imcc)
202         FUNC_MODIFIES(*r)
203         FUNC_MODIFIES(*arg);
204 
205 void add_pcc_cc(ARGMOD(SymReg *r), ARGIN(SymReg *arg))
206         __attribute__nonnull__(1)
207         __attribute__nonnull__(2)
208         FUNC_MODIFIES(*r);
209 
210 void add_pcc_flag_str(
211     ARGMOD(imc_info_t * imcc),
212     ARGMOD(SymReg * r),
213     ARGIN(SymReg * arg))
214         __attribute__nonnull__(1)
215         __attribute__nonnull__(2)
216         __attribute__nonnull__(3)
217         FUNC_MODIFIES(* imcc)
218         FUNC_MODIFIES(* r);
219 
220 void add_pcc_multi(
221     ARGMOD(imc_info_t * imcc),
222     ARGMOD(SymReg *r),
223     ARGIN_NULLOK(SymReg *arg))
224         __attribute__nonnull__(1)
225         __attribute__nonnull__(2)
226         FUNC_MODIFIES(* imcc)
227         FUNC_MODIFIES(*r);
228 
229 void add_pcc_result(
230     ARGMOD(imc_info_t * imcc),
231     ARGMOD(SymReg *r),
232     ARGMOD(SymReg *arg))
233         __attribute__nonnull__(1)
234         __attribute__nonnull__(2)
235         __attribute__nonnull__(3)
236         FUNC_MODIFIES(* imcc)
237         FUNC_MODIFIES(*r)
238         FUNC_MODIFIES(*arg);
239 
240 void add_pcc_sub(ARGMOD(SymReg *r), ARGIN(SymReg *arg))
241         __attribute__nonnull__(1)
242         __attribute__nonnull__(2)
243         FUNC_MODIFIES(*r);
244 
245 void clear_globals(ARGMOD(imc_info_t * imcc))
246         __attribute__nonnull__(1)
247         FUNC_MODIFIES(* imcc);
248 
249 void clear_locals(ARGIN_NULLOK(IMC_Unit *unit));
250 void clear_sym_hash(ARGMOD(SymHash *hsh))
251         __attribute__nonnull__(1)
252         FUNC_MODIFIES(*hsh);
253 
254 void create_symhash(ARGMOD(imc_info_t * imcc), ARGOUT(SymHash *hash))
255         __attribute__nonnull__(1)
256         __attribute__nonnull__(2)
257         FUNC_MODIFIES(* imcc)
258         FUNC_MODIFIES(*hash);
259 
260 PARROT_MALLOC
261 PARROT_CANNOT_RETURN_NULL
262 SymReg * dup_sym(ARGMOD(imc_info_t * imcc), ARGIN(const SymReg *r))
263         __attribute__nonnull__(1)
264         __attribute__nonnull__(2)
265         FUNC_MODIFIES(* imcc);
266 
267 PARROT_CAN_RETURN_NULL
268 PARROT_WARN_UNUSED_RESULT
269 SymReg * find_sym(ARGMOD(imc_info_t * imcc), ARGIN(const char *name))
270         __attribute__nonnull__(1)
271         __attribute__nonnull__(2)
272         FUNC_MODIFIES(* imcc);
273 
274 void free_pcc_sub(ARGMOD(pcc_sub_t *sub))
275         __attribute__nonnull__(1)
276         FUNC_MODIFIES(*sub);
277 
278 void free_sym(ARGMOD(SymReg *r))
279         __attribute__nonnull__(1)
280         FUNC_MODIFIES(*r);
281 
282 PARROT_CAN_RETURN_NULL
283 PARROT_WARN_UNUSED_RESULT
284 SymReg * get_sym(ARGMOD(imc_info_t * imcc), ARGIN(const char *name))
285         __attribute__nonnull__(1)
286         __attribute__nonnull__(2)
287         FUNC_MODIFIES(* imcc);
288 
289 PARROT_PURE_FUNCTION
290 unsigned int hash_str(ARGIN(const char *str))
291         __attribute__nonnull__(1);
292 
293 PARROT_MALLOC
294 PARROT_CANNOT_RETURN_NULL
295 SymReg * link_keys(
296     ARGMOD(imc_info_t * imcc),
297     int nargs,
298     ARGMOD(SymReg **keys),
299     int force)
300         __attribute__nonnull__(1)
301         __attribute__nonnull__(3)
302         FUNC_MODIFIES(* imcc)
303         FUNC_MODIFIES(*keys);
304 
305 PARROT_WARN_UNUSED_RESULT
306 PARROT_CANNOT_RETURN_NULL
307 SymReg * mk_const(ARGMOD(imc_info_t * imcc), ARGIN(const char *name), int t)
308         __attribute__nonnull__(1)
309         __attribute__nonnull__(2)
310         FUNC_MODIFIES(* imcc);
311 
312 PARROT_CANNOT_RETURN_NULL
313 PARROT_IGNORABLE_RESULT
314 SymReg * mk_const_ident(
315     ARGMOD(imc_info_t * imcc),
316     ARGIN(const char *name),
317     int t,
318     ARGMOD(SymReg *val),
319     int global)
320         __attribute__nonnull__(1)
321         __attribute__nonnull__(2)
322         __attribute__nonnull__(4)
323         FUNC_MODIFIES(* imcc)
324         FUNC_MODIFIES(*val);
325 
326 PARROT_CANNOT_RETURN_NULL
327 PARROT_IGNORABLE_RESULT
328 SymReg * mk_ident(
329     ARGMOD(imc_info_t * imcc),
330     ARGIN(const char *name),
331     int t,
332     INTVAL type)
333         __attribute__nonnull__(1)
334         __attribute__nonnull__(2)
335         FUNC_MODIFIES(* imcc);
336 
337 PARROT_WARN_UNUSED_RESULT
338 PARROT_CANNOT_RETURN_NULL
339 SymReg * mk_label_address(
340     ARGMOD(imc_info_t * imcc),
341     ARGIN(const char *name))
342         __attribute__nonnull__(1)
343         __attribute__nonnull__(2)
344         FUNC_MODIFIES(* imcc);
345 
346 PARROT_WARN_UNUSED_RESULT
347 PARROT_CANNOT_RETURN_NULL
348 SymReg * mk_local_label(ARGMOD(imc_info_t * imcc), ARGIN(const char *name))
349         __attribute__nonnull__(1)
350         __attribute__nonnull__(2)
351         FUNC_MODIFIES(* imcc);
352 
353 PARROT_WARN_UNUSED_RESULT
354 PARROT_CANNOT_RETURN_NULL
355 SymReg * mk_pasm_reg(ARGMOD(imc_info_t * imcc), ARGIN(const char *name))
356         __attribute__nonnull__(1)
357         __attribute__nonnull__(2)
358         FUNC_MODIFIES(* imcc);
359 
360 PARROT_WARN_UNUSED_RESULT
361 PARROT_CANNOT_RETURN_NULL
362 SymReg * mk_pcc_sub(
363     ARGMOD(imc_info_t * imcc),
364     ARGIN(const char *name),
365     int proto)
366         __attribute__nonnull__(1)
367         __attribute__nonnull__(2)
368         FUNC_MODIFIES(* imcc);
369 
370 PARROT_WARN_UNUSED_RESULT
371 PARROT_CANNOT_RETURN_NULL
372 SymReg * mk_sub_address(ARGMOD(imc_info_t * imcc), ARGIN(const char *name))
373         __attribute__nonnull__(1)
374         __attribute__nonnull__(2)
375         FUNC_MODIFIES(* imcc);
376 
377 PARROT_WARN_UNUSED_RESULT
378 PARROT_CANNOT_RETURN_NULL
379 SymReg * mk_sub_label(ARGMOD(imc_info_t * imcc), ARGIN(const char *name))
380         __attribute__nonnull__(1)
381         __attribute__nonnull__(2)
382         FUNC_MODIFIES(* imcc);
383 
384 PARROT_WARN_UNUSED_RESULT
385 PARROT_CANNOT_RETURN_NULL
386 SymReg * mk_symreg(
387     ARGMOD(imc_info_t * imcc),
388     ARGIN(const char *name),
389     int t)
390         __attribute__nonnull__(1)
391         __attribute__nonnull__(2)
392         FUNC_MODIFIES(* imcc);
393 
394 PARROT_WARN_UNUSED_RESULT
395 PARROT_CANNOT_RETURN_NULL
396 SymReg * mk_temp_reg(ARGMOD(imc_info_t * imcc), int t)
397         __attribute__nonnull__(1)
398         FUNC_MODIFIES(* imcc);
399 
400 void store_symreg(ARGMOD(imc_info_t * imcc), ARGMOD(SymReg *r))
401         __attribute__nonnull__(1)
402         __attribute__nonnull__(2)
403         FUNC_MODIFIES(* imcc)
404         FUNC_MODIFIES(*r);
405 
406 PARROT_MALLOC
407 PARROT_WARN_UNUSED_RESULT
408 PARROT_CANNOT_RETURN_NULL
409 char * symreg_to_str(ARGIN(const SymReg *s))
410         __attribute__nonnull__(1);
411 
412 #define ASSERT_ARGS__find_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
413        PARROT_ASSERT_ARG(imcc) \
414     , PARROT_ASSERT_ARG(hsh) \
415     , PARROT_ASSERT_ARG(name))
416 #define ASSERT_ARGS__get_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
417        PARROT_ASSERT_ARG(hsh) \
418     , PARROT_ASSERT_ARG(name))
419 #define ASSERT_ARGS__mk_address __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
420        PARROT_ASSERT_ARG(imcc) \
421     , PARROT_ASSERT_ARG(hsh) \
422     , PARROT_ASSERT_ARG(name))
423 #define ASSERT_ARGS__mk_const __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
424        PARROT_ASSERT_ARG(imcc) \
425     , PARROT_ASSERT_ARG(hsh) \
426     , PARROT_ASSERT_ARG(name))
427 #define ASSERT_ARGS__store_symreg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
428        PARROT_ASSERT_ARG(imcc) \
429     , PARROT_ASSERT_ARG(hsh) \
430     , PARROT_ASSERT_ARG(r))
431 #define ASSERT_ARGS_add_namespace __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
432        PARROT_ASSERT_ARG(imcc) \
433     , PARROT_ASSERT_ARG(unit))
434 #define ASSERT_ARGS_add_pcc_arg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
435        PARROT_ASSERT_ARG(imcc) \
436     , PARROT_ASSERT_ARG(r) \
437     , PARROT_ASSERT_ARG(arg))
438 #define ASSERT_ARGS_add_pcc_cc __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
439        PARROT_ASSERT_ARG(r) \
440     , PARROT_ASSERT_ARG(arg))
441 #define ASSERT_ARGS_add_pcc_flag_str __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
442        PARROT_ASSERT_ARG(imcc) \
443     , PARROT_ASSERT_ARG(r) \
444     , PARROT_ASSERT_ARG(arg))
445 #define ASSERT_ARGS_add_pcc_multi __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
446        PARROT_ASSERT_ARG(imcc) \
447     , PARROT_ASSERT_ARG(r))
448 #define ASSERT_ARGS_add_pcc_result __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
449        PARROT_ASSERT_ARG(imcc) \
450     , PARROT_ASSERT_ARG(r) \
451     , PARROT_ASSERT_ARG(arg))
452 #define ASSERT_ARGS_add_pcc_sub __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
453        PARROT_ASSERT_ARG(r) \
454     , PARROT_ASSERT_ARG(arg))
455 #define ASSERT_ARGS_clear_globals __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
456        PARROT_ASSERT_ARG(imcc))
457 #define ASSERT_ARGS_clear_locals __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
458 #define ASSERT_ARGS_clear_sym_hash __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
459        PARROT_ASSERT_ARG(hsh))
460 #define ASSERT_ARGS_create_symhash __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
461        PARROT_ASSERT_ARG(imcc) \
462     , PARROT_ASSERT_ARG(hash))
463 #define ASSERT_ARGS_dup_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
464        PARROT_ASSERT_ARG(imcc) \
465     , PARROT_ASSERT_ARG(r))
466 #define ASSERT_ARGS_find_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
467        PARROT_ASSERT_ARG(imcc) \
468     , PARROT_ASSERT_ARG(name))
469 #define ASSERT_ARGS_free_pcc_sub __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
470        PARROT_ASSERT_ARG(sub))
471 #define ASSERT_ARGS_free_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
472        PARROT_ASSERT_ARG(r))
473 #define ASSERT_ARGS_get_sym __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
474        PARROT_ASSERT_ARG(imcc) \
475     , PARROT_ASSERT_ARG(name))
476 #define ASSERT_ARGS_hash_str __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
477        PARROT_ASSERT_ARG(str))
478 #define ASSERT_ARGS_link_keys __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
479        PARROT_ASSERT_ARG(imcc) \
480     , PARROT_ASSERT_ARG(keys))
481 #define ASSERT_ARGS_mk_const __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
482        PARROT_ASSERT_ARG(imcc) \
483     , PARROT_ASSERT_ARG(name))
484 #define ASSERT_ARGS_mk_const_ident __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
485        PARROT_ASSERT_ARG(imcc) \
486     , PARROT_ASSERT_ARG(name) \
487     , PARROT_ASSERT_ARG(val))
488 #define ASSERT_ARGS_mk_ident __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
489        PARROT_ASSERT_ARG(imcc) \
490     , PARROT_ASSERT_ARG(name))
491 #define ASSERT_ARGS_mk_label_address __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
492        PARROT_ASSERT_ARG(imcc) \
493     , PARROT_ASSERT_ARG(name))
494 #define ASSERT_ARGS_mk_local_label __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
495        PARROT_ASSERT_ARG(imcc) \
496     , PARROT_ASSERT_ARG(name))
497 #define ASSERT_ARGS_mk_pasm_reg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
498        PARROT_ASSERT_ARG(imcc) \
499     , PARROT_ASSERT_ARG(name))
500 #define ASSERT_ARGS_mk_pcc_sub __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
501        PARROT_ASSERT_ARG(imcc) \
502     , PARROT_ASSERT_ARG(name))
503 #define ASSERT_ARGS_mk_sub_address __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
504        PARROT_ASSERT_ARG(imcc) \
505     , PARROT_ASSERT_ARG(name))
506 #define ASSERT_ARGS_mk_sub_label __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
507        PARROT_ASSERT_ARG(imcc) \
508     , PARROT_ASSERT_ARG(name))
509 #define ASSERT_ARGS_mk_symreg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
510        PARROT_ASSERT_ARG(imcc) \
511     , PARROT_ASSERT_ARG(name))
512 #define ASSERT_ARGS_mk_temp_reg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
513        PARROT_ASSERT_ARG(imcc))
514 #define ASSERT_ARGS_store_symreg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
515        PARROT_ASSERT_ARG(imcc) \
516     , PARROT_ASSERT_ARG(r))
517 #define ASSERT_ARGS_symreg_to_str __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
518        PARROT_ASSERT_ARG(s))
519 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
520 /* HEADERIZER END: compilers/imcc/symreg.c */
521 
522 #endif /* PARROT_IMCC_SYMREG_H_GUARD */
523 
524 /*
525  * Local variables:
526  *   c-file-style: "parrot"
527  * End:
528  * vim: expandtab shiftwidth=4 cinoptions='\:2=2' :
529  */
530