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>
|
||||
|
||||
* 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);
|
||||
new_str[len] = '\0';
|
||||
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. */
|
||||
}
|
||||
@ -3157,7 +3157,7 @@ gen_attr (md_rtx_info *info)
|
||||
if (GET_CODE (def) == DEFINE_ENUM_ATTR)
|
||||
{
|
||||
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)
|
||||
error_at (info->loc, "No define_enum called `%s' defined",
|
||||
attr->name);
|
||||
@ -3768,14 +3768,14 @@ write_test_expr (FILE *outf, rtx exp, unsigned int attrs_cached, int flags,
|
||||
break;
|
||||
|
||||
case MATCH_TEST:
|
||||
fprint_c_condition (outf, XSTR (exp, 0));
|
||||
rtx_reader_ptr->fprint_c_condition (outf, XSTR (exp, 0));
|
||||
if (flags & FLG_BITWISE)
|
||||
fprintf (outf, " != 0");
|
||||
break;
|
||||
|
||||
/* A random C expression. */
|
||||
case SYMBOL_REF:
|
||||
fprint_c_condition (outf, XSTR (exp, 0));
|
||||
rtx_reader_ptr->fprint_c_condition (outf, XSTR (exp, 0));
|
||||
break;
|
||||
|
||||
/* The address of the branch target. */
|
||||
@ -4365,7 +4365,7 @@ write_attr_value (FILE *outf, struct attr_desc *attr, rtx value)
|
||||
break;
|
||||
|
||||
case SYMBOL_REF:
|
||||
fprint_c_condition (outf, XSTR (value, 0));
|
||||
rtx_reader_ptr->fprint_c_condition (outf, XSTR (value, 0));
|
||||
break;
|
||||
|
||||
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 char *p;
|
||||
|
||||
print_md_ptr_loc (test->expr);
|
||||
rtx_reader_ptr->print_md_ptr_loc (test->expr);
|
||||
fputs (" { \"", stdout);
|
||||
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);
|
||||
print_c_condition (test->expr);
|
||||
rtx_reader_ptr->print_c_condition (test->expr);
|
||||
fputs ("\n ? (int) ", stdout);
|
||||
print_c_condition (test->expr);
|
||||
rtx_reader_ptr->print_c_condition (test->expr);
|
||||
fputs ("\n : -1 },\n", stdout);
|
||||
return 1;
|
||||
}
|
||||
|
@ -28,6 +28,8 @@ along with GCC; see the file COPYING3. If not see
|
||||
#include "system.h"
|
||||
#include "coretypes.h"
|
||||
#include "errors.h"
|
||||
#include "statistics.h"
|
||||
#include "vec.h"
|
||||
#include "read-md.h"
|
||||
|
||||
/* 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 ("#define GCC_INSN_CONSTANTS_H\n");
|
||||
|
||||
traverse_md_constants (print_md_constant, 0);
|
||||
traverse_enum_types (print_enum_type, 0);
|
||||
reader.traverse_md_constants (print_md_constant, 0);
|
||||
reader.traverse_enum_types (print_enum_type, 0);
|
||||
|
||||
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 (),"
|
||||
"end_sequence (), _val)\n");
|
||||
|
||||
print_md_ptr_loc (code);
|
||||
rtx_reader_ptr->print_md_ptr_loc (code);
|
||||
printf ("%s\n", code);
|
||||
|
||||
printf ("#undef DONE\n");
|
||||
|
@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
|
||||
#include "system.h"
|
||||
#include "coretypes.h"
|
||||
#include "errors.h"
|
||||
#include "statistics.h"
|
||||
#include "vec.h"
|
||||
#include "read-md.h"
|
||||
|
||||
/* 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 \"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))
|
||||
return FATAL_EXIT_CODE;
|
||||
|
@ -19,6 +19,8 @@
|
||||
#include "system.h"
|
||||
#include "coretypes.h"
|
||||
#include "errors.h"
|
||||
#include "statistics.h"
|
||||
#include "vec.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",
|
||||
d->code_number);
|
||||
puts ("{");
|
||||
print_md_ptr_loc (template_code);
|
||||
rtx_reader_ptr->print_md_ptr_loc (template_code);
|
||||
puts (template_code + 1);
|
||||
puts ("}");
|
||||
}
|
||||
|
@ -154,7 +154,7 @@ write_predicate_subfunction (struct pred_data *p)
|
||||
printf ("static inline int\n"
|
||||
"%s_1 (rtx op, machine_mode mode ATTRIBUTE_UNUSED)\n",
|
||||
p->name);
|
||||
print_md_ptr_loc (p->c_block);
|
||||
rtx_reader_ptr->print_md_ptr_loc (p->c_block);
|
||||
if (p->c_block[0] == '{')
|
||||
fputs (p->c_block, stdout);
|
||||
else
|
||||
@ -538,7 +538,7 @@ write_predicate_expr (rtx exp)
|
||||
break;
|
||||
|
||||
case MATCH_TEST:
|
||||
print_c_condition (XSTR (exp, 0));
|
||||
rtx_reader_ptr->print_c_condition (XSTR (exp, 0));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -4659,7 +4659,7 @@ print_test (output_state *os, const rtx_test &test, bool is_param,
|
||||
gcc_assert (!is_param && value == 1);
|
||||
if (invert_p)
|
||||
printf ("!");
|
||||
print_c_condition (test.u.string);
|
||||
rtx_reader_ptr->print_c_condition (test.u.string);
|
||||
break;
|
||||
|
||||
case rtx_test::ACCEPT:
|
||||
|
@ -551,8 +551,9 @@ process_rtx (rtx desc, file_location loc)
|
||||
split_cond = XSTR (desc, 4);
|
||||
if (split_cond[0] == '&' && split_cond[1] == '&')
|
||||
{
|
||||
copy_md_ptr_loc (split_cond + 2, split_cond);
|
||||
split_cond = join_c_conditions (XSTR (desc, 2), split_cond + 2);
|
||||
rtx_reader_ptr->copy_md_ptr_loc (split_cond + 2, split_cond);
|
||||
split_cond = rtx_reader_ptr->join_c_conditions (XSTR (desc, 2),
|
||||
split_cond + 2);
|
||||
}
|
||||
XSTR (split, 1) = split_cond;
|
||||
XVEC (split, 2) = XVEC (desc, 5);
|
||||
@ -1262,8 +1263,8 @@ static const char *
|
||||
alter_test_for_insn (struct queue_elem *ce_elem,
|
||||
struct queue_elem *insn_elem)
|
||||
{
|
||||
return join_c_conditions (XSTR (ce_elem->data, 1),
|
||||
XSTR (insn_elem->data, 2));
|
||||
return rtx_reader_ptr->join_c_conditions (XSTR (ce_elem->data, 1),
|
||||
XSTR (insn_elem->data, 2));
|
||||
}
|
||||
|
||||
/* 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
|
||||
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"
|
||||
to "no". */
|
||||
change_subst_attribute (elem, subst_elem, subst_false);
|
||||
@ -2299,6 +2301,7 @@ gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn)
|
||||
rtx set_attr;
|
||||
char *attr_name;
|
||||
rtvec new_vec;
|
||||
struct obstack *string_obstack = rtx_reader_ptr->get_string_obstack ();
|
||||
|
||||
template_code = XTMPL (insn, 3);
|
||||
|
||||
@ -2324,13 +2327,13 @@ gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn)
|
||||
sp = ep + 1;
|
||||
|
||||
if (i > 0)
|
||||
obstack_1grow (&string_obstack, ',');
|
||||
obstack_1grow (string_obstack, ',');
|
||||
|
||||
while (cp < sp && ((*cp >= '0' && *cp <= '9')
|
||||
|| (*cp >= 'a' && *cp <= 'z')))
|
||||
|
||||
{
|
||||
obstack_1grow (&string_obstack, *cp);
|
||||
obstack_1grow (string_obstack, *cp);
|
||||
cp++;
|
||||
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
|
||||
instruction in the string. */
|
||||
obstack_blank_fast (&string_obstack, -size);
|
||||
obstack_blank_fast (string_obstack, -size);
|
||||
size = 0;
|
||||
|
||||
cp = sp;
|
||||
@ -2350,22 +2353,22 @@ gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn)
|
||||
cp++;
|
||||
}
|
||||
if (size == 0)
|
||||
obstack_1grow (&string_obstack, '*');
|
||||
obstack_1grow (string_obstack, '*');
|
||||
else
|
||||
add_mnemonic_string (mnemonic_htab,
|
||||
(char *) obstack_next_free (&string_obstack) - size,
|
||||
(char *) obstack_next_free (string_obstack) - size,
|
||||
size);
|
||||
i++;
|
||||
}
|
||||
|
||||
/* An insn definition might emit an empty string. */
|
||||
if (obstack_object_size (&string_obstack) == 0)
|
||||
if (obstack_object_size (string_obstack) == 0)
|
||||
return;
|
||||
|
||||
obstack_1grow (&string_obstack, '\0');
|
||||
obstack_1grow (string_obstack, '\0');
|
||||
|
||||
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);
|
||||
strcpy (attr_name, MNEMONIC_ATTR_NAME);
|
||||
XSTR (set_attr, 0) = attr_name;
|
||||
@ -2388,8 +2391,10 @@ gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn)
|
||||
static int
|
||||
mnemonic_htab_callback (void **slot, void *info ATTRIBUTE_UNUSED)
|
||||
{
|
||||
obstack_grow (&string_obstack, (char*)*slot, strlen ((char*)*slot));
|
||||
obstack_1grow (&string_obstack, ',');
|
||||
struct obstack *string_obstack = rtx_reader_ptr->get_string_obstack ();
|
||||
|
||||
obstack_grow (string_obstack, (char*) *slot, strlen ((char*) *slot));
|
||||
obstack_1grow (string_obstack, ',');
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -2407,6 +2412,7 @@ gen_mnemonic_attr (void)
|
||||
htab_t mnemonic_htab;
|
||||
const char *str, *p;
|
||||
int i;
|
||||
struct obstack *string_obstack = rtx_reader_ptr->get_string_obstack ();
|
||||
|
||||
if (have_error)
|
||||
return;
|
||||
@ -2470,8 +2476,8 @@ gen_mnemonic_attr (void)
|
||||
htab_traverse (mnemonic_htab, mnemonic_htab_callback, NULL);
|
||||
|
||||
/* Replace the last ',' with the zero end character. */
|
||||
*((char *)obstack_next_free (&string_obstack) - 1) = '\0';
|
||||
XSTR (mnemonic_attr, 1) = XOBFINISH (&string_obstack, char *);
|
||||
*((char *) obstack_next_free (string_obstack) - 1) = '\0';
|
||||
XSTR (mnemonic_attr, 1) = XOBFINISH (string_obstack, char *);
|
||||
}
|
||||
|
||||
/* 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 ("{\n");
|
||||
printf (" return ");
|
||||
print_c_condition (test);
|
||||
rtx_reader_ptr->print_c_condition (test);
|
||||
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 "coretypes.h"
|
||||
#include "errors.h"
|
||||
#include "statistics.h"
|
||||
#include "vec.h"
|
||||
#include "read-md.h"
|
||||
|
||||
/* Associates PTR (which can be a string, etc.) with the file location
|
||||
@ -31,25 +33,6 @@ struct ptr_loc {
|
||||
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
|
||||
processed. To be used for creation of the dependency file. */
|
||||
void (*include_callback) (const char *);
|
||||
@ -58,13 +41,6 @@ void (*include_callback) (const char *);
|
||||
|
||||
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
|
||||
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. */
|
||||
|
||||
static void
|
||||
set_md_ptr_loc (const void *ptr, const char *filename, int lineno)
|
||||
void
|
||||
rtx_reader::set_md_ptr_loc (const void *ptr, const char *filename, int lineno)
|
||||
{
|
||||
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));
|
||||
loc->ptr = ptr;
|
||||
loc->filename = filename;
|
||||
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
|
||||
position was set. */
|
||||
|
||||
static const struct ptr_loc *
|
||||
get_md_ptr_loc (const void *ptr)
|
||||
const struct ptr_loc *
|
||||
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. */
|
||||
|
||||
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);
|
||||
if (loc != 0)
|
||||
@ -138,7 +114,7 @@ copy_md_ptr_loc (const void *new_ptr, const void *old_ptr)
|
||||
directive for it to OUTF. */
|
||||
|
||||
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);
|
||||
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. */
|
||||
void
|
||||
print_md_ptr_loc (const void *ptr)
|
||||
rtx_reader::print_md_ptr_loc (const void *ptr)
|
||||
{
|
||||
fprint_md_ptr_loc (stdout, ptr);
|
||||
}
|
||||
@ -156,7 +132,7 @@ print_md_ptr_loc (const void *ptr)
|
||||
may be null or empty. */
|
||||
|
||||
const char *
|
||||
join_c_conditions (const char *cond1, const char *cond2)
|
||||
rtx_reader::join_c_conditions (const char *cond1, const char *cond2)
|
||||
{
|
||||
char *result;
|
||||
const void **entry;
|
||||
@ -171,11 +147,11 @@ join_c_conditions (const char *cond1, const char *cond2)
|
||||
return cond1;
|
||||
|
||||
result = concat ("(", cond1, ") && (", cond2, ")", NULL);
|
||||
obstack_ptr_grow (&joined_conditions_obstack, result);
|
||||
obstack_ptr_grow (&joined_conditions_obstack, cond1);
|
||||
obstack_ptr_grow (&joined_conditions_obstack, cond2);
|
||||
entry = XOBFINISH (&joined_conditions_obstack, const void **);
|
||||
*htab_find_slot (joined_conditions, entry, INSERT) = entry;
|
||||
obstack_ptr_grow (&m_joined_conditions_obstack, result);
|
||||
obstack_ptr_grow (&m_joined_conditions_obstack, cond1);
|
||||
obstack_ptr_grow (&m_joined_conditions_obstack, cond2);
|
||||
entry = XOBFINISH (&m_joined_conditions_obstack, const void **);
|
||||
*htab_find_slot (m_joined_conditions, entry, INSERT) = entry;
|
||||
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. */
|
||||
|
||||
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)
|
||||
{
|
||||
fprintf (outf, "(");
|
||||
@ -207,7 +183,7 @@ fprint_c_condition (FILE *outf, const char *cond)
|
||||
/* Special fprint_c_condition for writing to STDOUT. */
|
||||
|
||||
void
|
||||
print_c_condition (const char *cond)
|
||||
rtx_reader::print_c_condition (const char *cond)
|
||||
{
|
||||
fprint_c_condition (stdout, cond);
|
||||
}
|
||||
@ -414,7 +390,7 @@ rtx_reader::unread_char (int ch)
|
||||
punctuation chars of rtx printed syntax. */
|
||||
|
||||
void
|
||||
read_name (struct md_name *name)
|
||||
rtx_reader::read_name (struct md_name *name)
|
||||
{
|
||||
int c;
|
||||
size_t i;
|
||||
@ -458,7 +434,7 @@ read_name (struct md_name *name)
|
||||
name->buffer[i] = 0;
|
||||
name->string = name->buffer;
|
||||
|
||||
if (md_constants)
|
||||
if (m_md_constants)
|
||||
{
|
||||
/* Do constant expansion. */
|
||||
struct md_constant *def;
|
||||
@ -468,7 +444,7 @@ read_name (struct md_name *name)
|
||||
struct md_constant tmp_def;
|
||||
|
||||
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)
|
||||
name->string = def->value;
|
||||
}
|
||||
@ -479,8 +455,8 @@ read_name (struct md_name *name)
|
||||
/* Subroutine of the string readers. Handles backslash escapes.
|
||||
Caller has read the backslash, but not placed it into the obstack. */
|
||||
|
||||
static void
|
||||
read_escape (void)
|
||||
void
|
||||
rtx_reader::read_escape ()
|
||||
{
|
||||
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 '0': case '1': case '2': case '3': case '4': case '5': case '6':
|
||||
case '7': case 'x':
|
||||
obstack_1grow (&string_obstack, '\\');
|
||||
obstack_1grow (&m_string_obstack, '\\');
|
||||
break;
|
||||
|
||||
/* \; makes stuff for a C string constant containing
|
||||
newline and tab. */
|
||||
case ';':
|
||||
obstack_grow (&string_obstack, "\\n\\t", 4);
|
||||
obstack_grow (&m_string_obstack, "\\n\\t", 4);
|
||||
return;
|
||||
|
||||
/* pass anything else through, but issue a warning. */
|
||||
default:
|
||||
fprintf (stderr, "%s:%d: warning: unrecognized escape \\%c\n",
|
||||
rtx_reader_ptr->get_filename (), rtx_reader_ptr->get_lineno (),
|
||||
get_filename (), get_lineno (),
|
||||
c);
|
||||
obstack_1grow (&string_obstack, '\\');
|
||||
obstack_1grow (&m_string_obstack, '\\');
|
||||
break;
|
||||
}
|
||||
|
||||
obstack_1grow (&string_obstack, c);
|
||||
obstack_1grow (&m_string_obstack, c);
|
||||
}
|
||||
|
||||
/* Read a double-quoted string onto the obstack. Caller has scanned
|
||||
the leading quote. */
|
||||
|
||||
char *
|
||||
read_quoted_string (void)
|
||||
rtx_reader::read_quoted_string ()
|
||||
{
|
||||
int c;
|
||||
|
||||
@ -548,25 +524,25 @@ read_quoted_string (void)
|
||||
else if (c == '"' || c == EOF)
|
||||
break;
|
||||
|
||||
obstack_1grow (&string_obstack, c);
|
||||
obstack_1grow (&m_string_obstack, c);
|
||||
}
|
||||
|
||||
obstack_1grow (&string_obstack, 0);
|
||||
return XOBFINISH (&string_obstack, char *);
|
||||
obstack_1grow (&m_string_obstack, 0);
|
||||
return XOBFINISH (&m_string_obstack, char *);
|
||||
}
|
||||
|
||||
/* Read a braced string (a la Tcl) onto the string obstack. Caller
|
||||
has scanned the leading brace. Note that unlike quoted strings,
|
||||
the outermost braces _are_ included in the string constant. */
|
||||
|
||||
static char *
|
||||
read_braced_string (void)
|
||||
char *
|
||||
rtx_reader::read_braced_string ()
|
||||
{
|
||||
int c;
|
||||
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)
|
||||
{
|
||||
c = read_char (); /* Read the string */
|
||||
@ -585,11 +561,11 @@ read_braced_string (void)
|
||||
("missing closing } for opening brace on line %lu",
|
||||
starting_read_md_lineno);
|
||||
|
||||
obstack_1grow (&string_obstack, c);
|
||||
obstack_1grow (&m_string_obstack, c);
|
||||
}
|
||||
|
||||
obstack_1grow (&string_obstack, 0);
|
||||
return XOBFINISH (&string_obstack, char *);
|
||||
obstack_1grow (&m_string_obstack, 0);
|
||||
return XOBFINISH (&m_string_obstack, char *);
|
||||
}
|
||||
|
||||
/* 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. */
|
||||
|
||||
char *
|
||||
read_string (int star_if_braced)
|
||||
rtx_reader::read_string (int star_if_braced)
|
||||
{
|
||||
char *stringbuf;
|
||||
int saw_paren = 0;
|
||||
@ -610,13 +586,13 @@ read_string (int star_if_braced)
|
||||
c = read_skip_spaces ();
|
||||
}
|
||||
|
||||
old_lineno = rtx_reader_ptr->get_lineno ();
|
||||
old_lineno = get_lineno ();
|
||||
if (c == '"')
|
||||
stringbuf = read_quoted_string ();
|
||||
else if (c == '{')
|
||||
{
|
||||
if (star_if_braced)
|
||||
obstack_1grow (&string_obstack, '*');
|
||||
obstack_1grow (&m_string_obstack, '*');
|
||||
stringbuf = read_braced_string ();
|
||||
}
|
||||
else
|
||||
@ -625,15 +601,15 @@ read_string (int star_if_braced)
|
||||
if (saw_paren)
|
||||
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;
|
||||
}
|
||||
|
||||
/* Skip the rest of a construct that started at line LINENO and that
|
||||
is currently nested by DEPTH levels of parentheses. */
|
||||
|
||||
static void
|
||||
read_skip_construct (int depth, file_location loc)
|
||||
void
|
||||
rtx_reader::read_skip_construct (int depth, file_location loc)
|
||||
{
|
||||
struct md_name name;
|
||||
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
|
||||
after the "define_constants". */
|
||||
|
||||
static void
|
||||
handle_constants (void)
|
||||
void
|
||||
rtx_reader::handle_constants ()
|
||||
{
|
||||
int c;
|
||||
htab_t defs;
|
||||
@ -783,8 +759,8 @@ handle_constants (void)
|
||||
require_char_ws ('[');
|
||||
|
||||
/* Disable constant expansion during definition processing. */
|
||||
defs = md_constants;
|
||||
md_constants = 0;
|
||||
defs = m_md_constants;
|
||||
m_md_constants = 0;
|
||||
while ( (c = read_skip_spaces ()) != ']')
|
||||
{
|
||||
struct md_name name, value;
|
||||
@ -798,7 +774,7 @@ handle_constants (void)
|
||||
|
||||
require_char_ws (')');
|
||||
}
|
||||
md_constants = defs;
|
||||
m_md_constants = defs;
|
||||
}
|
||||
|
||||
/* For every constant definition, call CALLBACK with two arguments:
|
||||
@ -806,9 +782,9 @@ handle_constants (void)
|
||||
Stop when CALLBACK returns zero. */
|
||||
|
||||
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. */
|
||||
@ -828,8 +804,8 @@ md_decimal_string (int number)
|
||||
number on which the directive started and MD_P is true if the
|
||||
directive is a define_enum rather than a define_c_enum. */
|
||||
|
||||
static void
|
||||
handle_enum (file_location loc, bool md_p)
|
||||
void
|
||||
rtx_reader::handle_enum (file_location loc, bool md_p)
|
||||
{
|
||||
char *enum_name, *value_name;
|
||||
struct md_name name;
|
||||
@ -839,7 +815,7 @@ handle_enum (file_location loc, bool md_p)
|
||||
int c;
|
||||
|
||||
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)
|
||||
{
|
||||
def = (struct enum_type *) *slot;
|
||||
@ -883,7 +859,7 @@ handle_enum (file_location loc, bool md_p)
|
||||
value_name = xstrdup (name.string);
|
||||
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);
|
||||
|
||||
*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. */
|
||||
|
||||
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:
|
||||
@ -905,9 +881,9 @@ lookup_enum_type (const char *name)
|
||||
returns zero. */
|
||||
|
||||
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. */
|
||||
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::~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. */
|
||||
rtx_reader_ptr = NULL;
|
||||
}
|
||||
@ -1105,20 +1112,6 @@ rtx_reader::read_md_files (int argc, const char **argv,
|
||||
bool already_read_stdin;
|
||||
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. */
|
||||
for (i = 1; i < argc; i++)
|
||||
if (argv[i][0] == '-')
|
||||
|
@ -107,14 +107,54 @@ class rtx_reader
|
||||
|
||||
file_location get_current_location () const;
|
||||
|
||||
/* Defined in read-md.c. */
|
||||
int read_char (void);
|
||||
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_filename () const { return m_read_md_filename; }
|
||||
int get_lineno () const { return m_read_md_lineno; }
|
||||
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:
|
||||
/* A singly-linked list of filenames. */
|
||||
struct file_name_list {
|
||||
@ -159,6 +199,32 @@ class rtx_reader
|
||||
|
||||
/* A pointer to the null terminator of the md include chain. */
|
||||
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. */
|
||||
@ -175,7 +241,6 @@ class noop_reader : public rtx_reader
|
||||
void handle_unknown_directive (file_location, const char *);
|
||||
};
|
||||
|
||||
extern struct obstack string_obstack;
|
||||
extern void (*include_callback) (const char *);
|
||||
|
||||
/* 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 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 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 error_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 int read_skip_spaces (void);
|
||||
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 const char *scan_comma_elt (const char **);
|
||||
extern void upcase_string (char *);
|
||||
extern void traverse_md_constants (htab_trav, void *);
|
||||
extern void traverse_enum_types (htab_trav, void *);
|
||||
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;
|
||||
|
||||
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. */
|
||||
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
|
||||
if any changes were needed, otherwise return STRING itself. */
|
||||
|
||||
static const char *
|
||||
apply_iterator_to_string (const char *string)
|
||||
const char *
|
||||
rtx_reader::apply_iterator_to_string (const char *string)
|
||||
{
|
||||
char *base, *copy, *p, *start, *end;
|
||||
struct map_value *v;
|
||||
@ -351,14 +347,14 @@ apply_iterator_to_string (const char *string)
|
||||
|
||||
/* Add everything between the last copied byte and the '<',
|
||||
then add in the attribute value. */
|
||||
obstack_grow (&string_obstack, base, start - base);
|
||||
obstack_grow (&string_obstack, v->string, strlen (v->string));
|
||||
obstack_grow (&m_string_obstack, base, start - base);
|
||||
obstack_grow (&m_string_obstack, v->string, strlen (v->string));
|
||||
base = end + 1;
|
||||
}
|
||||
if (base != copy)
|
||||
{
|
||||
obstack_grow (&string_obstack, base, strlen (base) + 1);
|
||||
copy = XOBFINISH (&string_obstack, char *);
|
||||
obstack_grow (&m_string_obstack, base, strlen (base) + 1);
|
||||
copy = XOBFINISH (&m_string_obstack, char *);
|
||||
copy_md_ptr_loc (copy, string);
|
||||
return copy;
|
||||
}
|
||||
@ -368,8 +364,8 @@ apply_iterator_to_string (const char *string)
|
||||
/* Return a deep copy of X, substituting the current iterator
|
||||
values into any strings. */
|
||||
|
||||
static rtx
|
||||
copy_rtx_for_iterators (rtx original)
|
||||
rtx
|
||||
rtx_reader::copy_rtx_for_iterators (rtx original)
|
||||
{
|
||||
const char *format_ptr, *p;
|
||||
int i, j;
|
||||
@ -428,7 +424,7 @@ add_condition_to_string (const char *original, const char *extra)
|
||||
{
|
||||
if (original != 0 && original[0] == '&' && original[1] == '&')
|
||||
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. */
|
||||
@ -543,10 +539,10 @@ apply_iterators (rtx original, vec<rtx> *queue)
|
||||
continue;
|
||||
v = iuse->iterator->current_value;
|
||||
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 ();
|
||||
x = copy_rtx_for_iterators (original);
|
||||
x = rtx_reader_ptr->copy_rtx_for_iterators (original);
|
||||
add_condition_to_rtx (x, condition);
|
||||
|
||||
/* 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
|
||||
slipped in at the beginning of the sequence of MD files read by
|
||||
most of the other generators. */
|
||||
static void
|
||||
read_conditions (void)
|
||||
void
|
||||
rtx_reader::read_conditions ()
|
||||
{
|
||||
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
|
||||
callback. */
|
||||
|
||||
static void
|
||||
record_potential_iterator_use (struct iterator_group *group, void *ptr,
|
||||
const char *name)
|
||||
void
|
||||
rtx_reader::record_potential_iterator_use (struct iterator_group *group,
|
||||
void *ptr, const char *name)
|
||||
{
|
||||
struct mapping *m;
|
||||
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
|
||||
angle brackets around it. */
|
||||
obstack_grow0 (&string_obstack, name + 1, len - 2);
|
||||
record_attribute_use (group, ptr, XOBFINISH (&string_obstack, char *));
|
||||
obstack_grow0 (&m_string_obstack, name + 1, len - 2);
|
||||
record_attribute_use (group, ptr, XOBFINISH (&m_string_obstack, char *));
|
||||
}
|
||||
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
|
||||
(which belongs to GROUP) and return it. */
|
||||
|
||||
static struct mapping *
|
||||
read_mapping (struct iterator_group *group, htab_t table)
|
||||
struct mapping *
|
||||
rtx_reader::read_mapping (struct iterator_group *group, htab_t table)
|
||||
{
|
||||
struct md_name name;
|
||||
struct mapping *m;
|
||||
@ -974,7 +970,7 @@ read_subst_mapping (htab_t subst_iters_table, htab_t subst_attrs_table,
|
||||
int 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);
|
||||
|
||||
@ -1019,7 +1015,7 @@ check_code_iterator (struct mapping *iterator)
|
||||
store the list of rtxes as an EXPR_LIST in *X. */
|
||||
|
||||
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;
|
||||
|
||||
@ -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
|
||||
return it. */
|
||||
|
||||
static rtx
|
||||
read_rtx_code (const char *code_name)
|
||||
rtx
|
||||
rtx_reader::read_rtx_code (const char *code_name)
|
||||
{
|
||||
RTX_CODE code;
|
||||
struct mapping *iterator;
|
||||
@ -1200,8 +1196,8 @@ read_rtx_code (const char *code_name)
|
||||
based on the corresponding format character within GET_RTX_FORMAT
|
||||
for the GET_CODE (RETURN_RTX). */
|
||||
|
||||
static void
|
||||
read_rtx_operand (rtx return_rtx, int idx)
|
||||
void
|
||||
rtx_reader::read_rtx_operand (rtx return_rtx, int idx)
|
||||
{
|
||||
RTX_CODE code = GET_CODE (return_rtx);
|
||||
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))
|
||||
{
|
||||
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 *slash;
|
||||
for (slash = fn; *slash; slash ++)
|
||||
if (*slash == '/' || *slash == '\\' || *slash == ':')
|
||||
fn = slash + 1;
|
||||
obstack_1grow (&string_obstack, '*');
|
||||
obstack_grow (&string_obstack, fn, strlen (fn));
|
||||
sprintf (line_name, ":%d", rtx_reader_ptr->get_lineno ());
|
||||
obstack_grow (&string_obstack, line_name, strlen (line_name)+1);
|
||||
stringbuf = XOBFINISH (&string_obstack, char *);
|
||||
obstack_1grow (&m_string_obstack, '*');
|
||||
obstack_grow (&m_string_obstack, fn, strlen (fn));
|
||||
sprintf (line_name, ":%d", get_lineno ());
|
||||
obstack_grow (&m_string_obstack, line_name, strlen (line_name)+1);
|
||||
stringbuf = XOBFINISH (&m_string_obstack, char *);
|
||||
}
|
||||
|
||||
/* 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. */
|
||||
|
||||
static rtx
|
||||
read_nested_rtx (void)
|
||||
rtx
|
||||
rtx_reader::read_nested_rtx ()
|
||||
{
|
||||
struct md_name name;
|
||||
rtx return_rtx;
|
||||
@ -1427,8 +1423,8 @@ read_nested_rtx (void)
|
||||
When called, FORM is (thing x1 x2), and the file position
|
||||
is just past the leading parenthesis of x3. Only works
|
||||
for THINGs which are dyadic expressions, e.g. AND, IOR. */
|
||||
static rtx
|
||||
read_rtx_variadic (rtx form)
|
||||
rtx
|
||||
rtx_reader::read_rtx_variadic (rtx form)
|
||||
{
|
||||
char c = '(';
|
||||
rtx p = form, q;
|
||||
|
Loading…
Reference in New Issue
Block a user