mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			read-md.c: Move various state to within class rtx_reader
gcc/ChangeLog: * genattrtab.c (attr_string): Use rtx_reader_ptr for call to copy_md_ptr_loc. (gen_attr): Use rtx_reader_ptr for lookup_enum_type call. (write_test_expr): Use rtx_reader_ptr for calls to fprint_c_condition. (write_attr_value): Likewise. * genconditions.c (write_one_condition): Use rtx_reader_ptr for call to print_md_ptr_loc. (write_one_condition): Likewise for calls to print_c_condition. * genconstants.c: Include "statistics.h" and "vec.h". (main): Update for conversion to member functions. * genemit.c (emit_c_code): Use rtx_reader_ptr for call to print_md_ptr_loc. * genenums.c: Include "statistics.h" and "vec.h". (main): Update for conversion of traverse_enum_types to a method. * genmddeps.c: Include "statistics.h" and "vec.h". * genoutput.c (process_template): Use rtx_reader_ptr for call to print_md_ptr_loc. * genpreds.c (write_predicate_subfunction): Likewise. (write_predicate_expr): Likewise for calls to print_c_condition. * genrecog.c (print_test): Likewise. * gensupport.c (process_rtx): Likewise for calls to copy_md_ptr_loc and join_c_conditions. (alter_test_for_insn): Likewise for call to join_c_conditions. (process_substs_on_one_elem): Likewise. (gen_mnemonic_setattr): Update for move of string_obstack to a field of rtx_reader. (mnemonic_htab_callback): Likewise. Fix formatting. (gen_mnemonic_attr): Likewise. * gentarget-def.c (def_target_insn): Use rtx_reader_ptr for calls to print_c_condition. * read-md.c: Include "statistics.h" and "vec.h". (string_obstack): Convert this global to field "m_string_obstack" of class rtx_reader. (ptr_locs): Likewise, as "m_ptr_locs". (ptr_loc_obstack): Likewise, as "m_ptr_loc_obstack". (joined_conditions): Likewise, as "m_joined_conditions". (joined_conditions_obstack): Likewise, as "m_joined_conditions_obstack". (md_constants): Likewise, as "m_md_constants". (enum_types): Likewise, as "m_enum_types". (set_md_ptr_loc): Convert to... (rtx_reader::set_md_ptr_loc): ...member function. (get_md_ptr_loc): Convert to... (rtx_reader::get_md_ptr_loc): ...member function. (copy_md_ptr_loc): Convert to... (rtx_reader::copy_md_ptr_loc): ...member function. (fprint_md_ptr_loc): Convert to... (rtx_reader::fprint_md_ptr_loc): ...member function. (print_md_ptr_loc): Convert to... (rtx_reader::print_md_ptr_loc): ...member function. (join_c_conditions): Convert to... (rtx_reader::join_c_conditions): ...member function. (fprint_c_condition): Convert to... (rtx_reader::fprint_c_condition): ...member function. (print_c_condition): Convert to... (rtx_reader::print_c_condition): ...member function. (read_name): Convert to... (rtx_reader::read_name): ...member function. (read_escape): Convert to... (rtx_reader::read_escape): ...member function. (read_quoted_string): Convert to... (rtx_reader::read_quoted_string): ...member function. (read_braced_string): Convert to... (rtx_reader::read_braced_string): ...member function. (read_string): Convert to... (rtx_reader::read_string): ...member function. (read_skip_construct): Convert to... (rtx_reader::read_skip_construct): ...member function. (handle_constants): Convert to... (rtx_reader::handle_constants): ...member function. (traverse_md_constants): Convert to... (rtx_reader::traverse_md_constants): ...member function. (handle_enum): Convert to... (rtx_reader::handle_enum): ...member function. (lookup_enum_type): Convert to... (rtx_reader::lookup_enum_type): ...member function. (traverse_enum_types): Convert to... (rtx_reader::traverse_enum_types): ...member function. (rtx_reader::rtx_reader): Move initializations of various former global data from rtx_reader::read_md_files to here, as fields, along with the call to unlock_std_streams. (rtx_reader::~rtx_reader): Clean up m_base_dir, and clean up the new fields. (rtx_reader::read_md_files): Move initializations of various global data from here to the ctor. * read-md.h (read_name): Convert to... (rtx_reader::read_name): ...member function. (rtx_reader::read_escape): New method decl. (read_quoted_string): Convert to... (rtx_reader::read_quoted_string): ...member function. (rtx_reader::read_braced_string): New method decl. (read_string): Convert to... (rtx_reader::read_string): ...member function. (rtx_reader::read_skip_construct): New method decl. (rtx_reader::set_md_ptr_loc): New method decl. (rtx_reader::get_md_ptr_loc): New method decl. (copy_md_ptr_loc): Convert to... (rtx_reader::copy_md_ptr_loc): ...member function. (fprint_md_ptr_loc): Convert to... (rtx_reader::fprint_md_ptr_loc): ...member function. (print_md_ptr_loc): Convert to... (rtx_reader::print_md_ptr_loc): ...member function. (rtx_reader::lookup_enum_type): New method decl. (rtx_reader::traverse_enum_types): New method decl. (rtx_reader::handle_constants): New method decl. (traverse_md_constants): Convert to... (rtx_reader::traverse_md_constants): ...member function. (rtx_reader::handle_enum): New method decl. (rtx_reader::join_c_conditions): New method decl. (fprint_c_condition): Convert to... (rtx_reader::fprint_c_condition): ...member function. (print_c_condition): Convert to... (rtx_reader::print_c_condition): ...member function. (rtx_reader::apply_iterator_to_string): New method decl. (rtx_reader::copy_rtx_for_iterators): New method decl. (rtx_reader::read_conditions): New method decl. (rtx_reader::record_potential_iterator_use): New method decl. (rtx_reader::read_mapping): New method decl. (rtx_reader::read_rtx): New method decl. (rtx_reader::read_rtx_code): New method decl. (rtx_reader::read_rtx_operand): New method decl. (rtx_reader::read_nested_rtx): New method decl. (rtx_reader::read_rtx_variadic): New method decl. (rtx_reader::get_string_obstack): New method. (rtx_reader::get_md_constants): New method. (string_obstack): Convert global variable decl to... (rtx_reader::m_string_obstack): ...this new field. (rtx_reader::m_ptr_locs): New field. (rtx_reader::m_ptr_loc_obstack): New field. (rtx_reader::m_joined_conditions): New field. (rtx_reader::m_joined_conditions_obstack): New field. (rtx_reader::m_md_constants): New field. (rtx_reader::m_enum_types): New field. * read-rtl.c (apply_iterator_to_string): Convert to... (rtx_reader::apply_iterator_to_string): ...member function. (copy_rtx_for_iterators): Convert to... (rtx_reader::copy_rtx_for_iterators): ...member function. (add_condition_to_string): Use rtx_reader_ptr for calls join_c_conditions. (apply_iterators): Use rtx_reader_ptr for calls to join_c_conditions and copy_rtx_for_iterators. (read_conditions): Convert to... (rtx_reader::read_conditions): ...member function. (record_potential_iterator_use): Convert to... (rtx_reader::record_potential_iterator_use): ...member function. (read_mapping): Convert to... (rtx_reader::read_mapping): ...member function. (read_subst_mapping): Use rtx_reader_ptr for read_string call. (read_rtx): Convert to... (rtx_reader::read_rtx): ...member function. (read_rtx_code): Convert to... (rtx_reader::read_rtx_code): ...member function. (read_rtx_operand): Convert to... (rtx_reader::read_rtx_operand): ...member function. Update for move of string_obstack to a field. (read_nested_rtx): Convert to.. (rtx_reader::read_nested_rtx): ...member function. (read_rtx_variadic): Convert to.. (rtx_reader::read_rtx_variadic): ...member function. From-SVN: r241293
This commit is contained in:
		
							parent
							
								
									b0ce21917d
								
							
						
					
					
						commit
						b78027d1a3
					
				
							
								
								
									
										162
									
								
								gcc/ChangeLog
								
								
								
								
							
							
						
						
									
										162
									
								
								gcc/ChangeLog
								
								
								
								
							|  | @ -1,3 +1,165 @@ | ||||||
|  | 2016-10-18  David Malcolm  <dmalcolm@redhat.com> | ||||||
|  | 
 | ||||||
|  | 	* genattrtab.c (attr_string): Use rtx_reader_ptr for call to | ||||||
|  | 	copy_md_ptr_loc. | ||||||
|  | 	(gen_attr): Use rtx_reader_ptr for lookup_enum_type call. | ||||||
|  | 	(write_test_expr): Use rtx_reader_ptr for calls to | ||||||
|  | 	fprint_c_condition. | ||||||
|  | 	(write_attr_value): Likewise. | ||||||
|  | 	* genconditions.c (write_one_condition): Use rtx_reader_ptr for | ||||||
|  | 	call to print_md_ptr_loc. | ||||||
|  | 	(write_one_condition): Likewise for calls to print_c_condition. | ||||||
|  | 	* genconstants.c: Include "statistics.h" and "vec.h". | ||||||
|  | 	(main): Update for conversion to member functions. | ||||||
|  | 	* genemit.c (emit_c_code): Use rtx_reader_ptr for | ||||||
|  | 	call to print_md_ptr_loc. | ||||||
|  | 	* genenums.c: Include "statistics.h" and "vec.h". | ||||||
|  | 	(main): Update for conversion of traverse_enum_types to a method. | ||||||
|  | 	* genmddeps.c: Include "statistics.h" and "vec.h". | ||||||
|  | 	* genoutput.c (process_template): Use rtx_reader_ptr for call to | ||||||
|  | 	print_md_ptr_loc. | ||||||
|  | 	* genpreds.c (write_predicate_subfunction): Likewise. | ||||||
|  | 	(write_predicate_expr): Likewise for calls to print_c_condition. | ||||||
|  | 	* genrecog.c (print_test): Likewise. | ||||||
|  | 	* gensupport.c (process_rtx): Likewise for calls to | ||||||
|  | 	copy_md_ptr_loc and join_c_conditions. | ||||||
|  | 	(alter_test_for_insn): Likewise for call to join_c_conditions. | ||||||
|  | 	(process_substs_on_one_elem): Likewise. | ||||||
|  | 	(gen_mnemonic_setattr): Update for move of string_obstack to a | ||||||
|  | 	field of rtx_reader. | ||||||
|  | 	(mnemonic_htab_callback): Likewise.  Fix formatting. | ||||||
|  | 	(gen_mnemonic_attr): Likewise. | ||||||
|  | 	* gentarget-def.c (def_target_insn): Use rtx_reader_ptr for calls | ||||||
|  | 	to print_c_condition. | ||||||
|  | 	* read-md.c: Include "statistics.h" and "vec.h". | ||||||
|  | 	(string_obstack): Convert this global to field "m_string_obstack" | ||||||
|  | 	of class rtx_reader. | ||||||
|  | 	(ptr_locs): Likewise, as "m_ptr_locs". | ||||||
|  | 	(ptr_loc_obstack): Likewise, as "m_ptr_loc_obstack". | ||||||
|  | 	(joined_conditions): Likewise, as "m_joined_conditions". | ||||||
|  | 	(joined_conditions_obstack): Likewise, as "m_joined_conditions_obstack". | ||||||
|  | 	(md_constants): Likewise, as "m_md_constants". | ||||||
|  | 	(enum_types): Likewise, as "m_enum_types". | ||||||
|  | 	(set_md_ptr_loc): Convert to... | ||||||
|  | 	(rtx_reader::set_md_ptr_loc): ...member function. | ||||||
|  | 	(get_md_ptr_loc): Convert to... | ||||||
|  | 	(rtx_reader::get_md_ptr_loc): ...member function. | ||||||
|  | 	(copy_md_ptr_loc): Convert to... | ||||||
|  | 	(rtx_reader::copy_md_ptr_loc): ...member function. | ||||||
|  | 	(fprint_md_ptr_loc): Convert to... | ||||||
|  | 	(rtx_reader::fprint_md_ptr_loc): ...member function. | ||||||
|  | 	(print_md_ptr_loc): Convert to... | ||||||
|  | 	(rtx_reader::print_md_ptr_loc): ...member function. | ||||||
|  | 	(join_c_conditions): Convert to... | ||||||
|  | 	(rtx_reader::join_c_conditions): ...member function. | ||||||
|  | 	(fprint_c_condition): Convert to... | ||||||
|  | 	(rtx_reader::fprint_c_condition): ...member function. | ||||||
|  | 	(print_c_condition): Convert to... | ||||||
|  | 	(rtx_reader::print_c_condition): ...member function. | ||||||
|  | 	(read_name): Convert to... | ||||||
|  | 	(rtx_reader::read_name): ...member function. | ||||||
|  | 	(read_escape): Convert to... | ||||||
|  | 	(rtx_reader::read_escape): ...member function. | ||||||
|  | 	(read_quoted_string): Convert to... | ||||||
|  | 	(rtx_reader::read_quoted_string): ...member function. | ||||||
|  | 	(read_braced_string): Convert to... | ||||||
|  | 	(rtx_reader::read_braced_string): ...member function. | ||||||
|  | 	(read_string): Convert to... | ||||||
|  | 	(rtx_reader::read_string): ...member function. | ||||||
|  | 	(read_skip_construct): Convert to... | ||||||
|  | 	(rtx_reader::read_skip_construct): ...member function. | ||||||
|  | 	(handle_constants): Convert to... | ||||||
|  | 	(rtx_reader::handle_constants): ...member function. | ||||||
|  | 	(traverse_md_constants): Convert to... | ||||||
|  | 	(rtx_reader::traverse_md_constants): ...member function. | ||||||
|  | 	(handle_enum): Convert to... | ||||||
|  | 	(rtx_reader::handle_enum): ...member function. | ||||||
|  | 	(lookup_enum_type): Convert to... | ||||||
|  | 	(rtx_reader::lookup_enum_type): ...member function. | ||||||
|  | 	(traverse_enum_types): Convert to... | ||||||
|  | 	(rtx_reader::traverse_enum_types): ...member function. | ||||||
|  | 	(rtx_reader::rtx_reader): Move initializations | ||||||
|  | 	of various former global data from rtx_reader::read_md_files to | ||||||
|  | 	here, as fields, along with the call to unlock_std_streams. | ||||||
|  | 	(rtx_reader::~rtx_reader): Clean up m_base_dir, and clean up | ||||||
|  | 	the new fields. | ||||||
|  | 	(rtx_reader::read_md_files): Move initializations of various | ||||||
|  | 	global data from here to the ctor. | ||||||
|  | 	* read-md.h (read_name): Convert to... | ||||||
|  | 	(rtx_reader::read_name): ...member function. | ||||||
|  | 	(rtx_reader::read_escape): New method decl. | ||||||
|  | 	(read_quoted_string): Convert to... | ||||||
|  | 	(rtx_reader::read_quoted_string): ...member function. | ||||||
|  | 	(rtx_reader::read_braced_string): New method decl. | ||||||
|  | 	(read_string): Convert to... | ||||||
|  | 	(rtx_reader::read_string): ...member function. | ||||||
|  | 	(rtx_reader::read_skip_construct): New method decl. | ||||||
|  | 	(rtx_reader::set_md_ptr_loc): New method decl. | ||||||
|  | 	(rtx_reader::get_md_ptr_loc): New method decl. | ||||||
|  | 	(copy_md_ptr_loc): Convert to... | ||||||
|  | 	(rtx_reader::copy_md_ptr_loc): ...member function. | ||||||
|  | 	(fprint_md_ptr_loc): Convert to... | ||||||
|  | 	(rtx_reader::fprint_md_ptr_loc): ...member function. | ||||||
|  | 	(print_md_ptr_loc): Convert to... | ||||||
|  | 	(rtx_reader::print_md_ptr_loc): ...member function. | ||||||
|  | 	(rtx_reader::lookup_enum_type): New method decl. | ||||||
|  | 	(rtx_reader::traverse_enum_types): New method decl. | ||||||
|  | 	(rtx_reader::handle_constants): New method decl. | ||||||
|  | 	(traverse_md_constants): Convert to... | ||||||
|  | 	(rtx_reader::traverse_md_constants): ...member function. | ||||||
|  | 	(rtx_reader::handle_enum): New method decl. | ||||||
|  | 	(rtx_reader::join_c_conditions): New method decl. | ||||||
|  | 	(fprint_c_condition): Convert to... | ||||||
|  | 	(rtx_reader::fprint_c_condition): ...member function. | ||||||
|  | 	(print_c_condition): Convert to... | ||||||
|  | 	(rtx_reader::print_c_condition): ...member function. | ||||||
|  | 	(rtx_reader::apply_iterator_to_string): New method decl. | ||||||
|  | 	(rtx_reader::copy_rtx_for_iterators): New method decl. | ||||||
|  | 	(rtx_reader::read_conditions): New method decl. | ||||||
|  | 	(rtx_reader::record_potential_iterator_use): New method decl. | ||||||
|  | 	(rtx_reader::read_mapping): New method decl. | ||||||
|  | 	(rtx_reader::read_rtx): New method decl. | ||||||
|  | 	(rtx_reader::read_rtx_code): New method decl. | ||||||
|  | 	(rtx_reader::read_rtx_operand): New method decl. | ||||||
|  | 	(rtx_reader::read_nested_rtx): New method decl. | ||||||
|  | 	(rtx_reader::read_rtx_variadic): New method decl. | ||||||
|  | 	(rtx_reader::get_string_obstack): New method. | ||||||
|  | 	(rtx_reader::get_md_constants): New method. | ||||||
|  | 	(string_obstack): Convert global variable decl to... | ||||||
|  | 	(rtx_reader::m_string_obstack): ...this new field. | ||||||
|  | 	(rtx_reader::m_ptr_locs): New field. | ||||||
|  | 	(rtx_reader::m_ptr_loc_obstack): New field. | ||||||
|  | 	(rtx_reader::m_joined_conditions): New field. | ||||||
|  | 	(rtx_reader::m_joined_conditions_obstack): New field. | ||||||
|  | 	(rtx_reader::m_md_constants): New field. | ||||||
|  | 	(rtx_reader::m_enum_types): New field. | ||||||
|  | 	* read-rtl.c (apply_iterator_to_string): Convert to... | ||||||
|  | 	(rtx_reader::apply_iterator_to_string): ...member function. | ||||||
|  | 	(copy_rtx_for_iterators): Convert to... | ||||||
|  | 	(rtx_reader::copy_rtx_for_iterators): ...member function. | ||||||
|  | 	(add_condition_to_string): Use rtx_reader_ptr for | ||||||
|  | 	calls join_c_conditions. | ||||||
|  | 	(apply_iterators): Use rtx_reader_ptr for calls to | ||||||
|  | 	join_c_conditions and copy_rtx_for_iterators. | ||||||
|  | 	(read_conditions): Convert to... | ||||||
|  | 	(rtx_reader::read_conditions): ...member function. | ||||||
|  | 	(record_potential_iterator_use): Convert to... | ||||||
|  | 	(rtx_reader::record_potential_iterator_use): ...member function. | ||||||
|  | 	(read_mapping): Convert to... | ||||||
|  | 	(rtx_reader::read_mapping): ...member function. | ||||||
|  | 	(read_subst_mapping): Use rtx_reader_ptr for read_string call. | ||||||
|  | 	(read_rtx): Convert to... | ||||||
|  | 	(rtx_reader::read_rtx): ...member function. | ||||||
|  | 	(read_rtx_code): Convert to... | ||||||
|  | 	(rtx_reader::read_rtx_code): ...member function. | ||||||
|  | 	(read_rtx_operand): Convert to... | ||||||
|  | 	(rtx_reader::read_rtx_operand): ...member function.  Update for move | ||||||
|  | 	of string_obstack to a field. | ||||||
|  | 	(read_nested_rtx): Convert to.. | ||||||
|  | 	(rtx_reader::read_nested_rtx): ...member function. | ||||||
|  | 	(read_rtx_variadic): Convert to.. | ||||||
|  | 	(rtx_reader::read_rtx_variadic): ...member function. | ||||||
|  | 
 | ||||||
| 2016-10-18  Kugan Vivekanandarajah  <kuganv@linaro.org> | 2016-10-18  Kugan Vivekanandarajah  <kuganv@linaro.org> | ||||||
| 
 | 
 | ||||||
| 	* tree-vrp.c (get_value_range): Check get_ptr_nonnull. | 	* tree-vrp.c (get_value_range): Check get_ptr_nonnull. | ||||||
|  |  | ||||||
|  | @ -630,7 +630,7 @@ attr_string (const char *str, int len) | ||||||
|   memcpy (new_str, str, len); |   memcpy (new_str, str, len); | ||||||
|   new_str[len] = '\0'; |   new_str[len] = '\0'; | ||||||
|   attr_hash_add_string (hashcode, new_str); |   attr_hash_add_string (hashcode, new_str); | ||||||
|   copy_md_ptr_loc (new_str, str); |   rtx_reader_ptr->copy_md_ptr_loc (new_str, str); | ||||||
| 
 | 
 | ||||||
|   return new_str;			/* Return the new string.  */ |   return new_str;			/* Return the new string.  */ | ||||||
| } | } | ||||||
|  | @ -3157,7 +3157,7 @@ gen_attr (md_rtx_info *info) | ||||||
|   if (GET_CODE (def) == DEFINE_ENUM_ATTR) |   if (GET_CODE (def) == DEFINE_ENUM_ATTR) | ||||||
|     { |     { | ||||||
|       attr->enum_name = XSTR (def, 1); |       attr->enum_name = XSTR (def, 1); | ||||||
|       et = lookup_enum_type (XSTR (def, 1)); |       et = rtx_reader_ptr->lookup_enum_type (XSTR (def, 1)); | ||||||
|       if (!et || !et->md_p) |       if (!et || !et->md_p) | ||||||
| 	error_at (info->loc, "No define_enum called `%s' defined", | 	error_at (info->loc, "No define_enum called `%s' defined", | ||||||
| 		  attr->name); | 		  attr->name); | ||||||
|  | @ -3768,14 +3768,14 @@ write_test_expr (FILE *outf, rtx exp, unsigned int attrs_cached, int flags, | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|     case MATCH_TEST: |     case MATCH_TEST: | ||||||
|       fprint_c_condition (outf, XSTR (exp, 0)); |       rtx_reader_ptr->fprint_c_condition (outf, XSTR (exp, 0)); | ||||||
|       if (flags & FLG_BITWISE) |       if (flags & FLG_BITWISE) | ||||||
| 	fprintf (outf, " != 0"); | 	fprintf (outf, " != 0"); | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|     /* A random C expression.  */ |     /* A random C expression.  */ | ||||||
|     case SYMBOL_REF: |     case SYMBOL_REF: | ||||||
|       fprint_c_condition (outf, XSTR (exp, 0)); |       rtx_reader_ptr->fprint_c_condition (outf, XSTR (exp, 0)); | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|     /* The address of the branch target.  */ |     /* The address of the branch target.  */ | ||||||
|  | @ -4365,7 +4365,7 @@ write_attr_value (FILE *outf, struct attr_desc *attr, rtx value) | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|     case SYMBOL_REF: |     case SYMBOL_REF: | ||||||
|       fprint_c_condition (outf, XSTR (value, 0)); |       rtx_reader_ptr->fprint_c_condition (outf, XSTR (value, 0)); | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|     case ATTR: |     case ATTR: | ||||||
|  |  | ||||||
|  | @ -124,7 +124,7 @@ write_one_condition (void **slot, void * ARG_UNUSED (dummy)) | ||||||
|   const struct c_test *test = * (const struct c_test **) slot; |   const struct c_test *test = * (const struct c_test **) slot; | ||||||
|   const char *p; |   const char *p; | ||||||
| 
 | 
 | ||||||
|   print_md_ptr_loc (test->expr); |   rtx_reader_ptr->print_md_ptr_loc (test->expr); | ||||||
|   fputs ("  { \"", stdout); |   fputs ("  { \"", stdout); | ||||||
|   for (p = test->expr; *p; p++) |   for (p = test->expr; *p; p++) | ||||||
|     { |     { | ||||||
|  | @ -139,9 +139,9 @@ write_one_condition (void **slot, void * ARG_UNUSED (dummy)) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   fputs ("\",\n    __builtin_constant_p ", stdout); |   fputs ("\",\n    __builtin_constant_p ", stdout); | ||||||
|   print_c_condition (test->expr); |   rtx_reader_ptr->print_c_condition (test->expr); | ||||||
|   fputs ("\n    ? (int) ", stdout); |   fputs ("\n    ? (int) ", stdout); | ||||||
|   print_c_condition (test->expr); |   rtx_reader_ptr->print_c_condition (test->expr); | ||||||
|   fputs ("\n    : -1 },\n", stdout); |   fputs ("\n    : -1 },\n", stdout); | ||||||
|   return 1; |   return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -28,6 +28,8 @@ along with GCC; see the file COPYING3.  If not see | ||||||
| #include "system.h" | #include "system.h" | ||||||
| #include "coretypes.h" | #include "coretypes.h" | ||||||
| #include "errors.h" | #include "errors.h" | ||||||
|  | #include "statistics.h" | ||||||
|  | #include "vec.h" | ||||||
| #include "read-md.h" | #include "read-md.h" | ||||||
| 
 | 
 | ||||||
| /* Called via traverse_md_constants; emit a #define for
 | /* Called via traverse_md_constants; emit a #define for
 | ||||||
|  | @ -91,8 +93,8 @@ main (int argc, const char **argv) | ||||||
|   puts ("#ifndef GCC_INSN_CONSTANTS_H"); |   puts ("#ifndef GCC_INSN_CONSTANTS_H"); | ||||||
|   puts ("#define GCC_INSN_CONSTANTS_H\n"); |   puts ("#define GCC_INSN_CONSTANTS_H\n"); | ||||||
| 
 | 
 | ||||||
|   traverse_md_constants (print_md_constant, 0); |   reader.traverse_md_constants (print_md_constant, 0); | ||||||
|   traverse_enum_types (print_enum_type, 0); |   reader.traverse_enum_types (print_enum_type, 0); | ||||||
| 
 | 
 | ||||||
|   puts ("\n#endif /* GCC_INSN_CONSTANTS_H */"); |   puts ("\n#endif /* GCC_INSN_CONSTANTS_H */"); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -302,7 +302,7 @@ emit_c_code (const char *code, bool can_fail_p, const char *name) | ||||||
|   printf ("#define DONE return (_val = get_insns ()," |   printf ("#define DONE return (_val = get_insns ()," | ||||||
| 	  "end_sequence (), _val)\n"); | 	  "end_sequence (), _val)\n"); | ||||||
| 
 | 
 | ||||||
|   print_md_ptr_loc (code); |   rtx_reader_ptr->print_md_ptr_loc (code); | ||||||
|   printf ("%s\n", code); |   printf ("%s\n", code); | ||||||
| 
 | 
 | ||||||
|   printf ("#undef DONE\n"); |   printf ("#undef DONE\n"); | ||||||
|  |  | ||||||
|  | @ -21,6 +21,8 @@ along with GCC; see the file COPYING3.  If not see | ||||||
| #include "system.h" | #include "system.h" | ||||||
| #include "coretypes.h" | #include "coretypes.h" | ||||||
| #include "errors.h" | #include "errors.h" | ||||||
|  | #include "statistics.h" | ||||||
|  | #include "vec.h" | ||||||
| #include "read-md.h" | #include "read-md.h" | ||||||
| 
 | 
 | ||||||
| /* Called via traverse_enum_types.  Emit an enum definition for
 | /* Called via traverse_enum_types.  Emit an enum definition for
 | ||||||
|  | @ -59,7 +61,7 @@ main (int argc, const char **argv) | ||||||
|   puts ("#include \"system.h\"\n"); |   puts ("#include \"system.h\"\n"); | ||||||
|   puts ("#include \"insn-constants.h\"\n"); |   puts ("#include \"insn-constants.h\"\n"); | ||||||
| 
 | 
 | ||||||
|   traverse_enum_types (print_enum_type, 0); |   reader.traverse_enum_types (print_enum_type, 0); | ||||||
| 
 | 
 | ||||||
|   if (ferror (stdout) || fflush (stdout) || fclose (stdout)) |   if (ferror (stdout) || fflush (stdout) || fclose (stdout)) | ||||||
|     return FATAL_EXIT_CODE; |     return FATAL_EXIT_CODE; | ||||||
|  |  | ||||||
|  | @ -19,6 +19,8 @@ | ||||||
| #include "system.h" | #include "system.h" | ||||||
| #include "coretypes.h" | #include "coretypes.h" | ||||||
| #include "errors.h" | #include "errors.h" | ||||||
|  | #include "statistics.h" | ||||||
|  | #include "vec.h" | ||||||
| #include "read-md.h" | #include "read-md.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -631,7 +631,7 @@ process_template (struct data *d, const char *template_code) | ||||||
|       printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, rtx_insn *insn ATTRIBUTE_UNUSED)\n", |       printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, rtx_insn *insn ATTRIBUTE_UNUSED)\n", | ||||||
| 	      d->code_number); | 	      d->code_number); | ||||||
|       puts ("{"); |       puts ("{"); | ||||||
|       print_md_ptr_loc (template_code); |       rtx_reader_ptr->print_md_ptr_loc (template_code); | ||||||
|       puts (template_code + 1); |       puts (template_code + 1); | ||||||
|       puts ("}"); |       puts ("}"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -154,7 +154,7 @@ write_predicate_subfunction (struct pred_data *p) | ||||||
|   printf ("static inline int\n" |   printf ("static inline int\n" | ||||||
| 	  "%s_1 (rtx op, machine_mode mode ATTRIBUTE_UNUSED)\n", | 	  "%s_1 (rtx op, machine_mode mode ATTRIBUTE_UNUSED)\n", | ||||||
| 	  p->name); | 	  p->name); | ||||||
|   print_md_ptr_loc (p->c_block); |   rtx_reader_ptr->print_md_ptr_loc (p->c_block); | ||||||
|   if (p->c_block[0] == '{') |   if (p->c_block[0] == '{') | ||||||
|     fputs (p->c_block, stdout); |     fputs (p->c_block, stdout); | ||||||
|   else |   else | ||||||
|  | @ -538,7 +538,7 @@ write_predicate_expr (rtx exp) | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|     case MATCH_TEST: |     case MATCH_TEST: | ||||||
|       print_c_condition (XSTR (exp, 0)); |       rtx_reader_ptr->print_c_condition (XSTR (exp, 0)); | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|     default: |     default: | ||||||
|  |  | ||||||
|  | @ -4659,7 +4659,7 @@ print_test (output_state *os, const rtx_test &test, bool is_param, | ||||||
|       gcc_assert (!is_param && value == 1); |       gcc_assert (!is_param && value == 1); | ||||||
|       if (invert_p) |       if (invert_p) | ||||||
| 	printf ("!"); | 	printf ("!"); | ||||||
|       print_c_condition (test.u.string); |       rtx_reader_ptr->print_c_condition (test.u.string); | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|     case rtx_test::ACCEPT: |     case rtx_test::ACCEPT: | ||||||
|  |  | ||||||
|  | @ -551,8 +551,9 @@ process_rtx (rtx desc, file_location loc) | ||||||
| 	split_cond = XSTR (desc, 4); | 	split_cond = XSTR (desc, 4); | ||||||
| 	if (split_cond[0] == '&' && split_cond[1] == '&') | 	if (split_cond[0] == '&' && split_cond[1] == '&') | ||||||
| 	  { | 	  { | ||||||
| 	    copy_md_ptr_loc (split_cond + 2, split_cond); | 	    rtx_reader_ptr->copy_md_ptr_loc (split_cond + 2, split_cond); | ||||||
| 	    split_cond = join_c_conditions (XSTR (desc, 2), split_cond + 2); | 	    split_cond = rtx_reader_ptr->join_c_conditions (XSTR (desc, 2), | ||||||
|  | 							    split_cond + 2); | ||||||
| 	  } | 	  } | ||||||
| 	XSTR (split, 1) = split_cond; | 	XSTR (split, 1) = split_cond; | ||||||
| 	XVEC (split, 2) = XVEC (desc, 5); | 	XVEC (split, 2) = XVEC (desc, 5); | ||||||
|  | @ -1262,8 +1263,8 @@ static const char * | ||||||
| alter_test_for_insn (struct queue_elem *ce_elem, | alter_test_for_insn (struct queue_elem *ce_elem, | ||||||
| 		     struct queue_elem *insn_elem) | 		     struct queue_elem *insn_elem) | ||||||
| { | { | ||||||
|   return join_c_conditions (XSTR (ce_elem->data, 1), |   return rtx_reader_ptr->join_c_conditions (XSTR (ce_elem->data, 1), | ||||||
| 			    XSTR (insn_elem->data, 2)); | 					    XSTR (insn_elem->data, 2)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Modify VAL, which is an attribute expression for the "enabled" attribute,
 | /* Modify VAL, which is an attribute expression for the "enabled" attribute,
 | ||||||
|  | @ -1871,8 +1872,9 @@ process_substs_on_one_elem (struct queue_elem *elem, | ||||||
| 
 | 
 | ||||||
|       /* Recalculate condition, joining conditions from original and
 |       /* Recalculate condition, joining conditions from original and
 | ||||||
| 	 DEFINE_SUBST input patterns.  */ | 	 DEFINE_SUBST input patterns.  */ | ||||||
|       XSTR (elem->data, 2) = join_c_conditions (XSTR (subst_elem->data, 2), |       XSTR (elem->data, 2) | ||||||
| 						XSTR (elem->data, 2)); | 	= rtx_reader_ptr->join_c_conditions (XSTR (subst_elem->data, 2), | ||||||
|  | 					     XSTR (elem->data, 2)); | ||||||
|       /* Mark that subst was applied by changing attribute from "yes"
 |       /* Mark that subst was applied by changing attribute from "yes"
 | ||||||
| 	 to "no".  */ | 	 to "no".  */ | ||||||
|       change_subst_attribute (elem, subst_elem, subst_false); |       change_subst_attribute (elem, subst_elem, subst_false); | ||||||
|  | @ -2299,6 +2301,7 @@ gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn) | ||||||
|   rtx set_attr; |   rtx set_attr; | ||||||
|   char *attr_name; |   char *attr_name; | ||||||
|   rtvec new_vec; |   rtvec new_vec; | ||||||
|  |   struct obstack *string_obstack = rtx_reader_ptr->get_string_obstack (); | ||||||
| 
 | 
 | ||||||
|   template_code = XTMPL (insn, 3); |   template_code = XTMPL (insn, 3); | ||||||
| 
 | 
 | ||||||
|  | @ -2324,13 +2327,13 @@ gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn) | ||||||
| 	  sp = ep + 1; | 	  sp = ep + 1; | ||||||
| 
 | 
 | ||||||
|       if (i > 0) |       if (i > 0) | ||||||
| 	obstack_1grow (&string_obstack, ','); | 	obstack_1grow (string_obstack, ','); | ||||||
| 
 | 
 | ||||||
|       while (cp < sp && ((*cp >= '0' && *cp <= '9') |       while (cp < sp && ((*cp >= '0' && *cp <= '9') | ||||||
| 			 || (*cp >= 'a' && *cp <= 'z'))) | 			 || (*cp >= 'a' && *cp <= 'z'))) | ||||||
| 
 | 
 | ||||||
| 	{ | 	{ | ||||||
| 	  obstack_1grow (&string_obstack, *cp); | 	  obstack_1grow (string_obstack, *cp); | ||||||
| 	  cp++; | 	  cp++; | ||||||
| 	  size++; | 	  size++; | ||||||
| 	} | 	} | ||||||
|  | @ -2341,7 +2344,7 @@ gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn) | ||||||
| 	    { | 	    { | ||||||
| 	      /* Don't set a value if there are more than one
 | 	      /* Don't set a value if there are more than one
 | ||||||
| 		 instruction in the string.  */ | 		 instruction in the string.  */ | ||||||
| 	      obstack_blank_fast (&string_obstack, -size); | 	      obstack_blank_fast (string_obstack, -size); | ||||||
| 	      size = 0; | 	      size = 0; | ||||||
| 
 | 
 | ||||||
| 	      cp = sp; | 	      cp = sp; | ||||||
|  | @ -2350,22 +2353,22 @@ gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn) | ||||||
| 	  cp++; | 	  cp++; | ||||||
| 	} | 	} | ||||||
|       if (size == 0) |       if (size == 0) | ||||||
| 	obstack_1grow (&string_obstack, '*'); | 	obstack_1grow (string_obstack, '*'); | ||||||
|       else |       else | ||||||
| 	add_mnemonic_string (mnemonic_htab, | 	add_mnemonic_string (mnemonic_htab, | ||||||
| 			     (char *) obstack_next_free (&string_obstack) - size, | 			     (char *) obstack_next_free (string_obstack) - size, | ||||||
| 			     size); | 			     size); | ||||||
|       i++; |       i++; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   /* An insn definition might emit an empty string.  */ |   /* An insn definition might emit an empty string.  */ | ||||||
|   if (obstack_object_size (&string_obstack) == 0) |   if (obstack_object_size (string_obstack) == 0) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|   obstack_1grow (&string_obstack, '\0'); |   obstack_1grow (string_obstack, '\0'); | ||||||
| 
 | 
 | ||||||
|   set_attr = rtx_alloc (SET_ATTR); |   set_attr = rtx_alloc (SET_ATTR); | ||||||
|   XSTR (set_attr, 1) = XOBFINISH (&string_obstack, char *); |   XSTR (set_attr, 1) = XOBFINISH (string_obstack, char *); | ||||||
|   attr_name = XNEWVAR (char, strlen (MNEMONIC_ATTR_NAME) + 1); |   attr_name = XNEWVAR (char, strlen (MNEMONIC_ATTR_NAME) + 1); | ||||||
|   strcpy (attr_name, MNEMONIC_ATTR_NAME); |   strcpy (attr_name, MNEMONIC_ATTR_NAME); | ||||||
|   XSTR (set_attr, 0) = attr_name; |   XSTR (set_attr, 0) = attr_name; | ||||||
|  | @ -2388,8 +2391,10 @@ gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn) | ||||||
| static int | static int | ||||||
| mnemonic_htab_callback (void **slot, void *info ATTRIBUTE_UNUSED) | mnemonic_htab_callback (void **slot, void *info ATTRIBUTE_UNUSED) | ||||||
| { | { | ||||||
|   obstack_grow (&string_obstack, (char*)*slot, strlen ((char*)*slot)); |   struct obstack *string_obstack = rtx_reader_ptr->get_string_obstack (); | ||||||
|   obstack_1grow (&string_obstack, ','); | 
 | ||||||
|  |   obstack_grow (string_obstack, (char*) *slot, strlen ((char*) *slot)); | ||||||
|  |   obstack_1grow (string_obstack, ','); | ||||||
|   return 1; |   return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -2407,6 +2412,7 @@ gen_mnemonic_attr (void) | ||||||
|   htab_t mnemonic_htab; |   htab_t mnemonic_htab; | ||||||
|   const char *str, *p; |   const char *str, *p; | ||||||
|   int i; |   int i; | ||||||
|  |   struct obstack *string_obstack = rtx_reader_ptr->get_string_obstack (); | ||||||
| 
 | 
 | ||||||
|   if (have_error) |   if (have_error) | ||||||
|     return; |     return; | ||||||
|  | @ -2470,8 +2476,8 @@ gen_mnemonic_attr (void) | ||||||
|   htab_traverse (mnemonic_htab, mnemonic_htab_callback, NULL); |   htab_traverse (mnemonic_htab, mnemonic_htab_callback, NULL); | ||||||
| 
 | 
 | ||||||
|   /* Replace the last ',' with the zero end character.  */ |   /* Replace the last ',' with the zero end character.  */ | ||||||
|   *((char *)obstack_next_free (&string_obstack) - 1) = '\0'; |   *((char *) obstack_next_free (string_obstack) - 1) = '\0'; | ||||||
|   XSTR (mnemonic_attr, 1) = XOBFINISH (&string_obstack, char *); |   XSTR (mnemonic_attr, 1) = XOBFINISH (string_obstack, char *); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Check if there are DEFINE_ATTRs with the same name.  */ | /* Check if there are DEFINE_ATTRs with the same name.  */ | ||||||
|  |  | ||||||
|  | @ -191,7 +191,7 @@ def_target_insn (const char *name, const char *prototype) | ||||||
| 	      printf ("target_have_%s (void)\n", name); | 	      printf ("target_have_%s (void)\n", name); | ||||||
| 	      printf ("{\n"); | 	      printf ("{\n"); | ||||||
| 	      printf ("  return "); | 	      printf ("  return "); | ||||||
| 	      print_c_condition (test); | 	      rtx_reader_ptr->print_c_condition (test); | ||||||
| 	      printf (";\n"); | 	      printf (";\n"); | ||||||
| 	      printf ("}\n"); | 	      printf ("}\n"); | ||||||
| 	    } | 	    } | ||||||
|  |  | ||||||
							
								
								
									
										195
									
								
								gcc/read-md.c
								
								
								
								
							
							
						
						
									
										195
									
								
								gcc/read-md.c
								
								
								
								
							|  | @ -21,6 +21,8 @@ along with GCC; see the file COPYING3.  If not see | ||||||
| #include "system.h" | #include "system.h" | ||||||
| #include "coretypes.h" | #include "coretypes.h" | ||||||
| #include "errors.h" | #include "errors.h" | ||||||
|  | #include "statistics.h" | ||||||
|  | #include "vec.h" | ||||||
| #include "read-md.h" | #include "read-md.h" | ||||||
| 
 | 
 | ||||||
| /* Associates PTR (which can be a string, etc.) with the file location
 | /* Associates PTR (which can be a string, etc.) with the file location
 | ||||||
|  | @ -31,25 +33,6 @@ struct ptr_loc { | ||||||
|   int lineno; |   int lineno; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* Obstack used for allocating MD strings.  */ |  | ||||||
| struct obstack string_obstack; |  | ||||||
| 
 |  | ||||||
| /* A table of ptr_locs, hashed on the PTR field.  */ |  | ||||||
| static htab_t ptr_locs; |  | ||||||
| 
 |  | ||||||
| /* An obstack for the above.  Plain xmalloc is a bit heavyweight for a
 |  | ||||||
|    small structure like ptr_loc.  */ |  | ||||||
| static struct obstack ptr_loc_obstack; |  | ||||||
| 
 |  | ||||||
| /* A hash table of triples (A, B, C), where each of A, B and C is a condition
 |  | ||||||
|    and A is equivalent to "B && C".  This is used to keep track of the source |  | ||||||
|    of conditions that are made up of separate MD strings (such as the split |  | ||||||
|    condition of a define_insn_and_split).  */ |  | ||||||
| static htab_t joined_conditions; |  | ||||||
| 
 |  | ||||||
| /* An obstack for allocating joined_conditions entries.  */ |  | ||||||
| static struct obstack joined_conditions_obstack; |  | ||||||
| 
 |  | ||||||
| /* This callback will be invoked whenever an md include directive is
 | /* This callback will be invoked whenever an md include directive is
 | ||||||
|    processed.  To be used for creation of the dependency file.  */ |    processed.  To be used for creation of the dependency file.  */ | ||||||
| void (*include_callback) (const char *); | void (*include_callback) (const char *); | ||||||
|  | @ -58,13 +41,6 @@ void (*include_callback) (const char *); | ||||||
| 
 | 
 | ||||||
| rtx_reader *rtx_reader_ptr; | rtx_reader *rtx_reader_ptr; | ||||||
| 
 | 
 | ||||||
| /* A table of md_constant structures, hashed by name.  Null if no
 |  | ||||||
|    constant expansion should occur.  */ |  | ||||||
| static htab_t md_constants; |  | ||||||
| 
 |  | ||||||
| /* A table of enum_type structures, hashed by name.  */ |  | ||||||
| static htab_t enum_types; |  | ||||||
| 
 |  | ||||||
| /* Given an object that starts with a char * name field, return a hash
 | /* Given an object that starts with a char * name field, return a hash
 | ||||||
|    code for its name.  */ |    code for its name.  */ | ||||||
| 
 | 
 | ||||||
|  | @ -102,32 +78,32 @@ leading_ptr_eq_p (const void *def1, const void *def2) | ||||||
| 
 | 
 | ||||||
| /* Associate PTR with the file position given by FILENAME and LINENO.  */ | /* Associate PTR with the file position given by FILENAME and LINENO.  */ | ||||||
| 
 | 
 | ||||||
| static void | void | ||||||
| set_md_ptr_loc (const void *ptr, const char *filename, int lineno) | rtx_reader::set_md_ptr_loc (const void *ptr, const char *filename, int lineno) | ||||||
| { | { | ||||||
|   struct ptr_loc *loc; |   struct ptr_loc *loc; | ||||||
| 
 | 
 | ||||||
|   loc = (struct ptr_loc *) obstack_alloc (&ptr_loc_obstack, |   loc = (struct ptr_loc *) obstack_alloc (&m_ptr_loc_obstack, | ||||||
| 					  sizeof (struct ptr_loc)); | 					  sizeof (struct ptr_loc)); | ||||||
|   loc->ptr = ptr; |   loc->ptr = ptr; | ||||||
|   loc->filename = filename; |   loc->filename = filename; | ||||||
|   loc->lineno = lineno; |   loc->lineno = lineno; | ||||||
|   *htab_find_slot (ptr_locs, loc, INSERT) = loc; |   *htab_find_slot (m_ptr_locs, loc, INSERT) = loc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Return the position associated with pointer PTR.  Return null if no
 | /* Return the position associated with pointer PTR.  Return null if no
 | ||||||
|    position was set.  */ |    position was set.  */ | ||||||
| 
 | 
 | ||||||
| static const struct ptr_loc * | const struct ptr_loc * | ||||||
| get_md_ptr_loc (const void *ptr) | rtx_reader::get_md_ptr_loc (const void *ptr) | ||||||
| { | { | ||||||
|   return (const struct ptr_loc *) htab_find (ptr_locs, &ptr); |   return (const struct ptr_loc *) htab_find (m_ptr_locs, &ptr); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Associate NEW_PTR with the same file position as OLD_PTR.  */ | /* Associate NEW_PTR with the same file position as OLD_PTR.  */ | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| copy_md_ptr_loc (const void *new_ptr, const void *old_ptr) | rtx_reader::copy_md_ptr_loc (const void *new_ptr, const void *old_ptr) | ||||||
| { | { | ||||||
|   const struct ptr_loc *loc = get_md_ptr_loc (old_ptr); |   const struct ptr_loc *loc = get_md_ptr_loc (old_ptr); | ||||||
|   if (loc != 0) |   if (loc != 0) | ||||||
|  | @ -138,7 +114,7 @@ copy_md_ptr_loc (const void *new_ptr, const void *old_ptr) | ||||||
|    directive for it to OUTF.  */ |    directive for it to OUTF.  */ | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| fprint_md_ptr_loc (FILE *outf, const void *ptr) | rtx_reader::fprint_md_ptr_loc (FILE *outf, const void *ptr) | ||||||
| { | { | ||||||
|   const struct ptr_loc *loc = get_md_ptr_loc (ptr); |   const struct ptr_loc *loc = get_md_ptr_loc (ptr); | ||||||
|   if (loc != 0) |   if (loc != 0) | ||||||
|  | @ -147,7 +123,7 @@ fprint_md_ptr_loc (FILE *outf, const void *ptr) | ||||||
| 
 | 
 | ||||||
| /* Special fprint_md_ptr_loc for writing to STDOUT.  */ | /* Special fprint_md_ptr_loc for writing to STDOUT.  */ | ||||||
| void | void | ||||||
| print_md_ptr_loc (const void *ptr) | rtx_reader::print_md_ptr_loc (const void *ptr) | ||||||
| { | { | ||||||
|   fprint_md_ptr_loc (stdout, ptr); |   fprint_md_ptr_loc (stdout, ptr); | ||||||
| } | } | ||||||
|  | @ -156,7 +132,7 @@ print_md_ptr_loc (const void *ptr) | ||||||
|    may be null or empty.  */ |    may be null or empty.  */ | ||||||
| 
 | 
 | ||||||
| const char * | const char * | ||||||
| join_c_conditions (const char *cond1, const char *cond2) | rtx_reader::join_c_conditions (const char *cond1, const char *cond2) | ||||||
| { | { | ||||||
|   char *result; |   char *result; | ||||||
|   const void **entry; |   const void **entry; | ||||||
|  | @ -171,11 +147,11 @@ join_c_conditions (const char *cond1, const char *cond2) | ||||||
|     return cond1; |     return cond1; | ||||||
| 
 | 
 | ||||||
|   result = concat ("(", cond1, ") && (", cond2, ")", NULL); |   result = concat ("(", cond1, ") && (", cond2, ")", NULL); | ||||||
|   obstack_ptr_grow (&joined_conditions_obstack, result); |   obstack_ptr_grow (&m_joined_conditions_obstack, result); | ||||||
|   obstack_ptr_grow (&joined_conditions_obstack, cond1); |   obstack_ptr_grow (&m_joined_conditions_obstack, cond1); | ||||||
|   obstack_ptr_grow (&joined_conditions_obstack, cond2); |   obstack_ptr_grow (&m_joined_conditions_obstack, cond2); | ||||||
|   entry = XOBFINISH (&joined_conditions_obstack, const void **); |   entry = XOBFINISH (&m_joined_conditions_obstack, const void **); | ||||||
|   *htab_find_slot (joined_conditions, entry, INSERT) = entry; |   *htab_find_slot (m_joined_conditions, entry, INSERT) = entry; | ||||||
|   return result; |   return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -185,9 +161,9 @@ join_c_conditions (const char *cond1, const char *cond2) | ||||||
|    directive for COND if its original file position is known.  */ |    directive for COND if its original file position is known.  */ | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| fprint_c_condition (FILE *outf, const char *cond) | rtx_reader::fprint_c_condition (FILE *outf, const char *cond) | ||||||
| { | { | ||||||
|   const char **halves = (const char **) htab_find (joined_conditions, &cond); |   const char **halves = (const char **) htab_find (m_joined_conditions, &cond); | ||||||
|   if (halves != 0) |   if (halves != 0) | ||||||
|     { |     { | ||||||
|       fprintf (outf, "("); |       fprintf (outf, "("); | ||||||
|  | @ -207,7 +183,7 @@ fprint_c_condition (FILE *outf, const char *cond) | ||||||
| /* Special fprint_c_condition for writing to STDOUT.  */ | /* Special fprint_c_condition for writing to STDOUT.  */ | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| print_c_condition (const char *cond) | rtx_reader::print_c_condition (const char *cond) | ||||||
| { | { | ||||||
|   fprint_c_condition (stdout, cond); |   fprint_c_condition (stdout, cond); | ||||||
| } | } | ||||||
|  | @ -414,7 +390,7 @@ rtx_reader::unread_char (int ch) | ||||||
|    punctuation chars of rtx printed syntax.  */ |    punctuation chars of rtx printed syntax.  */ | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| read_name (struct md_name *name) | rtx_reader::read_name (struct md_name *name) | ||||||
| { | { | ||||||
|   int c; |   int c; | ||||||
|   size_t i; |   size_t i; | ||||||
|  | @ -458,7 +434,7 @@ read_name (struct md_name *name) | ||||||
|   name->buffer[i] = 0; |   name->buffer[i] = 0; | ||||||
|   name->string = name->buffer; |   name->string = name->buffer; | ||||||
| 
 | 
 | ||||||
|   if (md_constants) |   if (m_md_constants) | ||||||
|     { |     { | ||||||
|       /* Do constant expansion.  */ |       /* Do constant expansion.  */ | ||||||
|       struct md_constant *def; |       struct md_constant *def; | ||||||
|  | @ -468,7 +444,7 @@ read_name (struct md_name *name) | ||||||
| 	  struct md_constant tmp_def; | 	  struct md_constant tmp_def; | ||||||
| 
 | 
 | ||||||
| 	  tmp_def.name = name->string; | 	  tmp_def.name = name->string; | ||||||
| 	  def = (struct md_constant *) htab_find (md_constants, &tmp_def); | 	  def = (struct md_constant *) htab_find (m_md_constants, &tmp_def); | ||||||
| 	  if (def) | 	  if (def) | ||||||
| 	    name->string = def->value; | 	    name->string = def->value; | ||||||
| 	} | 	} | ||||||
|  | @ -479,8 +455,8 @@ read_name (struct md_name *name) | ||||||
| /* Subroutine of the string readers.  Handles backslash escapes.
 | /* Subroutine of the string readers.  Handles backslash escapes.
 | ||||||
|    Caller has read the backslash, but not placed it into the obstack.  */ |    Caller has read the backslash, but not placed it into the obstack.  */ | ||||||
| 
 | 
 | ||||||
| static void | void | ||||||
| read_escape (void) | rtx_reader::read_escape () | ||||||
| { | { | ||||||
|   int c = read_char (); |   int c = read_char (); | ||||||
| 
 | 
 | ||||||
|  | @ -508,32 +484,32 @@ read_escape (void) | ||||||
|     case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v': |     case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v': | ||||||
|     case '0': case '1': case '2': case '3': case '4': case '5': case '6': |     case '0': case '1': case '2': case '3': case '4': case '5': case '6': | ||||||
|     case '7': case 'x': |     case '7': case 'x': | ||||||
|       obstack_1grow (&string_obstack, '\\'); |       obstack_1grow (&m_string_obstack, '\\'); | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|       /* \; makes stuff for a C string constant containing
 |       /* \; makes stuff for a C string constant containing
 | ||||||
| 	 newline and tab.  */ | 	 newline and tab.  */ | ||||||
|     case ';': |     case ';': | ||||||
|       obstack_grow (&string_obstack, "\\n\\t", 4); |       obstack_grow (&m_string_obstack, "\\n\\t", 4); | ||||||
|       return; |       return; | ||||||
| 
 | 
 | ||||||
|       /* pass anything else through, but issue a warning.  */ |       /* pass anything else through, but issue a warning.  */ | ||||||
|     default: |     default: | ||||||
|       fprintf (stderr, "%s:%d: warning: unrecognized escape \\%c\n", |       fprintf (stderr, "%s:%d: warning: unrecognized escape \\%c\n", | ||||||
| 	       rtx_reader_ptr->get_filename (), rtx_reader_ptr->get_lineno (), | 	       get_filename (), get_lineno (), | ||||||
| 	       c); | 	       c); | ||||||
|       obstack_1grow (&string_obstack, '\\'); |       obstack_1grow (&m_string_obstack, '\\'); | ||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   obstack_1grow (&string_obstack, c); |   obstack_1grow (&m_string_obstack, c); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Read a double-quoted string onto the obstack.  Caller has scanned
 | /* Read a double-quoted string onto the obstack.  Caller has scanned
 | ||||||
|    the leading quote.  */ |    the leading quote.  */ | ||||||
| 
 | 
 | ||||||
| char * | char * | ||||||
| read_quoted_string (void) | rtx_reader::read_quoted_string () | ||||||
| { | { | ||||||
|   int c; |   int c; | ||||||
| 
 | 
 | ||||||
|  | @ -548,25 +524,25 @@ read_quoted_string (void) | ||||||
|       else if (c == '"' || c == EOF) |       else if (c == '"' || c == EOF) | ||||||
| 	break; | 	break; | ||||||
| 
 | 
 | ||||||
|       obstack_1grow (&string_obstack, c); |       obstack_1grow (&m_string_obstack, c); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   obstack_1grow (&string_obstack, 0); |   obstack_1grow (&m_string_obstack, 0); | ||||||
|   return XOBFINISH (&string_obstack, char *); |   return XOBFINISH (&m_string_obstack, char *); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Read a braced string (a la Tcl) onto the string obstack.  Caller
 | /* Read a braced string (a la Tcl) onto the string obstack.  Caller
 | ||||||
|    has scanned the leading brace.  Note that unlike quoted strings, |    has scanned the leading brace.  Note that unlike quoted strings, | ||||||
|    the outermost braces _are_ included in the string constant.  */ |    the outermost braces _are_ included in the string constant.  */ | ||||||
| 
 | 
 | ||||||
| static char * | char * | ||||||
| read_braced_string (void) | rtx_reader::read_braced_string () | ||||||
| { | { | ||||||
|   int c; |   int c; | ||||||
|   int brace_depth = 1;  /* caller-processed */ |   int brace_depth = 1;  /* caller-processed */ | ||||||
|   unsigned long starting_read_md_lineno = rtx_reader_ptr->get_lineno (); |   unsigned long starting_read_md_lineno = get_lineno (); | ||||||
| 
 | 
 | ||||||
|   obstack_1grow (&string_obstack, '{'); |   obstack_1grow (&m_string_obstack, '{'); | ||||||
|   while (brace_depth) |   while (brace_depth) | ||||||
|     { |     { | ||||||
|       c = read_char (); /* Read the string  */ |       c = read_char (); /* Read the string  */ | ||||||
|  | @ -585,11 +561,11 @@ read_braced_string (void) | ||||||
| 	  ("missing closing } for opening brace on line %lu", | 	  ("missing closing } for opening brace on line %lu", | ||||||
| 	   starting_read_md_lineno); | 	   starting_read_md_lineno); | ||||||
| 
 | 
 | ||||||
|       obstack_1grow (&string_obstack, c); |       obstack_1grow (&m_string_obstack, c); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   obstack_1grow (&string_obstack, 0); |   obstack_1grow (&m_string_obstack, 0); | ||||||
|   return XOBFINISH (&string_obstack, char *); |   return XOBFINISH (&m_string_obstack, char *); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Read some kind of string constant.  This is the high-level routine
 | /* Read some kind of string constant.  This is the high-level routine
 | ||||||
|  | @ -597,7 +573,7 @@ read_braced_string (void) | ||||||
|    and dispatch to the appropriate string constant reader.  */ |    and dispatch to the appropriate string constant reader.  */ | ||||||
| 
 | 
 | ||||||
| char * | char * | ||||||
| read_string (int star_if_braced) | rtx_reader::read_string (int star_if_braced) | ||||||
| { | { | ||||||
|   char *stringbuf; |   char *stringbuf; | ||||||
|   int saw_paren = 0; |   int saw_paren = 0; | ||||||
|  | @ -610,13 +586,13 @@ read_string (int star_if_braced) | ||||||
|       c = read_skip_spaces (); |       c = read_skip_spaces (); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   old_lineno = rtx_reader_ptr->get_lineno (); |   old_lineno = get_lineno (); | ||||||
|   if (c == '"') |   if (c == '"') | ||||||
|     stringbuf = read_quoted_string (); |     stringbuf = read_quoted_string (); | ||||||
|   else if (c == '{') |   else if (c == '{') | ||||||
|     { |     { | ||||||
|       if (star_if_braced) |       if (star_if_braced) | ||||||
| 	obstack_1grow (&string_obstack, '*'); | 	obstack_1grow (&m_string_obstack, '*'); | ||||||
|       stringbuf = read_braced_string (); |       stringbuf = read_braced_string (); | ||||||
|     } |     } | ||||||
|   else |   else | ||||||
|  | @ -625,15 +601,15 @@ read_string (int star_if_braced) | ||||||
|   if (saw_paren) |   if (saw_paren) | ||||||
|     require_char_ws (')'); |     require_char_ws (')'); | ||||||
| 
 | 
 | ||||||
|   set_md_ptr_loc (stringbuf, rtx_reader_ptr->get_filename (), old_lineno); |   set_md_ptr_loc (stringbuf, get_filename (), old_lineno); | ||||||
|   return stringbuf; |   return stringbuf; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Skip the rest of a construct that started at line LINENO and that
 | /* Skip the rest of a construct that started at line LINENO and that
 | ||||||
|    is currently nested by DEPTH levels of parentheses.  */ |    is currently nested by DEPTH levels of parentheses.  */ | ||||||
| 
 | 
 | ||||||
| static void | void | ||||||
| read_skip_construct (int depth, file_location loc) | rtx_reader::read_skip_construct (int depth, file_location loc) | ||||||
| { | { | ||||||
|   struct md_name name; |   struct md_name name; | ||||||
|   int c; |   int c; | ||||||
|  | @ -774,8 +750,8 @@ add_constant (htab_t defs, char *name, char *value, | ||||||
| /* Process a define_constants directive, starting with the optional space
 | /* Process a define_constants directive, starting with the optional space
 | ||||||
|    after the "define_constants".  */ |    after the "define_constants".  */ | ||||||
| 
 | 
 | ||||||
| static void | void | ||||||
| handle_constants (void) | rtx_reader::handle_constants () | ||||||
| { | { | ||||||
|   int c; |   int c; | ||||||
|   htab_t defs; |   htab_t defs; | ||||||
|  | @ -783,8 +759,8 @@ handle_constants (void) | ||||||
|   require_char_ws ('['); |   require_char_ws ('['); | ||||||
| 
 | 
 | ||||||
|   /* Disable constant expansion during definition processing.  */ |   /* Disable constant expansion during definition processing.  */ | ||||||
|   defs = md_constants; |   defs = m_md_constants; | ||||||
|   md_constants = 0; |   m_md_constants = 0; | ||||||
|   while ( (c = read_skip_spaces ()) != ']') |   while ( (c = read_skip_spaces ()) != ']') | ||||||
|     { |     { | ||||||
|       struct md_name name, value; |       struct md_name name, value; | ||||||
|  | @ -798,7 +774,7 @@ handle_constants (void) | ||||||
| 
 | 
 | ||||||
|       require_char_ws (')'); |       require_char_ws (')'); | ||||||
|     } |     } | ||||||
|   md_constants = defs; |   m_md_constants = defs; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* For every constant definition, call CALLBACK with two arguments:
 | /* For every constant definition, call CALLBACK with two arguments:
 | ||||||
|  | @ -806,9 +782,9 @@ handle_constants (void) | ||||||
|    Stop when CALLBACK returns zero.  */ |    Stop when CALLBACK returns zero.  */ | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| traverse_md_constants (htab_trav callback, void *info) | rtx_reader::traverse_md_constants (htab_trav callback, void *info) | ||||||
| { | { | ||||||
|   htab_traverse (md_constants, callback, info); |   htab_traverse (get_md_constants (), callback, info); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Return a malloc()ed decimal string that represents number NUMBER.  */ | /* Return a malloc()ed decimal string that represents number NUMBER.  */ | ||||||
|  | @ -828,8 +804,8 @@ md_decimal_string (int number) | ||||||
|    number on which the directive started and MD_P is true if the |    number on which the directive started and MD_P is true if the | ||||||
|    directive is a define_enum rather than a define_c_enum.  */ |    directive is a define_enum rather than a define_c_enum.  */ | ||||||
| 
 | 
 | ||||||
| static void | void | ||||||
| handle_enum (file_location loc, bool md_p) | rtx_reader::handle_enum (file_location loc, bool md_p) | ||||||
| { | { | ||||||
|   char *enum_name, *value_name; |   char *enum_name, *value_name; | ||||||
|   struct md_name name; |   struct md_name name; | ||||||
|  | @ -839,7 +815,7 @@ handle_enum (file_location loc, bool md_p) | ||||||
|   int c; |   int c; | ||||||
| 
 | 
 | ||||||
|   enum_name = read_string (false); |   enum_name = read_string (false); | ||||||
|   slot = htab_find_slot (enum_types, &enum_name, INSERT); |   slot = htab_find_slot (m_enum_types, &enum_name, INSERT); | ||||||
|   if (*slot) |   if (*slot) | ||||||
|     { |     { | ||||||
|       def = (struct enum_type *) *slot; |       def = (struct enum_type *) *slot; | ||||||
|  | @ -883,7 +859,7 @@ handle_enum (file_location loc, bool md_p) | ||||||
| 	  value_name = xstrdup (name.string); | 	  value_name = xstrdup (name.string); | ||||||
| 	  ev->name = value_name; | 	  ev->name = value_name; | ||||||
| 	} | 	} | ||||||
|       ev->def = add_constant (md_constants, value_name, |       ev->def = add_constant (get_md_constants (), value_name, | ||||||
| 			      md_decimal_string (def->num_values), def); | 			      md_decimal_string (def->num_values), def); | ||||||
| 
 | 
 | ||||||
|       *def->tail_ptr = ev; |       *def->tail_ptr = ev; | ||||||
|  | @ -895,9 +871,9 @@ handle_enum (file_location loc, bool md_p) | ||||||
| /* Try to find the definition of the given enum.  Return null on failure.  */ | /* Try to find the definition of the given enum.  Return null on failure.  */ | ||||||
| 
 | 
 | ||||||
| struct enum_type * | struct enum_type * | ||||||
| lookup_enum_type (const char *name) | rtx_reader::lookup_enum_type (const char *name) | ||||||
| { | { | ||||||
|   return (struct enum_type *) htab_find (enum_types, &name); |   return (struct enum_type *) htab_find (m_enum_types, &name); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* For every enum definition, call CALLBACK with two arguments:
 | /* For every enum definition, call CALLBACK with two arguments:
 | ||||||
|  | @ -905,9 +881,9 @@ lookup_enum_type (const char *name) | ||||||
|    returns zero.  */ |    returns zero.  */ | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| traverse_enum_types (htab_trav callback, void *info) | rtx_reader::traverse_enum_types (htab_trav callback, void *info) | ||||||
| { | { | ||||||
|   htab_traverse (enum_types, callback, info); |   htab_traverse (m_enum_types, callback, info); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -925,12 +901,43 @@ rtx_reader::rtx_reader () | ||||||
| { | { | ||||||
|   /* Set the global singleton pointer.  */ |   /* Set the global singleton pointer.  */ | ||||||
|   rtx_reader_ptr = this; |   rtx_reader_ptr = this; | ||||||
|  | 
 | ||||||
|  |   obstack_init (&m_string_obstack); | ||||||
|  | 
 | ||||||
|  |   m_ptr_locs = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0); | ||||||
|  |   obstack_init (&m_ptr_loc_obstack); | ||||||
|  | 
 | ||||||
|  |   m_joined_conditions = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0); | ||||||
|  |   obstack_init (&m_joined_conditions_obstack); | ||||||
|  | 
 | ||||||
|  |   m_md_constants = htab_create (31, leading_string_hash, | ||||||
|  | 				leading_string_eq_p, (htab_del) 0); | ||||||
|  | 
 | ||||||
|  |   m_enum_types = htab_create (31, leading_string_hash, | ||||||
|  | 			      leading_string_eq_p, (htab_del) 0); | ||||||
|  | 
 | ||||||
|  |   /* Unlock the stdio streams.  */ | ||||||
|  |   unlock_std_streams (); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* rtx_reader's destructor.  */ | /* rtx_reader's destructor.  */ | ||||||
| 
 | 
 | ||||||
| rtx_reader::~rtx_reader () | rtx_reader::~rtx_reader () | ||||||
| { | { | ||||||
|  |   free (m_base_dir); | ||||||
|  | 
 | ||||||
|  |   htab_delete (m_enum_types); | ||||||
|  | 
 | ||||||
|  |   htab_delete (m_md_constants); | ||||||
|  | 
 | ||||||
|  |   obstack_free (&m_joined_conditions_obstack, NULL); | ||||||
|  |   htab_delete (m_joined_conditions); | ||||||
|  | 
 | ||||||
|  |   obstack_free (&m_ptr_loc_obstack, NULL); | ||||||
|  |   htab_delete (m_ptr_locs); | ||||||
|  | 
 | ||||||
|  |   obstack_free (&m_string_obstack, NULL); | ||||||
|  | 
 | ||||||
|   /* Clear the global singleton pointer.  */ |   /* Clear the global singleton pointer.  */ | ||||||
|   rtx_reader_ptr = NULL; |   rtx_reader_ptr = NULL; | ||||||
| } | } | ||||||
|  | @ -1105,20 +1112,6 @@ rtx_reader::read_md_files (int argc, const char **argv, | ||||||
|   bool already_read_stdin; |   bool already_read_stdin; | ||||||
|   int num_files; |   int num_files; | ||||||
| 
 | 
 | ||||||
|   /* Initialize global data.  */ |  | ||||||
|   obstack_init (&string_obstack); |  | ||||||
|   ptr_locs = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0); |  | ||||||
|   obstack_init (&ptr_loc_obstack); |  | ||||||
|   joined_conditions = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0); |  | ||||||
|   obstack_init (&joined_conditions_obstack); |  | ||||||
|   md_constants = htab_create (31, leading_string_hash, |  | ||||||
| 			      leading_string_eq_p, (htab_del) 0); |  | ||||||
|   enum_types = htab_create (31, leading_string_hash, |  | ||||||
| 			    leading_string_eq_p, (htab_del) 0); |  | ||||||
| 
 |  | ||||||
|   /* Unlock the stdio streams.  */ |  | ||||||
|   unlock_std_streams (); |  | ||||||
| 
 |  | ||||||
|   /* First we loop over all the options.  */ |   /* First we loop over all the options.  */ | ||||||
|   for (i = 1; i < argc; i++) |   for (i = 1; i < argc; i++) | ||||||
|     if (argv[i][0] == '-') |     if (argv[i][0] == '-') | ||||||
|  |  | ||||||
|  | @ -107,14 +107,54 @@ class rtx_reader | ||||||
| 
 | 
 | ||||||
|   file_location get_current_location () const; |   file_location get_current_location () const; | ||||||
| 
 | 
 | ||||||
|  |   /* Defined in read-md.c.  */ | ||||||
|   int read_char (void); |   int read_char (void); | ||||||
|   void unread_char (int ch); |   void unread_char (int ch); | ||||||
|  |   void read_name (struct md_name *name); | ||||||
|  |   void read_escape (); | ||||||
|  |   char *read_quoted_string (); | ||||||
|  |   char *read_braced_string (); | ||||||
|  |   char *read_string (int star_if_braced); | ||||||
|  |   void read_skip_construct (int depth, file_location loc); | ||||||
|  | 
 | ||||||
|  |   void set_md_ptr_loc (const void *ptr, const char *filename, int lineno); | ||||||
|  |   const struct ptr_loc *get_md_ptr_loc (const void *ptr); | ||||||
|  |   void copy_md_ptr_loc (const void *new_ptr, const void *old_ptr); | ||||||
|  |   void fprint_md_ptr_loc (FILE *outf, const void *ptr); | ||||||
|  |   void print_md_ptr_loc (const void *ptr); | ||||||
|  | 
 | ||||||
|  |   struct enum_type *lookup_enum_type (const char *name); | ||||||
|  |   void traverse_enum_types (htab_trav callback, void *info); | ||||||
|  | 
 | ||||||
|  |   void handle_constants (); | ||||||
|  |   void traverse_md_constants (htab_trav callback, void *info); | ||||||
|  |   void handle_enum (file_location loc, bool md_p); | ||||||
|  | 
 | ||||||
|  |   const char *join_c_conditions (const char *cond1, const char *cond2); | ||||||
|  |   void fprint_c_condition (FILE *outf, const char *cond); | ||||||
|  |   void print_c_condition (const char *cond); | ||||||
|  | 
 | ||||||
|  |   /* Defined in read-rtl.c.  */ | ||||||
|  |   const char *apply_iterator_to_string (const char *string); | ||||||
|  |   rtx copy_rtx_for_iterators (rtx original); | ||||||
|  |   void read_conditions (); | ||||||
|  |   void record_potential_iterator_use (struct iterator_group *group, | ||||||
|  | 				      void *ptr, const char *name); | ||||||
|  |   struct mapping *read_mapping (struct iterator_group *group, htab_t table); | ||||||
|  |   bool read_rtx (const char *rtx_name, vec<rtx> *rtxen); | ||||||
|  |   rtx read_rtx_code (const char *code_name); | ||||||
|  |   void read_rtx_operand (rtx return_rtx, int idx); | ||||||
|  |   rtx read_nested_rtx (); | ||||||
|  |   rtx read_rtx_variadic (rtx form); | ||||||
| 
 | 
 | ||||||
|   const char *get_top_level_filename () const { return m_toplevel_fname; } |   const char *get_top_level_filename () const { return m_toplevel_fname; } | ||||||
|   const char *get_filename () const { return m_read_md_filename; } |   const char *get_filename () const { return m_read_md_filename; } | ||||||
|   int get_lineno () const { return m_read_md_lineno; } |   int get_lineno () const { return m_read_md_lineno; } | ||||||
|   int get_colno () const { return m_read_md_colno; } |   int get_colno () const { return m_read_md_colno; } | ||||||
| 
 | 
 | ||||||
|  |   struct obstack *get_string_obstack () { return &m_string_obstack; } | ||||||
|  |   htab_t get_md_constants () { return m_md_constants; } | ||||||
|  | 
 | ||||||
|  private: |  private: | ||||||
|   /* A singly-linked list of filenames.  */ |   /* A singly-linked list of filenames.  */ | ||||||
|   struct file_name_list { |   struct file_name_list { | ||||||
|  | @ -159,6 +199,32 @@ class rtx_reader | ||||||
| 
 | 
 | ||||||
|   /* A pointer to the null terminator of the md include chain.  */ |   /* A pointer to the null terminator of the md include chain.  */ | ||||||
|   file_name_list **m_last_dir_md_include_ptr; |   file_name_list **m_last_dir_md_include_ptr; | ||||||
|  | 
 | ||||||
|  |   /* Obstack used for allocating MD strings.  */ | ||||||
|  |   struct obstack m_string_obstack; | ||||||
|  | 
 | ||||||
|  |   /* A table of ptr_locs, hashed on the PTR field.  */ | ||||||
|  |   htab_t m_ptr_locs; | ||||||
|  | 
 | ||||||
|  |   /* An obstack for the above.  Plain xmalloc is a bit heavyweight for a
 | ||||||
|  |      small structure like ptr_loc.  */ | ||||||
|  |   struct obstack m_ptr_loc_obstack; | ||||||
|  | 
 | ||||||
|  |   /* A hash table of triples (A, B, C), where each of A, B and C is a condition
 | ||||||
|  |      and A is equivalent to "B && C".  This is used to keep track of the source | ||||||
|  |      of conditions that are made up of separate MD strings (such as the split | ||||||
|  |      condition of a define_insn_and_split).  */ | ||||||
|  |   htab_t m_joined_conditions; | ||||||
|  | 
 | ||||||
|  |   /* An obstack for allocating joined_conditions entries.  */ | ||||||
|  |   struct obstack m_joined_conditions_obstack; | ||||||
|  | 
 | ||||||
|  |   /* A table of md_constant structures, hashed by name.  Null if no
 | ||||||
|  |      constant expansion should occur.  */ | ||||||
|  |   htab_t m_md_constants; | ||||||
|  | 
 | ||||||
|  |   /* A table of enum_type structures, hashed by name.  */ | ||||||
|  |   htab_t m_enum_types; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* Global singleton.  */ | /* Global singleton.  */ | ||||||
|  | @ -175,7 +241,6 @@ class noop_reader : public rtx_reader | ||||||
|   void handle_unknown_directive (file_location, const char *); |   void handle_unknown_directive (file_location, const char *); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| extern struct obstack string_obstack; |  | ||||||
| extern void (*include_callback) (const char *); | extern void (*include_callback) (const char *); | ||||||
| 
 | 
 | ||||||
| /* Read the next character from the MD file.  */ | /* Read the next character from the MD file.  */ | ||||||
|  | @ -196,12 +261,7 @@ unread_char (int ch) | ||||||
| 
 | 
 | ||||||
| extern hashval_t leading_string_hash (const void *); | extern hashval_t leading_string_hash (const void *); | ||||||
| extern int leading_string_eq_p (const void *, const void *); | extern int leading_string_eq_p (const void *, const void *); | ||||||
| extern void copy_md_ptr_loc (const void *, const void *); |  | ||||||
| extern void print_md_ptr_loc (const void *); |  | ||||||
| extern void fprint_md_ptr_loc (FILE *, const void *); |  | ||||||
| extern const char *join_c_conditions (const char *, const char *); | extern const char *join_c_conditions (const char *, const char *); | ||||||
| extern void print_c_condition (const char *); |  | ||||||
| extern void fprint_c_condition (FILE *, const char *); |  | ||||||
| extern void message_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2; | extern void message_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2; | ||||||
| extern void error_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2; | extern void error_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2; | ||||||
| extern void fatal_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2; | extern void fatal_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2; | ||||||
|  | @ -210,13 +270,9 @@ extern void fatal_with_file_and_line (const char *, ...) | ||||||
| extern void fatal_expected_char (int, int) ATTRIBUTE_NORETURN; | extern void fatal_expected_char (int, int) ATTRIBUTE_NORETURN; | ||||||
| extern int read_skip_spaces (void); | extern int read_skip_spaces (void); | ||||||
| extern void require_char_ws (char expected); | extern void require_char_ws (char expected); | ||||||
| extern void read_name (struct md_name *); |  | ||||||
| extern char *read_quoted_string (void); |  | ||||||
| extern char *read_string (int); |  | ||||||
| extern int n_comma_elts (const char *); | extern int n_comma_elts (const char *); | ||||||
| extern const char *scan_comma_elt (const char **); | extern const char *scan_comma_elt (const char **); | ||||||
| extern void upcase_string (char *); | extern void upcase_string (char *); | ||||||
| extern void traverse_md_constants (htab_trav, void *); |  | ||||||
| extern void traverse_enum_types (htab_trav, void *); | extern void traverse_enum_types (htab_trav, void *); | ||||||
| extern struct enum_type *lookup_enum_type (const char *); | extern struct enum_type *lookup_enum_type (const char *); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -106,10 +106,6 @@ htab_t subst_attr_to_iter_map = NULL; | ||||||
| const char *current_iterator_name; | const char *current_iterator_name; | ||||||
| 
 | 
 | ||||||
| static void validate_const_int (const char *); | static void validate_const_int (const char *); | ||||||
| static rtx read_rtx_code (const char *); |  | ||||||
| static void read_rtx_operand (rtx, int); |  | ||||||
| static rtx read_nested_rtx (void); |  | ||||||
| static rtx read_rtx_variadic (rtx); |  | ||||||
| 
 | 
 | ||||||
| /* The mode and code iterator structures.  */ | /* The mode and code iterator structures.  */ | ||||||
| static struct iterator_group modes, codes, ints, substs; | static struct iterator_group modes, codes, ints, substs; | ||||||
|  | @ -329,8 +325,8 @@ map_attr_string (const char *p) | ||||||
| /* Apply the current iterator values to STRING.  Return the new string
 | /* Apply the current iterator values to STRING.  Return the new string
 | ||||||
|    if any changes were needed, otherwise return STRING itself.  */ |    if any changes were needed, otherwise return STRING itself.  */ | ||||||
| 
 | 
 | ||||||
| static const char * | const char * | ||||||
| apply_iterator_to_string (const char *string) | rtx_reader::apply_iterator_to_string (const char *string) | ||||||
| { | { | ||||||
|   char *base, *copy, *p, *start, *end; |   char *base, *copy, *p, *start, *end; | ||||||
|   struct map_value *v; |   struct map_value *v; | ||||||
|  | @ -351,14 +347,14 @@ apply_iterator_to_string (const char *string) | ||||||
| 
 | 
 | ||||||
|       /* Add everything between the last copied byte and the '<',
 |       /* Add everything between the last copied byte and the '<',
 | ||||||
| 	 then add in the attribute value.  */ | 	 then add in the attribute value.  */ | ||||||
|       obstack_grow (&string_obstack, base, start - base); |       obstack_grow (&m_string_obstack, base, start - base); | ||||||
|       obstack_grow (&string_obstack, v->string, strlen (v->string)); |       obstack_grow (&m_string_obstack, v->string, strlen (v->string)); | ||||||
|       base = end + 1; |       base = end + 1; | ||||||
|     } |     } | ||||||
|   if (base != copy) |   if (base != copy) | ||||||
|     { |     { | ||||||
|       obstack_grow (&string_obstack, base, strlen (base) + 1); |       obstack_grow (&m_string_obstack, base, strlen (base) + 1); | ||||||
|       copy = XOBFINISH (&string_obstack, char *); |       copy = XOBFINISH (&m_string_obstack, char *); | ||||||
|       copy_md_ptr_loc (copy, string); |       copy_md_ptr_loc (copy, string); | ||||||
|       return copy; |       return copy; | ||||||
|     } |     } | ||||||
|  | @ -368,8 +364,8 @@ apply_iterator_to_string (const char *string) | ||||||
| /* Return a deep copy of X, substituting the current iterator
 | /* Return a deep copy of X, substituting the current iterator
 | ||||||
|    values into any strings.  */ |    values into any strings.  */ | ||||||
| 
 | 
 | ||||||
| static rtx | rtx | ||||||
| copy_rtx_for_iterators (rtx original) | rtx_reader::copy_rtx_for_iterators (rtx original) | ||||||
| { | { | ||||||
|   const char *format_ptr, *p; |   const char *format_ptr, *p; | ||||||
|   int i, j; |   int i, j; | ||||||
|  | @ -428,7 +424,7 @@ add_condition_to_string (const char *original, const char *extra) | ||||||
| { | { | ||||||
|   if (original != 0 && original[0] == '&' && original[1] == '&') |   if (original != 0 && original[0] == '&' && original[1] == '&') | ||||||
|     return original; |     return original; | ||||||
|   return join_c_conditions (original, extra); |   return rtx_reader_ptr->join_c_conditions (original, extra); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Like add_condition, but applied to all conditions in rtx X.  */ | /* Like add_condition, but applied to all conditions in rtx X.  */ | ||||||
|  | @ -543,10 +539,10 @@ apply_iterators (rtx original, vec<rtx> *queue) | ||||||
| 	    continue; | 	    continue; | ||||||
| 	  v = iuse->iterator->current_value; | 	  v = iuse->iterator->current_value; | ||||||
| 	  iuse->iterator->group->apply_iterator (iuse->ptr, v->number); | 	  iuse->iterator->group->apply_iterator (iuse->ptr, v->number); | ||||||
| 	  condition = join_c_conditions (condition, v->string); | 	  condition = rtx_reader_ptr->join_c_conditions (condition, v->string); | ||||||
| 	} | 	} | ||||||
|       apply_attribute_uses (); |       apply_attribute_uses (); | ||||||
|       x = copy_rtx_for_iterators (original); |       x = rtx_reader_ptr->copy_rtx_for_iterators (original); | ||||||
|       add_condition_to_rtx (x, condition); |       add_condition_to_rtx (x, condition); | ||||||
| 
 | 
 | ||||||
|       /* We apply subst iterator after RTL-template is copied, as during
 |       /* We apply subst iterator after RTL-template is copied, as during
 | ||||||
|  | @ -738,8 +734,8 @@ atoll (const char *p) | ||||||
|    generated by (the program generated by) genconditions.c, and |    generated by (the program generated by) genconditions.c, and | ||||||
|    slipped in at the beginning of the sequence of MD files read by |    slipped in at the beginning of the sequence of MD files read by | ||||||
|    most of the other generators.  */ |    most of the other generators.  */ | ||||||
| static void | void | ||||||
| read_conditions (void) | rtx_reader::read_conditions () | ||||||
| { | { | ||||||
|   int c; |   int c; | ||||||
| 
 | 
 | ||||||
|  | @ -837,9 +833,9 @@ record_attribute_use (struct iterator_group *group, void *ptr, | ||||||
|    for group GROUP.  PTR is the value to pass to GROUP's apply_iterator |    for group GROUP.  PTR is the value to pass to GROUP's apply_iterator | ||||||
|    callback.  */ |    callback.  */ | ||||||
| 
 | 
 | ||||||
| static void | void | ||||||
| record_potential_iterator_use (struct iterator_group *group, void *ptr, | rtx_reader::record_potential_iterator_use (struct iterator_group *group, | ||||||
| 			       const char *name) | 					   void *ptr, const char *name) | ||||||
| { | { | ||||||
|   struct mapping *m; |   struct mapping *m; | ||||||
|   size_t len; |   size_t len; | ||||||
|  | @ -849,8 +845,8 @@ record_potential_iterator_use (struct iterator_group *group, void *ptr, | ||||||
|     { |     { | ||||||
|       /* Copy the attribute string into permanent storage, without the
 |       /* Copy the attribute string into permanent storage, without the
 | ||||||
| 	 angle brackets around it.  */ | 	 angle brackets around it.  */ | ||||||
|       obstack_grow0 (&string_obstack, name + 1, len - 2); |       obstack_grow0 (&m_string_obstack, name + 1, len - 2); | ||||||
|       record_attribute_use (group, ptr, XOBFINISH (&string_obstack, char *)); |       record_attribute_use (group, ptr, XOBFINISH (&m_string_obstack, char *)); | ||||||
|     } |     } | ||||||
|   else |   else | ||||||
|     { |     { | ||||||
|  | @ -872,8 +868,8 @@ record_potential_iterator_use (struct iterator_group *group, void *ptr, | ||||||
|    Represent the declaration as a "mapping" structure; add it to TABLE |    Represent the declaration as a "mapping" structure; add it to TABLE | ||||||
|    (which belongs to GROUP) and return it.  */ |    (which belongs to GROUP) and return it.  */ | ||||||
| 
 | 
 | ||||||
| static struct mapping * | struct mapping * | ||||||
| read_mapping (struct iterator_group *group, htab_t table) | rtx_reader::read_mapping (struct iterator_group *group, htab_t table) | ||||||
| { | { | ||||||
|   struct md_name name; |   struct md_name name; | ||||||
|   struct mapping *m; |   struct mapping *m; | ||||||
|  | @ -974,7 +970,7 @@ read_subst_mapping (htab_t subst_iters_table, htab_t subst_attrs_table, | ||||||
|   int i; |   int i; | ||||||
| 
 | 
 | ||||||
|   for (i = 0; i < 4; i++) |   for (i = 0; i < 4; i++) | ||||||
|     attr_operands[i] = read_string (false); |     attr_operands[i] = rtx_reader_ptr->read_string (false); | ||||||
| 
 | 
 | ||||||
|   add_define_subst_attr (attr_operands, queue); |   add_define_subst_attr (attr_operands, queue); | ||||||
| 
 | 
 | ||||||
|  | @ -1019,7 +1015,7 @@ check_code_iterator (struct mapping *iterator) | ||||||
|    store the list of rtxes as an EXPR_LIST in *X.  */ |    store the list of rtxes as an EXPR_LIST in *X.  */ | ||||||
| 
 | 
 | ||||||
| bool | bool | ||||||
| read_rtx (const char *rtx_name, vec<rtx> *rtxen) | rtx_reader::read_rtx (const char *rtx_name, vec<rtx> *rtxen) | ||||||
| { | { | ||||||
|   static bool initialized = false; |   static bool initialized = false; | ||||||
| 
 | 
 | ||||||
|  | @ -1087,8 +1083,8 @@ read_rtx (const char *rtx_name, vec<rtx> *rtxen) | ||||||
|    either an rtx code or a code iterator.  Parse the rest of the rtx and |    either an rtx code or a code iterator.  Parse the rest of the rtx and | ||||||
|    return it.  */ |    return it.  */ | ||||||
| 
 | 
 | ||||||
| static rtx | rtx | ||||||
| read_rtx_code (const char *code_name) | rtx_reader::read_rtx_code (const char *code_name) | ||||||
| { | { | ||||||
|   RTX_CODE code; |   RTX_CODE code; | ||||||
|   struct mapping *iterator; |   struct mapping *iterator; | ||||||
|  | @ -1200,8 +1196,8 @@ read_rtx_code (const char *code_name) | ||||||
|    based on the corresponding format character within GET_RTX_FORMAT |    based on the corresponding format character within GET_RTX_FORMAT | ||||||
|    for the GET_CODE (RETURN_RTX).  */ |    for the GET_CODE (RETURN_RTX).  */ | ||||||
| 
 | 
 | ||||||
| static void | void | ||||||
| read_rtx_operand (rtx return_rtx, int idx) | rtx_reader::read_rtx_operand (rtx return_rtx, int idx) | ||||||
| { | { | ||||||
|   RTX_CODE code = GET_CODE (return_rtx); |   RTX_CODE code = GET_CODE (return_rtx); | ||||||
|   const char *format_ptr = GET_RTX_FORMAT (code); |   const char *format_ptr = GET_RTX_FORMAT (code); | ||||||
|  | @ -1304,17 +1300,17 @@ read_rtx_operand (rtx return_rtx, int idx) | ||||||
| 		|| GET_CODE (return_rtx) == DEFINE_INSN_AND_SPLIT)) | 		|| GET_CODE (return_rtx) == DEFINE_INSN_AND_SPLIT)) | ||||||
| 	  { | 	  { | ||||||
| 	    char line_name[20]; | 	    char line_name[20]; | ||||||
| 	    const char *read_md_filename = rtx_reader_ptr->get_filename (); | 	    const char *read_md_filename = get_filename (); | ||||||
| 	    const char *fn = (read_md_filename ? read_md_filename : "rtx"); | 	    const char *fn = (read_md_filename ? read_md_filename : "rtx"); | ||||||
| 	    const char *slash; | 	    const char *slash; | ||||||
| 	    for (slash = fn; *slash; slash ++) | 	    for (slash = fn; *slash; slash ++) | ||||||
| 	      if (*slash == '/' || *slash == '\\' || *slash == ':') | 	      if (*slash == '/' || *slash == '\\' || *slash == ':') | ||||||
| 		fn = slash + 1; | 		fn = slash + 1; | ||||||
| 	    obstack_1grow (&string_obstack, '*'); | 	    obstack_1grow (&m_string_obstack, '*'); | ||||||
| 	    obstack_grow (&string_obstack, fn, strlen (fn)); | 	    obstack_grow (&m_string_obstack, fn, strlen (fn)); | ||||||
| 	    sprintf (line_name, ":%d", rtx_reader_ptr->get_lineno ()); | 	    sprintf (line_name, ":%d", get_lineno ()); | ||||||
| 	    obstack_grow (&string_obstack, line_name, strlen (line_name)+1); | 	    obstack_grow (&m_string_obstack, line_name, strlen (line_name)+1); | ||||||
| 	    stringbuf = XOBFINISH (&string_obstack, char *); | 	    stringbuf = XOBFINISH (&m_string_obstack, char *); | ||||||
| 	  } | 	  } | ||||||
| 
 | 
 | ||||||
| 	/* Find attr-names in the string.  */ | 	/* Find attr-names in the string.  */ | ||||||
|  | @ -1402,8 +1398,8 @@ read_rtx_operand (rtx return_rtx, int idx) | ||||||
| 
 | 
 | ||||||
| /* Read a nested rtx construct from the MD file and return it.  */ | /* Read a nested rtx construct from the MD file and return it.  */ | ||||||
| 
 | 
 | ||||||
| static rtx | rtx | ||||||
| read_nested_rtx (void) | rtx_reader::read_nested_rtx () | ||||||
| { | { | ||||||
|   struct md_name name; |   struct md_name name; | ||||||
|   rtx return_rtx; |   rtx return_rtx; | ||||||
|  | @ -1427,8 +1423,8 @@ read_nested_rtx (void) | ||||||
|    When called, FORM is (thing x1 x2), and the file position |    When called, FORM is (thing x1 x2), and the file position | ||||||
|    is just past the leading parenthesis of x3.  Only works |    is just past the leading parenthesis of x3.  Only works | ||||||
|    for THINGs which are dyadic expressions, e.g. AND, IOR.  */ |    for THINGs which are dyadic expressions, e.g. AND, IOR.  */ | ||||||
| static rtx | rtx | ||||||
| read_rtx_variadic (rtx form) | rtx_reader::read_rtx_variadic (rtx form) | ||||||
| { | { | ||||||
|   char c = '('; |   char c = '('; | ||||||
|   rtx p = form, q; |   rtx p = form, q; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 David Malcolm
						David Malcolm