From: Bernd Schmidt Date: Fri, 8 Jul 2011 16:08:13 +0000 (+0000) Subject: genattrtab.c (evaluate_eq_attr): Allow an attribute to be defined in terms of another. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9ae601015839cc1835b55134bc9899c475ef77c2;p=gcc.git genattrtab.c (evaluate_eq_attr): Allow an attribute to be defined in terms of another. * genattrtab.c (evaluate_eq_attr): Allow an attribute to be defined in terms of another. (write_attr_value): Write a cast if necessary. From-SVN: r176047 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1cb2ce05c80..0fc7dfd0ef9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-07-08 Bernd Schmidt + + * genattrtab.c (evaluate_eq_attr): Allow an attribute to be defined + in terms of another. + (write_attr_value): Write a cast if necessary. + 2011-07-08 Richard Guenther * fold-const.c (fold_binary_loc): Remove index +p PTR -> PTR +p index @@ -19,7 +25,7 @@ overlapping when it is call to address. 2011-07-08 Georg-Johann Lay - + * config/avr/avr.c (output_reload_insisf): Use 'REG_Z+1' instead of magic '31'. diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c index 497660428c3..e927ca2492c 100644 --- a/gcc/genattrtab.c +++ b/gcc/genattrtab.c @@ -1916,6 +1916,37 @@ evaluate_eq_attr (rtx exp, struct attr_desc *attr, rtx value, rtx newexp; int i; + while (GET_CODE (value) == ATTR) + { + struct attr_value *av = NULL; + + attr = find_attr (&XSTR (value, 0), 0); + + if (insn_code_values) + { + struct attr_value_list *iv; + for (iv = insn_code_values[insn_code]; iv; iv = iv->next) + if (iv->attr == attr) + { + av = iv->av; + break; + } + } + else + { + struct insn_ent *ie; + for (av = attr->first_value; av; av = av->next) + for (ie = av->first_insn; ie; ie = ie->next) + if (ie->def->insn_code == insn_code) + goto got_av; + } + if (av) + { + got_av: + value = av->value; + } + } + switch (GET_CODE (value)) { case CONST_STRING: @@ -4119,6 +4150,13 @@ write_attr_value (struct attr_desc *attr, rtx value) case ATTR: { struct attr_desc *attr2 = find_attr (&XSTR (value, 0), 0); + if (attr->enum_name) + printf ("(enum %s)", attr->enum_name); + else if (!attr->is_numeric) + printf ("(enum attr_%s)", attr->name); + else if (!attr2->is_numeric) + printf ("(int)"); + printf ("get_attr_%s (%s)", attr2->name, (attr2->is_const ? "" : "insn")); }