avoid dangerous use of memcmp
authorMatthias Braun <matze@braunis.de>
Wed, 30 Apr 2008 12:05:02 +0000 (12:05 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 30 Apr 2008 12:05:02 +0000 (12:05 +0000)
[r19467]

ir/be/bearch_t.h
ir/be/benode.c

index 4b10f6a..0e7590b 100644 (file)
@@ -33,6 +33,7 @@
 #include "bemachine.h"
 #include "beirg.h"
 #include "beabi.h"
+#include "raw_bitset.h"
 
 /**
  * A register.
@@ -139,6 +140,32 @@ struct arch_register_req_t {
                                                 (must_be_different) */
 };
 
+static INLINE int reg_reqs_equal(const arch_register_req_t *req1,
+                                 const arch_register_req_t *req2)
+{
+       if (req1 == req2)
+               return 1;
+
+       if (req1->type != req2->type
+                       || req1->cls != req2->cls
+                       || req1->other_same != req2->other_same
+                       || req1->other_different != req2->other_different)
+               return 0;
+
+       if (req1->limited != NULL) {
+               size_t n_regs;
+
+               if (req2->limited == NULL)
+                       return 0;
+
+               n_regs = arch_register_class_n_regs(req1->cls);
+               if (!rbitset_equal(req1->limited, req2->limited, n_regs))
+                       return 0;
+       }
+
+       return 1;
+}
+
 /**
  * An inverse operation returned by the backend
  */
index e4f1bbf..bdd3349 100644 (file)
@@ -167,8 +167,8 @@ static int _node_cmp_attr(const be_node_attr_t *a, const be_node_attr_t *b) {
        len = ARR_LEN(a->reg_data);
        for (i = 0; i < len; ++i) {
                if (a->reg_data[i].reg != b->reg_data[i].reg ||
-                               memcmp(&a->reg_data[i].in_req, &b->reg_data[i].in_req, sizeof(b->reg_data[i].in_req)) ||
-                           memcmp(&a->reg_data[i].req,    &b->reg_data[i].req,    sizeof(a->reg_data[i].req)))
+                               !reg_reqs_equal(&a->reg_data[i].in_req, &b->reg_data[i].in_req) ||
+                           !reg_reqs_equal(&a->reg_data[i].req,    &b->reg_data[i].req))
                        return 1;
        }