Commit f600524c authored by Matthias Braun's avatar Matthias Braun
Browse files

avoid dangerous use of memcmp

[r19467]
parent bc79a622
......@@ -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
*/
......
......@@ -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;
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment