genattrtab.c (evaluate_eq_attr): Allow an attribute to be defined in terms of another.
authorBernd Schmidt <bernds@codesourcery.com>
Fri, 8 Jul 2011 16:08:13 +0000 (16:08 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Fri, 8 Jul 2011 16:08:13 +0000 (16:08 +0000)
* 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

gcc/ChangeLog
gcc/genattrtab.c

index 1cb2ce05c806b2f79e37eaa9a69756193610af89..0fc7dfd0ef9fb082210aff7db12ae8de8ef2490c 100644 (file)
@@ -1,3 +1,9 @@
+2011-07-08  Bernd Schmidt  <bernds@codesourcery.com>
+
+       * 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  <rguenther@suse.de>
 
        * 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  <avr@gjlay.de>
-       
+
        * config/avr/avr.c (output_reload_insisf): Use 'REG_Z+1' instead
        of magic '31'.
 
index 497660428c352d97eaa455fa137ccc5f7d872c3c..e927ca2492c58c5b7e9a1c77ffa10cfd3714bbec 100644 (file)
@@ -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"));
       }