1 /* Process source files and output type information.
2 Copyright (C) 2002 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
26 /* Nonzero iff an error has occurred. */
27 static int hit_error
= 0;
29 static void gen_rtx_next
PARAMS ((void));
30 static void write_rtx_next
PARAMS ((void));
31 static void open_base_files
PARAMS ((void));
32 static void close_output_files
PARAMS ((void));
34 /* Report an error at POS, printing MSG. */
37 error_at_line
VPARAMS ((struct fileloc
*pos
, const char *msg
, ...))
40 VA_FIXEDARG (ap
, struct fileloc
*, pos
);
41 VA_FIXEDARG (ap
, const char *, msg
);
43 fprintf (stderr
, "%s:%d: ", pos
->file
, pos
->line
);
44 vfprintf (stderr
, msg
, ap
);
51 /* vasprintf, but produces fatal message on out-of-memory. */
53 xvasprintf (result
, format
, args
)
58 int ret
= vasprintf (result
, format
, args
);
59 if (*result
== NULL
|| ret
< 0)
61 fputs ("gengtype: out of memory", stderr
);
67 /* Wrapper for xvasprintf. */
69 xasprintf
VPARAMS ((const char *format
, ...))
73 VA_FIXEDARG (ap
, const char *, format
);
74 xvasprintf (&result
, format
, ap
);
79 /* The one and only TYPE_STRING. */
81 struct type string_type
= {
82 TYPE_STRING
, NULL
, NULL
, GC_USED
86 /* Lists of various things. */
88 static pair_p typedefs
;
89 static type_p structures
;
90 static type_p param_structs
;
91 static pair_p variables
;
93 static void do_scalar_typedef
PARAMS ((const char *, struct fileloc
*));
94 static type_p find_param_structure
95 PARAMS ((type_p t
, type_p param
[NUM_PARAM
]));
96 static type_p adjust_field_tree_exp
PARAMS ((type_p t
, options_p opt
));
97 static type_p adjust_field_rtx_def
PARAMS ((type_p t
, options_p opt
));
99 /* Define S as a typedef to T at POS. */
102 do_typedef (s
, t
, pos
)
109 for (p
= typedefs
; p
!= NULL
; p
= p
->next
)
110 if (strcmp (p
->name
, s
) == 0)
114 error_at_line (pos
, "type `%s' previously defined", s
);
115 error_at_line (&p
->line
, "previously defined here");
120 p
= xmalloc (sizeof (struct pair
));
128 /* Define S as a typename of a scalar. */
131 do_scalar_typedef (s
, pos
)
135 do_typedef (s
, create_scalar_type (s
, strlen (s
)), pos
);
138 /* Return the type previously defined for S. Use POS to report errors. */
141 resolve_typedef (s
, pos
)
146 for (p
= typedefs
; p
!= NULL
; p
= p
->next
)
147 if (strcmp (p
->name
, s
) == 0)
149 error_at_line (pos
, "unidentified type `%s'", s
);
150 return create_scalar_type ("char", 4);
153 /* Create a new structure with tag NAME (or a union iff ISUNION is nonzero),
154 at POS with fields FIELDS and options O. */
157 new_structure (name
, isunion
, pos
, fields
, o
)
166 lang_bitmap bitmap
= get_base_file_bitmap (pos
->file
);
168 for (si
= structures
; si
!= NULL
; si
= si
->next
)
169 if (strcmp (name
, si
->u
.s
.tag
) == 0
170 && UNION_P (si
) == isunion
)
173 if (si
->kind
== TYPE_LANG_STRUCT
)
177 for (si
= ls
->u
.s
.lang_struct
; si
!= NULL
; si
= si
->next
)
178 if (si
->u
.s
.bitmap
== bitmap
)
181 else if (si
->u
.s
.line
.file
!= NULL
&& si
->u
.s
.bitmap
!= bitmap
)
184 si
= xcalloc (1, sizeof (struct type
));
185 memcpy (si
, ls
, sizeof (struct type
));
186 ls
->kind
= TYPE_LANG_STRUCT
;
187 ls
->u
.s
.lang_struct
= si
;
188 ls
->u
.s
.fields
= NULL
;
190 si
->pointer_to
= NULL
;
191 si
->u
.s
.lang_struct
= ls
;
196 if (ls
!= NULL
&& s
== NULL
)
198 s
= xcalloc (1, sizeof (struct type
));
199 s
->next
= ls
->u
.s
.lang_struct
;
200 ls
->u
.s
.lang_struct
= s
;
201 s
->u
.s
.lang_struct
= ls
;
208 s
= xcalloc (1, sizeof (struct type
));
209 s
->next
= structures
;
213 if (s
->u
.s
.line
.file
!= NULL
214 || (s
->u
.s
.lang_struct
&& (s
->u
.s
.lang_struct
->u
.s
.bitmap
& bitmap
)))
216 error_at_line (pos
, "duplicate structure definition");
217 error_at_line (&s
->u
.s
.line
, "previous definition here");
220 s
->kind
= isunion
? TYPE_UNION
: TYPE_STRUCT
;
223 s
->u
.s
.fields
= fields
;
225 s
->u
.s
.bitmap
= bitmap
;
226 if (s
->u
.s
.lang_struct
)
227 s
->u
.s
.lang_struct
->u
.s
.bitmap
|= bitmap
;
230 /* Return the previously-defined structure with tag NAME (or a union
231 iff ISUNION is nonzero), or a new empty structure or union if none
232 was defined previously. */
235 find_structure (name
, isunion
)
241 for (s
= structures
; s
!= NULL
; s
= s
->next
)
242 if (strcmp (name
, s
->u
.s
.tag
) == 0
243 && UNION_P (s
) == isunion
)
246 s
= xcalloc (1, sizeof (struct type
));
247 s
->next
= structures
;
249 s
->kind
= isunion
? TYPE_UNION
: TYPE_STRUCT
;
255 /* Return the previously-defined parameterised structure for structure
256 T and parameters PARAM, or a new parameterised empty structure or
257 union if none was defined previously. */
260 find_param_structure (t
, param
)
262 type_p param
[NUM_PARAM
];
266 for (res
= param_structs
; res
; res
= res
->next
)
267 if (res
->u
.param_struct
.stru
== t
268 && memcmp (res
->u
.param_struct
.param
, param
,
269 sizeof (type_p
) * NUM_PARAM
) == 0)
273 res
= xcalloc (1, sizeof (*res
));
274 res
->kind
= TYPE_PARAM_STRUCT
;
275 res
->next
= param_structs
;
277 res
->u
.param_struct
.stru
= t
;
278 memcpy (res
->u
.param_struct
.param
, param
, sizeof (type_p
) * NUM_PARAM
);
283 /* Return a scalar type with name NAME. */
286 create_scalar_type (name
, name_len
)
290 type_p r
= xcalloc (1, sizeof (struct type
));
291 r
->kind
= TYPE_SCALAR
;
292 r
->u
.sc
= xmemdup (name
, name_len
, name_len
+ 1);
296 /* Return a pointer to T. */
304 type_p r
= xcalloc (1, sizeof (struct type
));
305 r
->kind
= TYPE_POINTER
;
309 return t
->pointer_to
;
312 /* Return an array of length LEN. */
315 create_array (t
, len
)
321 v
= xcalloc (1, sizeof (*v
));
322 v
->kind
= TYPE_ARRAY
;
328 /* Add a variable named S of type T with options O defined at POS,
332 note_variable (s
, t
, o
, pos
)
339 n
= xmalloc (sizeof (*n
));
349 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
355 /* We really don't care how long a CONST_DOUBLE is. */
356 #define CONST_DOUBLE_FORMAT "ww"
357 static const char * const rtx_format
[NUM_RTX_CODE
] = {
358 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
363 static char rtx_next
[NUM_RTX_CODE
];
365 /* Generate the contents of the rtx_next array. This really doesn't belong
366 in gengtype at all, but it's needed for adjust_field_rtx_def. */
372 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
377 if (strncmp (rtx_format
[i
], "iuu", 3) == 0)
379 else if (i
== COND_EXEC
|| i
== SET
|| i
== EXPR_LIST
|| i
== INSN_LIST
)
382 for (k
= strlen (rtx_format
[i
]) - 1; k
>= 0; k
--)
383 if (rtx_format
[i
][k
] == 'e' || rtx_format
[i
][k
] == 'u')
388 /* Write out the contents of the rtx_next array. */
392 outf_p f
= get_output_file_with_visibility (NULL
);
395 oprintf (f
, "\n/* Used to implement the RTX_NEXT macro. */\n");
396 oprintf (f
, "const unsigned char rtx_next[NUM_RTX_CODE] = {\n");
397 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
398 if (rtx_next
[i
] == -1)
399 oprintf (f
, " 0,\n");
402 " offsetof (struct rtx_def, fld) + %d * sizeof (rtunion),\n",
407 /* Handle `special("rtx_def")'. This is a special case for field
408 `fld' of struct rtx_def, which is an array of unions whose values
409 are based in a complex way on the type of RTL. */
412 adjust_field_rtx_def (t
, opt
)
414 options_p opt ATTRIBUTE_UNUSED
;
419 type_p rtx_tp
, rtvec_tp
, tree_tp
, mem_attrs_tp
, note_union_tp
, scalar_tp
;
420 type_p bitmap_tp
, basic_block_tp
;
422 static const char * const rtx_name
[NUM_RTX_CODE
] = {
423 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
428 if (t
->kind
!= TYPE_ARRAY
)
430 error_at_line (&lexer_line
,
431 "special `rtx_def' must be applied to an array");
435 nodot
= xmalloc (sizeof (*nodot
));
440 rtx_tp
= create_pointer (find_structure ("rtx_def", 0));
441 rtvec_tp
= create_pointer (find_structure ("rtvec_def", 0));
442 tree_tp
= create_pointer (find_structure ("tree_node", 1));
443 mem_attrs_tp
= create_pointer (find_structure ("mem_attrs", 0));
444 bitmap_tp
= create_pointer (find_structure ("bitmap_element_def", 0));
445 basic_block_tp
= create_pointer (find_structure ("basic_block_def", 0));
446 scalar_tp
= create_scalar_type ("rtunion scalar", 14);
449 pair_p note_flds
= NULL
;
452 for (c
= 0; c
< 3; c
++)
454 pair_p old_note_flds
= note_flds
;
456 note_flds
= xmalloc (sizeof (*note_flds
));
457 note_flds
->line
.file
= __FILE__
;
458 note_flds
->line
.line
= __LINE__
;
459 note_flds
->name
= "rttree";
460 note_flds
->type
= tree_tp
;
461 note_flds
->opt
= xmalloc (sizeof (*note_flds
->opt
));
462 note_flds
->opt
->next
= nodot
;
463 note_flds
->opt
->name
= "tag";
464 note_flds
->next
= old_note_flds
;
467 note_flds
->type
= rtx_tp
;
468 note_flds
->name
= "rtx";
469 note_flds
->opt
->info
= "NOTE_INSN_EXPECTED_VALUE";
470 note_flds
->next
->opt
->info
= "NOTE_INSN_BLOCK_BEG";
471 note_flds
->next
->next
->opt
->info
= "NOTE_INSN_BLOCK_END";
473 new_structure ("rtx_def_note_subunion", 1, &lexer_line
, note_flds
, NULL
);
476 note_union_tp
= find_structure ("rtx_def_note_subunion", 1);
478 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
480 pair_p old_flds
= flds
;
481 pair_p subfields
= NULL
;
482 size_t aindex
, nmindex
;
486 for (aindex
= 0; aindex
< strlen (rtx_format
[i
]); aindex
++)
488 pair_p old_subf
= subfields
;
492 switch (rtx_format
[i
][aindex
])
503 if (i
== MEM
&& aindex
== 1)
504 t
= mem_attrs_tp
, subname
= "rtmem";
505 else if (i
== JUMP_INSN
&& aindex
== 9)
506 t
= rtx_tp
, subname
= "rtx";
507 else if (i
== CODE_LABEL
&& aindex
== 4)
508 t
= scalar_tp
, subname
= "rtint";
509 else if (i
== CODE_LABEL
&& aindex
== 5)
510 t
= rtx_tp
, subname
= "rtx";
511 else if (i
== LABEL_REF
512 && (aindex
== 1 || aindex
== 2))
513 t
= rtx_tp
, subname
= "rtx";
514 else if (i
== NOTE
&& aindex
== 4)
515 t
= note_union_tp
, subname
= "";
516 else if (i
== NOTE
&& aindex
>= 7)
517 t
= scalar_tp
, subname
= "rtint";
518 else if (i
== ADDR_DIFF_VEC
&& aindex
== 4)
519 t
= scalar_tp
, subname
= "rtint";
520 else if (i
== VALUE
&& aindex
== 0)
521 t
= scalar_tp
, subname
= "rtint";
522 else if (i
== REG
&& aindex
== 1)
523 t
= scalar_tp
, subname
= "rtint";
524 else if (i
== SCRATCH
&& aindex
== 0)
525 t
= scalar_tp
, subname
= "rtint";
526 else if (i
== BARRIER
&& aindex
>= 3)
527 t
= scalar_tp
, subname
= "rtint";
530 error_at_line (&lexer_line
,
531 "rtx type `%s' has `0' in position %d, can't handle",
532 rtx_name
[i
], aindex
);
573 error_at_line (&lexer_line
,
574 "rtx type `%s' has `%c' in position %d, can't handle",
575 rtx_name
[i
], rtx_format
[i
][aindex
],
582 subfields
= xmalloc (sizeof (*subfields
));
583 subfields
->next
= old_subf
;
585 subfields
->name
= xasprintf ("[%d].%s", aindex
, subname
);
586 subfields
->line
.file
= __FILE__
;
587 subfields
->line
.line
= __LINE__
;
588 if (t
== note_union_tp
)
590 subfields
->opt
= xmalloc (sizeof (*subfields
->opt
));
591 subfields
->opt
->next
= nodot
;
592 subfields
->opt
->name
= "desc";
593 subfields
->opt
->info
= "NOTE_LINE_NUMBER (&%0)";
595 else if (t
== basic_block_tp
)
597 /* We don't presently GC basic block structures... */
598 subfields
->opt
= xmalloc (sizeof (*subfields
->opt
));
599 subfields
->opt
->next
= nodot
;
600 subfields
->opt
->name
= "skip";
601 subfields
->opt
->info
= NULL
;
603 else if ((size_t) rtx_next
[i
] == aindex
)
605 /* The 'next' field will be marked by the chain_next option. */
606 subfields
->opt
= xmalloc (sizeof (*subfields
->opt
));
607 subfields
->opt
->next
= nodot
;
608 subfields
->opt
->name
= "skip";
609 subfields
->opt
->info
= NULL
;
612 subfields
->opt
= nodot
;
615 flds
= xmalloc (sizeof (*flds
));
616 flds
->next
= old_flds
;
618 sname
= xasprintf ("rtx_def_%s", rtx_name
[i
]);
619 new_structure (sname
, 0, &lexer_line
, subfields
, NULL
);
620 flds
->type
= find_structure (sname
, 0);
621 flds
->line
.file
= __FILE__
;
622 flds
->line
.line
= __LINE__
;
623 flds
->opt
= xmalloc (sizeof (*flds
->opt
));
624 flds
->opt
->next
= nodot
;
625 flds
->opt
->name
= "tag";
626 ftag
= xstrdup (rtx_name
[i
]);
627 for (nmindex
= 0; nmindex
< strlen (ftag
); nmindex
++)
628 ftag
[nmindex
] = TOUPPER (ftag
[nmindex
]);
629 flds
->opt
->info
= ftag
;
632 new_structure ("rtx_def_subunion", 1, &lexer_line
, flds
, nodot
);
633 return find_structure ("rtx_def_subunion", 1);
636 /* Handle `special("tree_exp")'. This is a special case for
637 field `operands' of struct tree_exp, which although it claims to contain
638 pointers to trees, actually sometimes contains pointers to RTL too.
639 Passed T, the old type of the field, and OPT its options. Returns
640 a new type for the field. */
643 adjust_field_tree_exp (t
, opt
)
645 options_p opt ATTRIBUTE_UNUSED
;
650 static const struct {
655 { "SAVE_EXPR", 2, 1 },
656 { "GOTO_SUBROUTINE_EXPR", 0, 2 },
657 { "RTL_EXPR", 0, 2 },
658 { "WITH_CLEANUP_EXPR", 2, 1 },
659 { "METHOD_CALL_EXPR", 3, 1 }
662 if (t
->kind
!= TYPE_ARRAY
)
664 error_at_line (&lexer_line
,
665 "special `tree_exp' must be applied to an array");
669 nodot
= xmalloc (sizeof (*nodot
));
674 flds
= xmalloc (sizeof (*flds
));
678 flds
->line
.file
= __FILE__
;
679 flds
->line
.line
= __LINE__
;
680 flds
->opt
= xmalloc (sizeof (*flds
->opt
));
681 flds
->opt
->next
= nodot
;
682 flds
->opt
->name
= "length";
683 flds
->opt
->info
= "TREE_CODE_LENGTH (TREE_CODE ((tree) &%0))";
685 options_p oldopt
= flds
->opt
;
686 flds
->opt
= xmalloc (sizeof (*flds
->opt
));
687 flds
->opt
->next
= oldopt
;
688 flds
->opt
->name
= "default";
689 flds
->opt
->info
= "";
692 for (i
= 0; i
< ARRAY_SIZE (data
); i
++)
694 pair_p old_flds
= flds
;
695 pair_p subfields
= NULL
;
700 r_index
< data
[i
].first_rtl
+ data
[i
].num_rtl
;
703 pair_p old_subf
= subfields
;
704 subfields
= xmalloc (sizeof (*subfields
));
705 subfields
->next
= old_subf
;
706 subfields
->name
= xasprintf ("[%d]", r_index
);
707 if (r_index
< data
[i
].first_rtl
)
708 subfields
->type
= t
->u
.a
.p
;
710 subfields
->type
= create_pointer (find_structure ("rtx_def", 0));
711 subfields
->line
.file
= __FILE__
;
712 subfields
->line
.line
= __LINE__
;
713 subfields
->opt
= nodot
;
716 flds
= xmalloc (sizeof (*flds
));
717 flds
->next
= old_flds
;
719 sname
= xasprintf ("tree_exp_%s", data
[i
].name
);
720 new_structure (sname
, 0, &lexer_line
, subfields
, NULL
);
721 flds
->type
= find_structure (sname
, 0);
722 flds
->line
.file
= __FILE__
;
723 flds
->line
.line
= __LINE__
;
724 flds
->opt
= xmalloc (sizeof (*flds
->opt
));
725 flds
->opt
->next
= nodot
;
726 flds
->opt
->name
= "tag";
727 flds
->opt
->info
= data
[i
].name
;
730 new_structure ("tree_exp_subunion", 1, &lexer_line
, flds
, nodot
);
731 return find_structure ("tree_exp_subunion", 1);
734 /* Perform any special processing on a type T, about to become the type
735 of a field. Return the appropriate type for the field.
737 - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
738 - Similarly for arrays of pointer-to-char;
739 - Converts structures for which a parameter is provided to
741 - Handles "special" options.
745 adjust_field_type (t
, opt
)
750 const int pointer_p
= t
->kind
== TYPE_POINTER
;
751 type_p params
[NUM_PARAM
];
755 for (i
= 0; i
< NUM_PARAM
; i
++)
758 for (; opt
; opt
= opt
->next
)
759 if (strcmp (opt
->name
, "length") == 0)
761 else if (strcmp (opt
->name
, "param_is") == 0
762 || (strncmp (opt
->name
, "param", 5) == 0
763 && ISDIGIT (opt
->name
[5])
764 && strcmp (opt
->name
+ 6, "_is") == 0))
766 int num
= ISDIGIT (opt
->name
[5]) ? opt
->name
[5] - '0' : 0;
768 if (! UNION_OR_STRUCT_P (t
)
769 && (t
->kind
!= TYPE_POINTER
|| ! UNION_OR_STRUCT_P (t
->u
.p
)))
771 error_at_line (&lexer_line
,
772 "option `%s' may only be applied to structures or structure pointers",
778 if (params
[num
] != NULL
)
779 error_at_line (&lexer_line
, "duplicate `%s' option", opt
->name
);
780 if (! ISDIGIT (opt
->name
[5]))
781 params
[num
] = create_pointer ((type_p
) opt
->info
);
783 params
[num
] = (type_p
) opt
->info
;
785 else if (strcmp (opt
->name
, "special") == 0)
787 const char *special_name
= (const char *)opt
->info
;
788 if (strcmp (special_name
, "tree_exp") == 0)
789 t
= adjust_field_tree_exp (t
, opt
);
790 else if (strcmp (special_name
, "rtx_def") == 0)
791 t
= adjust_field_rtx_def (t
, opt
);
793 error_at_line (&lexer_line
, "unknown special `%s'", special_name
);
802 realt
= find_param_structure (t
, params
);
803 t
= pointer_p
? create_pointer (realt
) : realt
;
808 && t
->u
.p
->kind
== TYPE_SCALAR
809 && (strcmp (t
->u
.p
->u
.sc
, "char") == 0
810 || strcmp (t
->u
.p
->u
.sc
, "unsigned char") == 0))
812 if (t
->kind
== TYPE_ARRAY
&& t
->u
.a
.p
->kind
== TYPE_POINTER
813 && t
->u
.a
.p
->u
.p
->kind
== TYPE_SCALAR
814 && (strcmp (t
->u
.a
.p
->u
.p
->u
.sc
, "char") == 0
815 || strcmp (t
->u
.a
.p
->u
.p
->u
.sc
, "unsigned char") == 0))
816 return create_array (&string_type
, t
->u
.a
.len
);
821 /* Create a union for YYSTYPE, as yacc would do it, given a fieldlist FIELDS
822 and information about the correspondance between token types and fields
823 in TYPEINFO. POS is used for error messages. */
826 note_yacc_type (o
, fields
, typeinfo
, pos
)
835 for (p
= typeinfo
; p
; p
= p
->next
)
842 if (p
->type
== (type_p
) 1)
847 for (pp
= typeinfo
; pp
; pp
= pp
->next
)
848 if (pp
->type
!= (type_p
) 1
849 && strcmp (pp
->opt
->info
, p
->opt
->info
) == 0)
858 for (m
= fields
; m
; m
= m
->next
)
859 if (strcmp (m
->name
, p
->name
) == 0)
863 error_at_line (&p
->line
,
864 "couldn't match fieldname `%s'", p
->name
);
875 || p
->type
== (type_p
) 1)
881 new_structure ("yy_union", 1, pos
, typeinfo
, o
);
882 do_typedef ("YYSTYPE", find_structure ("yy_union", 1), pos
);
885 static void process_gc_options
PARAMS ((options_p
, enum gc_used_enum
,
886 int *, int *, int *));
887 static void set_gc_used_type
PARAMS ((type_p
, enum gc_used_enum
, type_p
*));
888 static void set_gc_used
PARAMS ((pair_p
));
890 /* Handle OPT for set_gc_used_type. */
893 process_gc_options (opt
, level
, maybe_undef
, pass_param
, length
)
895 enum gc_used_enum level
;
901 for (o
= opt
; o
; o
= o
->next
)
902 if (strcmp (o
->name
, "ptr_alias") == 0 && level
== GC_POINTED_TO
)
903 set_gc_used_type ((type_p
) o
->info
, GC_POINTED_TO
, NULL
);
904 else if (strcmp (o
->name
, "maybe_undef") == 0)
906 else if (strcmp (o
->name
, "use_params") == 0)
908 else if (strcmp (o
->name
, "length") == 0)
912 /* Set the gc_used field of T to LEVEL, and handle the types it references. */
915 set_gc_used_type (t
, level
, param
)
917 enum gc_used_enum level
;
918 type_p param
[NUM_PARAM
];
920 if (t
->gc_used
>= level
)
933 process_gc_options (t
->u
.s
.opt
, level
, &dummy
, &dummy
, &dummy
);
935 for (f
= t
->u
.s
.fields
; f
; f
= f
->next
)
940 process_gc_options (f
->opt
, level
, &maybe_undef
, &pass_param
,
943 if (length
&& f
->type
->kind
== TYPE_POINTER
)
944 set_gc_used_type (f
->type
->u
.p
, GC_USED
, NULL
);
945 else if (maybe_undef
&& f
->type
->kind
== TYPE_POINTER
)
946 set_gc_used_type (f
->type
->u
.p
, GC_MAYBE_POINTED_TO
, NULL
);
947 else if (pass_param
&& f
->type
->kind
== TYPE_POINTER
&& param
)
948 set_gc_used_type (find_param_structure (f
->type
->u
.p
, param
),
949 GC_POINTED_TO
, NULL
);
951 set_gc_used_type (f
->type
, GC_USED
, pass_param
? param
: NULL
);
957 set_gc_used_type (t
->u
.p
, GC_POINTED_TO
, NULL
);
961 set_gc_used_type (t
->u
.a
.p
, GC_USED
, param
);
964 case TYPE_LANG_STRUCT
:
965 for (t
= t
->u
.s
.lang_struct
; t
; t
= t
->next
)
966 set_gc_used_type (t
, level
, param
);
969 case TYPE_PARAM_STRUCT
:
972 for (i
= 0; i
< NUM_PARAM
; i
++)
973 if (t
->u
.param_struct
.param
[i
] != 0)
974 set_gc_used_type (t
->u
.param_struct
.param
[i
], GC_USED
, NULL
);
976 if (t
->u
.param_struct
.stru
->gc_used
== GC_POINTED_TO
)
977 level
= GC_POINTED_TO
;
980 t
->u
.param_struct
.stru
->gc_used
= GC_UNUSED
;
981 set_gc_used_type (t
->u
.param_struct
.stru
, level
,
982 t
->u
.param_struct
.param
);
990 /* Set the gc_used fields of all the types pointed to by VARIABLES. */
993 set_gc_used (variables
)
997 for (p
= variables
; p
; p
= p
->next
)
998 set_gc_used_type (p
->type
, GC_USED
, NULL
);
1001 /* File mapping routines. For each input file, there is one output .c file
1002 (but some output files have many input files), and there is one .h file
1003 for the whole build. */
1005 /* The list of output files. */
1006 static outf_p output_files
;
1008 /* The output header file that is included into pretty much every
1012 /* Number of files specified in gtfiles. */
1013 #define NUM_GT_FILES (ARRAY_SIZE (all_files) - 1)
1015 /* Number of files in the language files array. */
1016 #define NUM_LANG_FILES (ARRAY_SIZE (lang_files) - 1)
1018 /* Length of srcdir name. */
1019 static int srcdir_len
= 0;
1021 #define NUM_BASE_FILES (ARRAY_SIZE (lang_dir_names) - 1)
1022 outf_p base_files
[NUM_BASE_FILES
];
1024 static outf_p create_file
PARAMS ((const char *, const char *));
1025 static const char * get_file_basename
PARAMS ((const char *));
1027 /* Create and return an outf_p for a new file for NAME, to be called
1031 create_file (name
, oname
)
1035 static const char *const hdr
[] = {
1036 " Copyright (C) 2002 Free Software Foundation, Inc.\n",
1038 "This file is part of GCC.\n",
1040 "GCC is free software; you can redistribute it and/or modify it under\n",
1041 "the terms of the GNU General Public License as published by the Free\n",
1042 "Software Foundation; either version 2, or (at your option) any later\n",
1045 "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1046 "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1047 "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n",
1048 "for more details.\n",
1050 "You should have received a copy of the GNU General Public License\n",
1051 "along with GCC; see the file COPYING. If not, write to the Free\n",
1052 "Software Foundation, 59 Temple Place - Suite 330, Boston, MA\n",
1053 "02111-1307, USA. */\n",
1055 "/* This file is machine generated. Do not edit. */\n"
1060 f
= xcalloc (sizeof (*f
), 1);
1061 f
->next
= output_files
;
1065 oprintf (f
, "/* Type information for %s.\n", name
);
1066 for (i
= 0; i
< ARRAY_SIZE (hdr
); i
++)
1067 oprintf (f
, "%s", hdr
[i
]);
1071 /* Print, like fprintf, to O. */
1073 oprintf
VPARAMS ((outf_p o
, const char *format
, ...))
1078 VA_OPEN (ap
, format
);
1079 VA_FIXEDARG (ap
, outf_p
, o
);
1080 VA_FIXEDARG (ap
, const char *, format
);
1081 slength
= xvasprintf (&s
, format
, ap
);
1083 if (o
->bufused
+ slength
> o
->buflength
)
1085 size_t new_len
= o
->buflength
;
1090 } while (o
->bufused
+ slength
>= new_len
);
1091 o
->buf
= xrealloc (o
->buf
, new_len
);
1092 o
->buflength
= new_len
;
1094 memcpy (o
->buf
+ o
->bufused
, s
, slength
);
1095 o
->bufused
+= slength
;
1100 /* Open the global header file and the language-specific header files. */
1107 header_file
= create_file ("GCC", "gtype-desc.h");
1109 for (i
= 0; i
< NUM_BASE_FILES
; i
++)
1110 base_files
[i
] = create_file (lang_dir_names
[i
],
1111 xasprintf ("gtype-%s.h", lang_dir_names
[i
]));
1113 /* gtype-desc.c is a little special, so we create it here. */
1115 /* The order of files here matters very much. */
1116 static const char *const ifiles
[] = {
1117 "config.h", "system.h", "varray.h", "hashtab.h", "splay-tree.h",
1118 "bitmap.h", "tree.h", "rtl.h", "function.h", "insn-config.h",
1119 "expr.h", "hard-reg-set.h", "basic-block.h", "cselib.h",
1120 "insn-addr.h", "ssa.h", "optabs.h", "libfuncs.h",
1124 const char *const *ifp
;
1125 outf_p gtype_desc_c
;
1127 gtype_desc_c
= create_file ("GCC", "gtype-desc.c");
1128 for (ifp
= ifiles
; *ifp
; ifp
++)
1129 oprintf (gtype_desc_c
, "#include \"%s\"\n", *ifp
);
1133 /* Determine the pathname to F relative to $(srcdir). */
1136 get_file_basename (f
)
1140 const char *basename
;
1143 basename
= strrchr (f
, '/');
1151 for (i
= 1; i
< NUM_BASE_FILES
; i
++)
1157 s1
= basename
- strlen (lang_dir_names
[i
]) - 1;
1158 s2
= lang_dir_names
[i
];
1161 if (l1
>= l2
&& !memcmp (s1
, s2
, l2
))
1164 if ((basename
- f
- 1) != srcdir_len
)
1165 abort (); /* Match is wrong - should be preceded by $srcdir. */
1173 /* Return a bitmap which has bit `1 << BASE_FILE_<lang>' set iff
1174 INPUT_FILE is used by <lang>.
1176 This function should be written to assume that a file _is_ used
1177 if the situation is unclear. If it wrongly assumes a file _is_ used,
1178 a linker error will result. If it wrongly assumes a file _is not_ used,
1179 some GC roots may be missed, which is a much harder-to-debug problem. */
1182 get_base_file_bitmap (input_file
)
1183 const char *input_file
;
1185 const char *basename
= get_file_basename (input_file
);
1186 const char *slashpos
= strchr (basename
, '/');
1194 for (i
= 1; i
< NUM_BASE_FILES
; i
++)
1195 if ((size_t)(slashpos
- basename
) == strlen (lang_dir_names
[i
])
1196 && memcmp (basename
, lang_dir_names
[i
], strlen (lang_dir_names
[i
])) == 0)
1198 /* It's in a language directory, set that language. */
1203 abort (); /* Should have found the language. */
1206 /* If it's in any config-lang.in, then set for the languages
1211 for (j
= 0; j
< NUM_LANG_FILES
; j
++)
1213 if (!strcmp(input_file
, lang_files
[j
]))
1215 for (k
= 0; k
< NUM_BASE_FILES
; k
++)
1217 if (!strcmp(lang_dir_names
[k
], langs_for_lang_files
[j
]))
1223 /* Otherwise, set all languages. */
1225 bitmap
= (1 << NUM_BASE_FILES
) - 1;
1230 /* An output file, suitable for definitions, that can see declarations
1231 made in INPUT_FILE and is linked into every language that uses
1235 get_output_file_with_visibility (input_file
)
1236 const char *input_file
;
1240 const char *basename
;
1241 const char *for_name
;
1242 const char *output_name
;
1244 /* This can happen when we need a file with visibility on a
1245 structure that we've never seen. We have to just hope that it's
1246 globally visible. */
1247 if (input_file
== NULL
)
1248 input_file
= "system.h";
1250 /* Determine the output file name. */
1251 basename
= get_file_basename (input_file
);
1253 len
= strlen (basename
);
1254 if ((len
> 2 && memcmp (basename
+len
-2, ".c", 2) == 0)
1255 || (len
> 2 && memcmp (basename
+len
-2, ".y", 2) == 0)
1256 || (len
> 3 && memcmp (basename
+len
-3, ".in", 3) == 0))
1260 output_name
= s
= xasprintf ("gt-%s", basename
);
1261 for (; *s
!= '.'; s
++)
1262 if (! ISALNUM (*s
) && *s
!= '-')
1264 memcpy (s
, ".h", sizeof (".h"));
1265 for_name
= basename
;
1267 else if (strcmp (basename
, "c-common.h") == 0)
1268 output_name
= "gt-c-common.h", for_name
= "c-common.c";
1269 else if (strcmp (basename
, "c-tree.h") == 0)
1270 output_name
= "gt-c-decl.h", for_name
= "c-decl.c";
1275 for (i
= 0; i
< NUM_BASE_FILES
; i
++)
1276 if (memcmp (basename
, lang_dir_names
[i
], strlen (lang_dir_names
[i
])) == 0
1277 && basename
[strlen(lang_dir_names
[i
])] == '/')
1278 return base_files
[i
];
1280 output_name
= "gtype-desc.c";
1284 /* Look through to see if we've ever seen this output filename before. */
1285 for (r
= output_files
; r
; r
= r
->next
)
1286 if (strcmp (r
->name
, output_name
) == 0)
1289 /* If not, create it. */
1290 r
= create_file (for_name
, output_name
);
1295 /* The name of an output file, suitable for definitions, that can see
1296 declarations made in INPUT_FILE and is linked into every language
1297 that uses INPUT_FILE. */
1300 get_output_file_name (input_file
)
1301 const char *input_file
;
1303 return get_output_file_with_visibility (input_file
)->name
;
1306 /* Copy the output to its final destination,
1307 but don't unnecessarily change modification times. */
1309 static void close_output_files
PARAMS ((void));
1312 close_output_files ()
1316 for (of
= output_files
; of
; of
= of
->next
)
1320 newfile
= fopen (of
->name
, "r");
1321 if (newfile
!= NULL
)
1326 for (i
= 0; i
< of
->bufused
; i
++)
1329 ch
= fgetc (newfile
);
1330 if (ch
== EOF
|| ch
!= (unsigned char) of
->buf
[i
])
1333 no_write_p
= i
== of
->bufused
&& fgetc (newfile
) == EOF
;
1340 newfile
= fopen (of
->name
, "w");
1341 if (newfile
== NULL
)
1343 perror ("opening output file");
1346 if (fwrite (of
->buf
, 1, of
->bufused
, newfile
) != of
->bufused
)
1348 perror ("writing output file");
1351 if (fclose (newfile
) != 0)
1353 perror ("closing output file");
1366 static void output_escaped_param
PARAMS ((outf_p
, const char *, const char *,
1367 const char *, const char *,
1369 static void output_mangled_typename
PARAMS ((outf_p
, type_p
));
1370 static void write_gc_structure_fields
1371 PARAMS ((outf_p
, type_p
, const char *, const char *, options_p
,
1372 int, struct fileloc
*, lang_bitmap
, type_p
*));
1373 static void write_gc_marker_routine_for_structure
PARAMS ((type_p
, type_p
,
1375 static void write_gc_types
PARAMS ((type_p structures
, type_p param_structs
));
1376 static void write_enum_defn
PARAMS ((type_p structures
, type_p param_structs
));
1377 static void put_mangled_filename
PARAMS ((outf_p
, const char *));
1378 static void finish_root_table
PARAMS ((struct flist
*flp
, const char *pfx
,
1379 const char *tname
, const char *lastname
,
1381 static void write_gc_root
PARAMS ((outf_p
, pair_p
, type_p
, const char *, int,
1382 struct fileloc
*, const char *));
1383 static void write_gc_roots
PARAMS ((pair_p
));
1385 static int gc_counter
;
1387 /* Print PARAM to OF processing escapes. VAL references the current object,
1388 PREV_VAL the object containing the current object, ONAME is the name
1389 of the option and LINE is used to print error messages. */
1392 output_escaped_param (of
, param
, val
, prev_val
, oname
, line
)
1396 const char *prev_val
;
1398 struct fileloc
*line
;
1402 for (p
= param
; *p
; p
++)
1404 oprintf (of
, "%c", *p
);
1408 oprintf (of
, "(%s)", val
);
1411 oprintf (of
, "(*x)");
1414 oprintf (of
, "(%s)", prev_val
);
1418 const char *pp
= val
+ strlen (val
);
1419 while (pp
[-1] == ']')
1422 oprintf (of
, "%s", pp
);
1426 error_at_line (line
, "`%s' option contains bad escape %c%c",
1431 /* Print a mangled name representing T to OF. */
1434 output_mangled_typename (of
, t
)
1440 else switch (t
->kind
)
1444 output_mangled_typename (of
, t
->u
.p
);
1454 case TYPE_LANG_STRUCT
:
1455 oprintf (of
, "%d%s", strlen (t
->u
.s
.tag
), t
->u
.s
.tag
);
1457 case TYPE_PARAM_STRUCT
:
1460 for (i
= 0; i
< NUM_PARAM
; i
++)
1461 if (t
->u
.param_struct
.param
[i
] != NULL
)
1462 output_mangled_typename (of
, t
->u
.param_struct
.param
[i
]);
1463 output_mangled_typename (of
, t
->u
.param_struct
.stru
);
1471 /* Write out code to OF which marks the fields of S. VAL references
1472 the current object, PREV_VAL the object containing the current
1473 object, OPTS is a list of options to apply, INDENT is the current
1474 indentation level, LINE is used to print error messages, BITMAP
1475 indicates which languages to print the structure for, and PARAM is
1476 the current parameter (from an enclosing param_is option). */
1479 write_gc_structure_fields (of
, s
, val
, prev_val
, opts
, indent
, line
, bitmap
,
1484 const char *prev_val
;
1487 struct fileloc
*line
;
1492 int seen_default
= 0;
1494 if (! s
->u
.s
.line
.file
)
1495 error_at_line (line
, "incomplete structure `%s'", s
->u
.s
.tag
);
1496 else if ((s
->u
.s
.bitmap
& bitmap
) != bitmap
)
1498 error_at_line (line
, "structure defined for mismatching languages");
1499 error_at_line (&s
->u
.s
.line
, "one structure defined here");
1502 if (s
->kind
== TYPE_UNION
)
1504 const char *tagexpr
= NULL
;
1507 for (oo
= opts
; oo
; oo
= oo
->next
)
1508 if (strcmp (oo
->name
, "desc") == 0)
1509 tagexpr
= (const char *)oo
->info
;
1510 if (tagexpr
== NULL
)
1513 error_at_line (line
, "missing `desc' option");
1516 oprintf (of
, "%*sswitch (", indent
, "");
1517 output_escaped_param (of
, tagexpr
, val
, prev_val
, "desc", line
);
1518 oprintf (of
, ")\n");
1520 oprintf (of
, "%*s{\n", indent
, "");
1523 for (f
= s
->u
.s
.fields
; f
; f
= f
->next
)
1525 const char *tagid
= NULL
;
1526 const char *length
= NULL
;
1529 int maybe_undef_p
= 0;
1530 int use_param_num
= -1;
1531 int use_params_p
= 0;
1532 int needs_cast_p
= 0;
1535 const char *dot
= ".";
1537 for (oo
= f
->opt
; oo
; oo
= oo
->next
)
1538 if (strcmp (oo
->name
, "length") == 0)
1539 length
= (const char *)oo
->info
;
1540 else if (strcmp (oo
->name
, "maybe_undef") == 0)
1542 else if (strcmp (oo
->name
, "tag") == 0)
1543 tagid
= (const char *)oo
->info
;
1544 else if (strcmp (oo
->name
, "special") == 0)
1546 else if (strcmp (oo
->name
, "skip") == 0)
1548 else if (strcmp (oo
->name
, "default") == 0)
1550 else if (strcmp (oo
->name
, "desc") == 0)
1552 else if (strcmp (oo
->name
, "descbits") == 0)
1554 else if (strcmp (oo
->name
, "param_is") == 0)
1556 else if (strncmp (oo
->name
, "use_param", 9) == 0
1557 && (oo
->name
[9] == '\0' || ISDIGIT (oo
->name
[9])))
1558 use_param_num
= oo
->name
[9] == '\0' ? 0 : oo
->name
[9] - '0';
1559 else if (strcmp (oo
->name
, "use_params") == 0)
1561 else if (strcmp (oo
->name
, "dot") == 0)
1562 dot
= (const char *)oo
->info
;
1564 error_at_line (&f
->line
, "unknown field option `%s'\n", oo
->name
);
1571 int pointer_p
= t
->kind
== TYPE_POINTER
;
1575 t
= find_param_structure (t
, param
);
1577 t
= create_pointer (t
);
1580 if (use_param_num
!= -1)
1582 if (param
!= NULL
&& param
[use_param_num
] != NULL
)
1584 type_p nt
= param
[use_param_num
];
1586 if (t
->kind
== TYPE_ARRAY
)
1587 nt
= create_array (nt
, t
->u
.a
.len
);
1588 else if (length
!= NULL
&& t
->kind
== TYPE_POINTER
)
1589 nt
= create_pointer (nt
);
1590 needs_cast_p
= (t
->kind
!= TYPE_POINTER
1591 && nt
->kind
== TYPE_POINTER
);
1594 else if (s
->kind
!= TYPE_UNION
)
1595 error_at_line (&f
->line
, "no parameter defined");
1598 if (t
->kind
== TYPE_SCALAR
1599 || (t
->kind
== TYPE_ARRAY
1600 && t
->u
.a
.p
->kind
== TYPE_SCALAR
))
1603 seen_default
|= default_p
;
1606 && (t
->kind
!= TYPE_POINTER
1607 || t
->u
.p
->kind
!= TYPE_STRUCT
))
1608 error_at_line (&f
->line
,
1609 "field `%s' has invalid option `maybe_undef_p'\n",
1611 if (s
->kind
== TYPE_UNION
)
1615 oprintf (of
, "%*scase %s:\n", indent
, "", tagid
);
1620 oprintf (of
, "%*sdefault:\n", indent
, "");
1624 error_at_line (&f
->line
, "field `%s' has no tag", f
->name
);
1633 /* Do nothing; strings go in the string pool. */
1636 case TYPE_LANG_STRUCT
:
1639 for (ti
= t
->u
.s
.lang_struct
; ti
; ti
= ti
->next
)
1640 if (ti
->u
.s
.bitmap
& bitmap
)
1647 error_at_line (&f
->line
,
1648 "structure not defined for this language");
1652 /* Fall through... */
1658 newval
= xasprintf ("%s%s%s", val
, dot
, f
->name
);
1659 write_gc_structure_fields (of
, t
, newval
, val
, f
->opt
, indent
,
1660 &f
->line
, bitmap
, param
);
1669 && t
->u
.p
->u
.s
.line
.file
== NULL
)
1670 oprintf (of
, "%*sif (%s%s%s) abort();\n", indent
, "",
1672 else if (UNION_OR_STRUCT_P (t
->u
.p
)
1673 || t
->u
.p
->kind
== TYPE_PARAM_STRUCT
)
1675 oprintf (of
, "%*sgt_ggc_m_", indent
, "");
1676 output_mangled_typename (of
, t
->u
.p
);
1679 oprintf (of
, "(%s %s *)",
1680 UNION_P (t
->u
.p
) ? "union" : "struct",
1682 oprintf (of
, "%s%s%s);\n", val
, dot
, f
->name
);
1685 error_at_line (&f
->line
, "field `%s' is pointer to scalar",
1689 else if (t
->u
.p
->kind
== TYPE_SCALAR
1690 || t
->u
.p
->kind
== TYPE_STRING
)
1691 oprintf (of
, "%*sggc_mark (%s%s%s);\n", indent
, "",
1695 int loopcounter
= ++gc_counter
;
1697 oprintf (of
, "%*sif (%s%s%s != NULL) {\n", indent
, "",
1700 oprintf (of
, "%*ssize_t i%d;\n", indent
, "", loopcounter
);
1701 oprintf (of
, "%*sggc_set_mark (%s%s%s);\n", indent
, "",
1703 oprintf (of
, "%*sfor (i%d = 0; i%d < (size_t)(", indent
, "",
1704 loopcounter
, loopcounter
);
1705 output_escaped_param (of
, length
, val
, prev_val
, "length", line
);
1706 oprintf (of
, "); i%d++) {\n", loopcounter
);
1708 switch (t
->u
.p
->kind
)
1715 newval
= xasprintf ("%s%s%s[i%d]", val
, dot
, f
->name
,
1717 write_gc_structure_fields (of
, t
->u
.p
, newval
, val
,
1718 f
->opt
, indent
, &f
->line
,
1724 if (UNION_OR_STRUCT_P (t
->u
.p
->u
.p
)
1725 || t
->u
.p
->u
.p
->kind
== TYPE_PARAM_STRUCT
)
1727 oprintf (of
, "%*sgt_ggc_m_", indent
, "");
1728 output_mangled_typename (of
, t
->u
.p
->u
.p
);
1729 oprintf (of
, " (%s%s%s[i%d]);\n", val
, dot
, f
->name
,
1733 error_at_line (&f
->line
,
1734 "field `%s' is array of pointer to scalar",
1738 error_at_line (&f
->line
,
1739 "field `%s' is array of unimplemented type",
1744 oprintf (of
, "%*s}\n", indent
, "");
1746 oprintf (of
, "%*s}\n", indent
, "");
1752 int loopcounter
= ++gc_counter
;
1757 (strcmp (t
->u
.a
.len
, "0") == 0
1758 || strcmp (t
->u
.a
.len
, "1") == 0))
1759 error_at_line (&f
->line
,
1760 "field `%s' is array of size %s",
1761 f
->name
, t
->u
.a
.len
);
1763 /* Arrays of scalars can be ignored. */
1764 for (ta
= t
; ta
->kind
== TYPE_ARRAY
; ta
= ta
->u
.a
.p
)
1766 if (ta
->kind
== TYPE_SCALAR
1767 || ta
->kind
== TYPE_STRING
)
1770 oprintf (of
, "%*s{\n", indent
, "");
1773 for (ta
= t
, i
= 0; ta
->kind
== TYPE_ARRAY
; ta
= ta
->u
.a
.p
, i
++)
1775 oprintf (of
, "%*ssize_t i%d_%d;\n",
1776 indent
, "", loopcounter
, i
);
1777 oprintf (of
, "%*sconst size_t ilimit%d_%d = (",
1778 indent
, "", loopcounter
, i
);
1779 if (i
== 0 && length
!= NULL
)
1780 output_escaped_param (of
, length
, val
, prev_val
,
1783 oprintf (of
, "%s", ta
->u
.a
.len
);
1784 oprintf (of
, ");\n");
1787 for (ta
= t
, i
= 0; ta
->kind
== TYPE_ARRAY
; ta
= ta
->u
.a
.p
, i
++)
1790 "%*sfor (i%d_%d = 0; i%d_%d < ilimit%d_%d; i%d_%d++) {\n",
1791 indent
, "", loopcounter
, i
, loopcounter
, i
,
1792 loopcounter
, i
, loopcounter
, i
);
1796 if (ta
->kind
== TYPE_POINTER
1797 && (UNION_OR_STRUCT_P (ta
->u
.p
)
1798 || ta
->u
.p
->kind
== TYPE_PARAM_STRUCT
))
1800 oprintf (of
, "%*sgt_ggc_m_", indent
, "");
1801 output_mangled_typename (of
, ta
->u
.p
);
1802 oprintf (of
, " (%s%s%s", val
, dot
, f
->name
);
1804 ta
->kind
== TYPE_ARRAY
;
1805 ta
= ta
->u
.a
.p
, i
++)
1806 oprintf (of
, "[i%d_%d]", loopcounter
, i
);
1807 oprintf (of
, ");\n");
1809 else if (ta
->kind
== TYPE_STRUCT
|| ta
->kind
== TYPE_UNION
)
1814 len
= strlen (val
) + strlen (f
->name
) + 2;
1815 for (ta
= t
; ta
->kind
== TYPE_ARRAY
; ta
= ta
->u
.a
.p
)
1816 len
+= sizeof ("[i_]") + 2*6;
1818 newval
= xmalloc (len
);
1819 sprintf (newval
, "%s%s%s", val
, dot
, f
->name
);
1821 ta
->kind
== TYPE_ARRAY
;
1822 ta
= ta
->u
.a
.p
, i
++)
1823 sprintf (newval
+ strlen (newval
), "[i%d_%d]",
1825 write_gc_structure_fields (of
, t
->u
.p
, newval
, val
,
1826 f
->opt
, indent
, &f
->line
, bitmap
,
1830 else if (ta
->kind
== TYPE_POINTER
&& ta
->u
.p
->kind
== TYPE_SCALAR
1831 && use_param_num
!= -1 && param
== NULL
)
1832 oprintf (of
, "%*sabort();\n", indent
, "");
1834 error_at_line (&f
->line
,
1835 "field `%s' is array of unimplemented type",
1837 for (ta
= t
, i
= 0; ta
->kind
== TYPE_ARRAY
; ta
= ta
->u
.a
.p
, i
++)
1840 oprintf (of
, "%*s}\n", indent
, "");
1844 oprintf (of
, "%*s}\n", indent
, "");
1849 error_at_line (&f
->line
,
1850 "field `%s' is unimplemented type",
1855 if (s
->kind
== TYPE_UNION
)
1857 oprintf (of
, "%*sbreak;\n", indent
, "");
1861 if (s
->kind
== TYPE_UNION
)
1865 oprintf (of
, "%*sdefault:\n", indent
, "");
1866 oprintf (of
, "%*s break;\n", indent
, "");
1868 oprintf (of
, "%*s}\n", indent
, "");
1873 /* Write out a marker routine for S. PARAM is the parameter from an
1874 enclosing PARAM_IS option. */
1877 write_gc_marker_routine_for_structure (orig_s
, s
, param
)
1883 const char *fn
= s
->u
.s
.line
.file
;
1885 const char *chain_next
= NULL
;
1886 const char *chain_prev
= NULL
;
1889 /* This is a hack, and not the good kind either. */
1890 for (i
= NUM_PARAM
- 1; i
>= 0; i
--)
1891 if (param
&& param
[i
] && param
[i
]->kind
== TYPE_POINTER
1892 && UNION_OR_STRUCT_P (param
[i
]->u
.p
))
1893 fn
= param
[i
]->u
.p
->u
.s
.line
.file
;
1895 f
= get_output_file_with_visibility (fn
);
1897 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
1898 if (strcmp (opt
->name
, "chain_next") == 0)
1899 chain_next
= (const char *) opt
->info
;
1900 else if (strcmp (opt
->name
, "chain_prev") == 0)
1901 chain_prev
= (const char *) opt
->info
;
1903 if (chain_prev
!= NULL
&& chain_next
== NULL
)
1904 error_at_line (&s
->u
.s
.line
, "chain_prev without chain_next");
1907 oprintf (f
, "void\n");
1909 oprintf (f
, "gt_ggc_mx_%s", s
->u
.s
.tag
);
1912 oprintf (f
, "gt_ggc_m_");
1913 output_mangled_typename (f
, orig_s
);
1915 oprintf (f
, " (x_p)\n");
1916 oprintf (f
, " void *x_p;\n");
1918 oprintf (f
, " %s %s * %sx = (%s %s *)x_p;\n",
1919 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
,
1920 chain_next
== NULL
? "const " : "",
1921 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
1922 if (chain_next
!= NULL
)
1923 oprintf (f
, " %s %s * xlimit = x;\n",
1924 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
1925 if (chain_next
== NULL
)
1926 oprintf (f
, " if (ggc_test_and_set_mark (x))\n");
1929 oprintf (f
, " while (ggc_test_and_set_mark (xlimit))\n");
1930 oprintf (f
, " xlimit = (");
1931 output_escaped_param (f
, chain_next
, "*xlimit", "*xlimit",
1932 "chain_next", &s
->u
.s
.line
);
1933 oprintf (f
, ");\n");
1934 if (chain_prev
!= NULL
)
1936 oprintf (f
, " if (x != xlimit)\n");
1937 oprintf (f
, " for (;;)\n");
1938 oprintf (f
, " {\n");
1939 oprintf (f
, " %s %s * const xprev = (",
1940 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
1941 output_escaped_param (f
, chain_prev
, "*x", "*x",
1942 "chain_prev", &s
->u
.s
.line
);
1943 oprintf (f
, ");\n");
1944 oprintf (f
, " if (xprev == NULL) break;\n");
1945 oprintf (f
, " x = xprev;\n");
1946 oprintf (f
, " ggc_set_mark (xprev);\n");
1947 oprintf (f
, " }\n");
1949 oprintf (f
, " while (x != xlimit)\n");
1951 oprintf (f
, " {\n");
1954 write_gc_structure_fields (f
, s
, "(*x)", "not valid postage",
1955 s
->u
.s
.opt
, 6, &s
->u
.s
.line
, s
->u
.s
.bitmap
,
1958 if (chain_next
!= NULL
)
1960 oprintf (f
, " x = (");
1961 output_escaped_param (f
, chain_next
, "*x", "*x",
1962 "chain_next", &s
->u
.s
.line
);
1963 oprintf (f
, ");\n");
1966 oprintf (f
, " }\n");
1970 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS. */
1973 write_gc_types (structures
, param_structs
)
1975 type_p param_structs
;
1979 oprintf (header_file
, "\n/* GC marker procedures. */\n");
1980 for (s
= structures
; s
; s
= s
->next
)
1981 if (s
->gc_used
== GC_POINTED_TO
1982 || s
->gc_used
== GC_MAYBE_POINTED_TO
)
1986 if (s
->gc_used
== GC_MAYBE_POINTED_TO
1987 && s
->u
.s
.line
.file
== NULL
)
1990 oprintf (header_file
, "#define gt_ggc_m_");
1991 output_mangled_typename (header_file
, s
);
1992 oprintf (header_file
, "(X) do { \\\n");
1993 oprintf (header_file
,
1994 " if (X != NULL) gt_ggc_mx_%s (X);\\\n", s
->u
.s
.tag
);
1995 oprintf (header_file
,
1998 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
1999 if (strcmp (opt
->name
, "ptr_alias") == 0)
2001 type_p t
= (type_p
) opt
->info
;
2002 if (t
->kind
== TYPE_STRUCT
2003 || t
->kind
== TYPE_UNION
2004 || t
->kind
== TYPE_LANG_STRUCT
)
2005 oprintf (header_file
,
2006 "#define gt_ggc_mx_%s gt_ggc_mx_%s\n",
2007 s
->u
.s
.tag
, t
->u
.s
.tag
);
2009 error_at_line (&s
->u
.s
.line
,
2010 "structure alias is not a structure");
2016 /* Declare the marker procedure only once. */
2017 oprintf (header_file
,
2018 "extern void gt_ggc_mx_%s PARAMS ((void *));\n",
2021 if (s
->u
.s
.line
.file
== NULL
)
2023 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
2028 if (s
->kind
== TYPE_LANG_STRUCT
)
2031 for (ss
= s
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
2032 write_gc_marker_routine_for_structure (s
, ss
, NULL
);
2035 write_gc_marker_routine_for_structure (s
, s
, NULL
);
2038 for (s
= param_structs
; s
; s
= s
->next
)
2039 if (s
->gc_used
== GC_POINTED_TO
)
2041 type_p
* param
= s
->u
.param_struct
.param
;
2042 type_p stru
= s
->u
.param_struct
.stru
;
2044 /* Declare the marker procedure. */
2045 oprintf (header_file
, "extern void gt_ggc_m_");
2046 output_mangled_typename (header_file
, s
);
2047 oprintf (header_file
, " PARAMS ((void *));\n");
2049 if (stru
->u
.s
.line
.file
== NULL
)
2051 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
2056 if (stru
->kind
== TYPE_LANG_STRUCT
)
2059 for (ss
= stru
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
2060 write_gc_marker_routine_for_structure (s
, ss
, param
);
2063 write_gc_marker_routine_for_structure (s
, stru
, param
);
2067 /* Write out the 'enum' definition for gt_types_enum. */
2070 write_enum_defn (structures
, param_structs
)
2072 type_p param_structs
;
2076 oprintf (header_file
, "\n/* Enumeration of types known. */\n");
2077 oprintf (header_file
, "enum gt_types_enum {\n");
2078 for (s
= structures
; s
; s
= s
->next
)
2079 if (s
->gc_used
== GC_POINTED_TO
2080 || s
->gc_used
== GC_MAYBE_POINTED_TO
)
2082 if (s
->gc_used
== GC_MAYBE_POINTED_TO
2083 && s
->u
.s
.line
.file
== NULL
)
2086 oprintf (header_file
, " gt_ggc_e_");
2087 output_mangled_typename (header_file
, s
);
2088 oprintf (header_file
, ", \n");
2090 for (s
= param_structs
; s
; s
= s
->next
)
2091 if (s
->gc_used
== GC_POINTED_TO
)
2093 oprintf (header_file
, " gt_e_");
2094 output_mangled_typename (header_file
, s
);
2095 oprintf (header_file
, ", \n");
2097 oprintf (header_file
, " gt_types_enum_last\n");
2098 oprintf (header_file
, "};\n");
2102 /* Mangle FN and print it to F. */
2105 put_mangled_filename (f
, fn
)
2109 const char *name
= get_output_file_name (fn
);
2110 for (; *name
!= 0; name
++)
2111 if (ISALNUM (*name
))
2112 oprintf (f
, "%c", *name
);
2114 oprintf (f
, "%c", '_');
2117 /* Finish off the currently-created root tables in FLP. PFX, TNAME,
2118 LASTNAME, and NAME are all strings to insert in various places in
2119 the resulting code. */
2122 finish_root_table (flp
, pfx
, lastname
, tname
, name
)
2126 const char *lastname
;
2130 unsigned started_bitmap
= 0;
2132 for (fli2
= flp
; fli2
; fli2
= fli2
->next
)
2133 if (fli2
->started_p
)
2135 oprintf (fli2
->f
, " %s\n", lastname
);
2136 oprintf (fli2
->f
, "};\n\n");
2139 for (fli2
= flp
; fli2
; fli2
= fli2
->next
)
2140 if (fli2
->started_p
)
2142 lang_bitmap bitmap
= get_base_file_bitmap (fli2
->name
);
2145 for (fnum
= 0; bitmap
!= 0; fnum
++, bitmap
>>= 1)
2148 oprintf (base_files
[fnum
],
2149 "extern const struct %s gt_ggc_%s_",
2151 put_mangled_filename (base_files
[fnum
], fli2
->name
);
2152 oprintf (base_files
[fnum
], "[];\n");
2156 for (fli2
= flp
; fli2
; fli2
= fli2
->next
)
2157 if (fli2
->started_p
)
2159 lang_bitmap bitmap
= get_base_file_bitmap (fli2
->name
);
2162 fli2
->started_p
= 0;
2164 for (fnum
= 0; bitmap
!= 0; fnum
++, bitmap
>>= 1)
2167 if (! (started_bitmap
& (1 << fnum
)))
2169 oprintf (base_files
[fnum
],
2170 "const struct %s * const %s[] = {\n",
2172 started_bitmap
|= 1 << fnum
;
2174 oprintf (base_files
[fnum
], " gt_ggc_%s_", pfx
);
2175 put_mangled_filename (base_files
[fnum
], fli2
->name
);
2176 oprintf (base_files
[fnum
], ",\n");
2184 for (bitmap
= started_bitmap
, fnum
= 0; bitmap
!= 0; fnum
++, bitmap
>>= 1)
2187 oprintf (base_files
[fnum
], " NULL\n");
2188 oprintf (base_files
[fnum
], "};\n");
2193 /* Write out to F the table entry and any marker routines needed to
2194 mark NAME as TYPE. The original variable is V, at LINE.
2195 HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
2196 is nonzero iff we are building the root table for hash table caches. */
2199 write_gc_root (f
, v
, type
, name
, has_length
, line
, if_marked
)
2205 struct fileloc
*line
;
2206 const char *if_marked
;
2213 for (fld
= type
->u
.s
.fields
; fld
; fld
= fld
->next
)
2216 const char *desc
= NULL
;
2219 for (o
= fld
->opt
; o
; o
= o
->next
)
2220 if (strcmp (o
->name
, "skip") == 0)
2222 else if (strcmp (o
->name
, "desc") == 0)
2223 desc
= (const char *)o
->info
;
2225 error_at_line (line
,
2226 "field `%s' of global `%s' has unknown option `%s'",
2227 fld
->name
, name
, o
->name
);
2231 else if (desc
&& fld
->type
->kind
== TYPE_UNION
)
2233 pair_p validf
= NULL
;
2236 for (ufld
= fld
->type
->u
.s
.fields
; ufld
; ufld
= ufld
->next
)
2238 const char *tag
= NULL
;
2241 for (oo
= ufld
->opt
; oo
; oo
= oo
->next
)
2242 if (strcmp (oo
->name
, "tag") == 0)
2243 tag
= (const char *)oo
->info
;
2244 if (tag
== NULL
|| strcmp (tag
, desc
) != 0)
2247 error_at_line (line
,
2248 "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
2249 name
, fld
->name
, validf
->name
,
2250 name
, fld
->name
, ufld
->name
,
2257 newname
= xasprintf ("%s.%s.%s",
2258 name
, fld
->name
, validf
->name
);
2259 write_gc_root (f
, v
, validf
->type
, newname
, 0, line
,
2265 error_at_line (line
,
2266 "global `%s.%s' has `desc' option but is not union",
2271 newname
= xasprintf ("%s.%s", name
, fld
->name
);
2272 write_gc_root (f
, v
, fld
->type
, newname
, 0, line
, if_marked
);
2282 newname
= xasprintf ("%s[0]", name
);
2283 write_gc_root (f
, v
, type
->u
.a
.p
, newname
, has_length
, line
, if_marked
);
2292 oprintf (f
, " {\n");
2293 oprintf (f
, " &%s,\n", name
);
2296 for (ap
= v
->type
; ap
->kind
== TYPE_ARRAY
; ap
= ap
->u
.a
.p
)
2298 oprintf (f
, " * (%s)", ap
->u
.a
.len
);
2299 else if (ap
== v
->type
)
2300 oprintf (f
, " * ARRAY_SIZE (%s)", v
->name
);
2302 oprintf (f
, " sizeof (%s", v
->name
);
2303 for (ap
= v
->type
; ap
->kind
== TYPE_ARRAY
; ap
= ap
->u
.a
.p
)
2305 oprintf (f
, "),\n");
2309 if (! has_length
&& UNION_OR_STRUCT_P (tp
))
2311 oprintf (f
, " >_ggc_mx_%s\n", tp
->u
.s
.tag
);
2313 else if (! has_length
&& tp
->kind
== TYPE_PARAM_STRUCT
)
2315 oprintf (f
, " >_ggc_m_");
2316 output_mangled_typename (f
, tp
);
2319 && (tp
->kind
== TYPE_POINTER
|| UNION_OR_STRUCT_P (tp
)))
2321 oprintf (f
, " >_ggc_ma_%s", name
);
2325 error_at_line (line
,
2326 "global `%s' is pointer to unimplemented type",
2330 oprintf (f
, ",\n &%s", if_marked
);
2331 oprintf (f
, "\n },\n");
2340 error_at_line (line
,
2341 "global `%s' is unimplemented type",
2346 /* Output a table describing the locations and types of VARIABLES. */
2349 write_gc_roots (variables
)
2353 struct flist
*flp
= NULL
;
2355 for (v
= variables
; v
; v
= v
->next
)
2357 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
2359 const char *length
= NULL
;
2360 int deletable_p
= 0;
2363 for (o
= v
->opt
; o
; o
= o
->next
)
2364 if (strcmp (o
->name
, "length") == 0)
2365 length
= (const char *)o
->info
;
2366 else if (strcmp (o
->name
, "deletable") == 0)
2368 else if (strcmp (o
->name
, "param_is") == 0)
2370 else if (strncmp (o
->name
, "param", 5) == 0
2371 && ISDIGIT (o
->name
[5])
2372 && strcmp (o
->name
+ 6, "_is") == 0)
2374 else if (strcmp (o
->name
, "if_marked") == 0)
2377 error_at_line (&v
->line
,
2378 "global `%s' has unknown option `%s'",
2381 for (fli
= flp
; fli
; fli
= fli
->next
)
2386 fli
= xmalloc (sizeof (*fli
));
2390 fli
->name
= v
->line
.file
;
2393 oprintf (f
, "\n/* GC roots. */\n\n");
2398 && v
->type
->kind
== TYPE_POINTER
2399 && (v
->type
->u
.p
->kind
== TYPE_POINTER
2400 || v
->type
->u
.p
->kind
== TYPE_STRUCT
))
2402 oprintf (f
, "static void gt_ggc_ma_%s PARAMS ((void *));\n",
2404 oprintf (f
, "static void\ngt_ggc_ma_%s (x_p)\n void *x_p;\n",
2407 oprintf (f
, " size_t i;\n");
2409 if (v
->type
->u
.p
->kind
== TYPE_POINTER
)
2411 type_p s
= v
->type
->u
.p
->u
.p
;
2413 oprintf (f
, " %s %s ** const x = (%s %s **)x_p;\n",
2414 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
,
2415 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
2416 oprintf (f
, " if (ggc_test_and_set_mark (x))\n");
2417 oprintf (f
, " for (i = 0; i < (%s); i++)\n", length
);
2418 if (! UNION_OR_STRUCT_P (s
)
2419 && ! s
->kind
== TYPE_PARAM_STRUCT
)
2421 error_at_line (&v
->line
,
2422 "global `%s' has unsupported ** type",
2427 oprintf (f
, " gt_ggc_m_");
2428 output_mangled_typename (f
, s
);
2429 oprintf (f
, " (x[i]);\n");
2433 type_p s
= v
->type
->u
.p
;
2435 oprintf (f
, " %s %s * const x = (%s %s *)x_p;\n",
2436 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
,
2437 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
2438 oprintf (f
, " if (ggc_test_and_set_mark (x))\n");
2439 oprintf (f
, " for (i = 0; i < (%s); i++)\n", length
);
2440 oprintf (f
, " {\n");
2441 write_gc_structure_fields (f
, s
, "x[i]", "x[i]",
2442 v
->opt
, 8, &v
->line
, s
->u
.s
.bitmap
,
2444 oprintf (f
, " }\n");
2447 oprintf (f
, "}\n\n");
2451 for (v
= variables
; v
; v
= v
->next
)
2453 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
2459 for (o
= v
->opt
; o
; o
= o
->next
)
2460 if (strcmp (o
->name
, "length") == 0)
2462 else if (strcmp (o
->name
, "deletable") == 0
2463 || strcmp (o
->name
, "if_marked") == 0)
2469 for (fli
= flp
; fli
; fli
= fli
->next
)
2472 if (! fli
->started_p
)
2476 oprintf (f
, "const struct ggc_root_tab gt_ggc_r_");
2477 put_mangled_filename (f
, v
->line
.file
);
2478 oprintf (f
, "[] = {\n");
2481 write_gc_root (f
, v
, v
->type
, v
->name
, length_p
, &v
->line
, NULL
);
2484 finish_root_table (flp
, "r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
2487 for (v
= variables
; v
; v
= v
->next
)
2489 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
2494 for (o
= v
->opt
; o
; o
= o
->next
)
2495 if (strcmp (o
->name
, "deletable") == 0)
2497 else if (strcmp (o
->name
, "if_marked") == 0)
2503 for (fli
= flp
; fli
; fli
= fli
->next
)
2506 if (! fli
->started_p
)
2510 oprintf (f
, "const struct ggc_root_tab gt_ggc_rd_");
2511 put_mangled_filename (f
, v
->line
.file
);
2512 oprintf (f
, "[] = {\n");
2515 oprintf (f
, " { &%s, 1, sizeof (%s), NULL },\n",
2519 finish_root_table (flp
, "rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
2520 "gt_ggc_deletable_rtab");
2522 for (v
= variables
; v
; v
= v
->next
)
2524 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
2526 const char *if_marked
= NULL
;
2530 for (o
= v
->opt
; o
; o
= o
->next
)
2531 if (strcmp (o
->name
, "length") == 0)
2533 else if (strcmp (o
->name
, "if_marked") == 0)
2534 if_marked
= (const char *) o
->info
;
2536 if (if_marked
== NULL
)
2539 if (v
->type
->kind
!= TYPE_POINTER
2540 || v
->type
->u
.p
->kind
!= TYPE_PARAM_STRUCT
2541 || v
->type
->u
.p
->u
.param_struct
.stru
!= find_structure ("htab", 0))
2543 error_at_line (&v
->line
, "if_marked option used but not hash table");
2547 for (fli
= flp
; fli
; fli
= fli
->next
)
2550 if (! fli
->started_p
)
2554 oprintf (f
, "const struct ggc_cache_tab gt_ggc_rc_");
2555 put_mangled_filename (f
, v
->line
.file
);
2556 oprintf (f
, "[] = {\n");
2559 write_gc_root (f
, v
, v
->type
->u
.p
->u
.param_struct
.param
[0],
2560 v
->name
, length_p
, &v
->line
, if_marked
);
2563 finish_root_table (flp
, "rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
2564 "gt_ggc_cache_rtab");
2568 extern int main
PARAMS ((int argc
, char **argv
));
2571 int argc ATTRIBUTE_UNUSED
;
2572 char **argv ATTRIBUTE_UNUSED
;
2575 static struct fileloc pos
= { __FILE__
, __LINE__
};
2580 srcdir_len
= strlen (srcdir
);
2582 do_scalar_typedef ("CUMULATIVE_ARGS", &pos
);
2583 do_scalar_typedef ("REAL_VALUE_TYPE", &pos
);
2584 do_scalar_typedef ("uint8", &pos
);
2585 do_scalar_typedef ("jword", &pos
);
2586 do_scalar_typedef ("JCF_u2", &pos
);
2588 do_typedef ("PTR", create_pointer (create_scalar_type ("void",
2591 do_typedef ("HARD_REG_SET", create_array (
2592 create_scalar_type ("unsigned long", strlen ("unsigned long")),
2595 for (i
= 0; i
< NUM_GT_FILES
; i
++)
2598 /* Omit if already seen. */
2599 for (j
= 0; j
< i
; j
++)
2601 if (!strcmp (all_files
[i
], all_files
[j
]))
2608 parse_file (all_files
[i
]);
2614 set_gc_used (variables
);
2617 write_enum_defn (structures
, param_structs
);
2618 write_gc_types (structures
, param_structs
);
2619 write_gc_roots (variables
);
2621 close_output_files ();
2623 return (hit_error
!= 0);