aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-03-05 17:36:37 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-03-05 17:36:37 +0100
commite0f904856b3d665a84b4342b79967b97a3739545 (patch)
tree6bcf9d5aaed252c9416c867e508942d54b97bb65
parent41222364c4a6ba9e515df5eee96ae6262735fdc6 (diff)
parent778de2bf52a2bed588d1653aaebe2cbd25f80eac (diff)
downloadsparse-e0f904856b3d665a84b4342b79967b97a3739545.tar.gz
Merge branch 'slice'
* slice: small reorg of OP_SLICE in preparation for some incoming changes
-rw-r--r--Documentation/IR.rst2
-rw-r--r--evaluate.c1
-rw-r--r--expression.h2
-rw-r--r--linearize.c6
-rw-r--r--linearize.h5
-rw-r--r--liveness.c7
-rw-r--r--show-parse.c2
7 files changed, 9 insertions, 16 deletions
diff --git a/Documentation/IR.rst b/Documentation/IR.rst
index 38df84ff..e1613402 100644
--- a/Documentation/IR.rst
+++ b/Documentation/IR.rst
@@ -408,7 +408,7 @@ Others
Extract a "slice" from an aggregate.
* .base: (pseudo_t) aggregate (alias .src)
- * .from, .len: offet & size of the "slice" within the aggregate
+ * .from: offset of the "slice" within the aggregate
* .target: result
* .type: type of .target
diff --git a/evaluate.c b/evaluate.c
index a661027f..eea6b7ad 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -2170,7 +2170,6 @@ static struct symbol *evaluate_member_dereference(struct expression *expr)
}
expr->r_bitpos += bytes_to_bits(offset);
expr->type = EXPR_SLICE;
- expr->r_nrbits = member->bit_size;
expr->r_bitpos += member->bit_offset;
expr->ctype = member;
return member;
diff --git a/expression.h b/expression.h
index 3e9e9d85..f733c076 100644
--- a/expression.h
+++ b/expression.h
@@ -206,7 +206,7 @@ struct expression {
// EXPR_SLICE
struct /* slice */ {
struct expression *base;
- unsigned r_bitpos, r_nrbits;
+ unsigned r_bitpos;
};
// EXPR_CAST, EXPR_FORCE_CAST, EXPR_IMPLIED_CAST,
// EXPR_SIZEOF, EXPR_ALIGNOF and EXPR_PTRSIZEOF
diff --git a/linearize.c b/linearize.c
index 0c9b0e59..b06c0625 100644
--- a/linearize.c
+++ b/linearize.c
@@ -470,7 +470,7 @@ const char *show_instruction(struct instruction *insn)
break;
case OP_SLICE:
- buf += sprintf(buf, "%s <- %s, %d, %d", show_pseudo(insn->target), show_pseudo(insn->base), insn->from, insn->len);
+ buf += sprintf(buf, "%s <- (%d) %s, %d", show_pseudo(insn->target), type_size(insn->orig_type), show_pseudo(insn->src), insn->from);
break;
case OP_NOT: case OP_NEG:
@@ -1239,8 +1239,8 @@ static pseudo_t linearize_slice(struct entrypoint *ep, struct expression *expr)
insn->target = new;
insn->from = expr->r_bitpos;
- insn->len = expr->r_nrbits;
- use_pseudo(insn, pre, &insn->base);
+ insn->orig_type = expr->base->ctype;
+ use_pseudo(insn, pre, &insn->src);
add_one_insn(ep, insn);
return new;
}
diff --git a/linearize.h b/linearize.h
index 01ee656c..17e8c38a 100644
--- a/linearize.h
+++ b/linearize.h
@@ -113,6 +113,7 @@ struct instruction {
};
struct /* unops */ {
pseudo_t src;
+ unsigned from; /* slice */
struct symbol *orig_type; /* casts */
};
struct /* memops */ {
@@ -127,10 +128,6 @@ struct instruction {
pseudo_t _src1, _src2; // alias .src[12]
struct symbol *itype; // input operands' type
};
- struct /* slice */ {
- pseudo_t base;
- unsigned from, len;
- };
struct /* setval */ {
struct expression *val;
};
diff --git a/liveness.c b/liveness.c
index 30a9a5b6..5b10e5e1 100644
--- a/liveness.c
+++ b/liveness.c
@@ -76,7 +76,8 @@ static void track_instruction_usage(struct basic_block *bb, struct instruction *
/* Uni */
case OP_UNOP ... OP_UNOP_END:
case OP_SYMADDR:
- USES(src1); DEFINES(target);
+ case OP_SLICE:
+ USES(src); DEFINES(target);
break;
case OP_SEL:
@@ -121,10 +122,6 @@ static void track_instruction_usage(struct basic_block *bb, struct instruction *
} END_FOR_EACH_PTR(pseudo);
break;
- case OP_SLICE:
- USES(base); DEFINES(target);
- break;
-
case OP_ASM:
asm_liveness(bb, insn, def, use);
break;
diff --git a/show-parse.c b/show-parse.c
index 3ab8ec8f..e2fc18bb 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -819,7 +819,7 @@ static int show_slice(struct expression *expr)
{
int target = show_expression(expr->base);
int new = new_pseudo();
- printf("\tslice.%d\t\tv%d,v%d,%d\n", expr->r_nrbits, target, new, expr->r_bitpos);
+ printf("\tslice.%d\t\tv%d,v%d,%d\n", expr->ctype->bit_size, target, new, expr->r_bitpos);
return new;
}