aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-02-20 10:04:34 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-02-21 14:43:02 +0100
commit34c57a7f73e14095364a8863070f8e8c9f62cdc4 (patch)
tree6eadc771e607edad7aa4847ff3d98bef71b1afc4
parentd7361313e11c698f5aef4ab5c9bc6ea90bdb58c9 (diff)
downloadsparse-34c57a7f73e14095364a8863070f8e8c9f62cdc4.tar.gz
asm-mem: does it clobber memory?
An asm statement can specify that it clobbers memory. Add this info directly in the corresponding instruction, avoiding the need to scan the clobber list each time. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--linearize.c8
-rw-r--r--linearize.h1
2 files changed, 8 insertions, 1 deletions
diff --git a/linearize.c b/linearize.c
index 33d641b4..4140b60c 100644
--- a/linearize.c
+++ b/linearize.c
@@ -2174,7 +2174,7 @@ static void add_asm_output(struct entrypoint *ep, struct instruction *insn, stru
static pseudo_t linearize_asm_statement(struct entrypoint *ep, struct statement *stmt)
{
struct instruction *insn;
- struct expression *expr;
+ struct expression *expr, *clob;
struct asm_rules *rules;
struct asm_operand *op;
@@ -2206,6 +2206,12 @@ static pseudo_t linearize_asm_statement(struct entrypoint *ep, struct statement
add_asm_output(ep, insn, op);
} END_FOR_EACH_PTR(op);
+ /* and finally, look if it clobbers memory */
+ FOR_EACH_PTR(stmt->asm_clobbers, clob) {
+ if (!strcmp(clob->string->data, "memory"))
+ insn->clobber_memory = 1;
+ } END_FOR_EACH_PTR(clob);
+
return VOID;
}
diff --git a/linearize.h b/linearize.h
index a77e4b3e..fb513276 100644
--- a/linearize.h
+++ b/linearize.h
@@ -150,6 +150,7 @@ struct instruction {
struct /* asm */ {
const char *string;
struct asm_rules *asm_rules;
+ int clobber_memory:1;
};
};
};