From: Matthias Braun Date: Wed, 30 Apr 2008 12:05:02 +0000 (+0000) Subject: avoid dangerous use of memcmp X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=f600524c363556c785b85c0dff8792d04f73e252;p=libfirm avoid dangerous use of memcmp [r19467] --- diff --git a/ir/be/bearch_t.h b/ir/be/bearch_t.h index 4b10f6a2f..0e7590b0d 100644 --- a/ir/be/bearch_t.h +++ b/ir/be/bearch_t.h @@ -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 */ diff --git a/ir/be/benode.c b/ir/be/benode.c index e4f1bbfbc..bdd3349b9 100644 --- a/ir/be/benode.c +++ b/ir/be/benode.c @@ -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; }