aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-01-18 03:53:17 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-09-27 03:15:34 +0200
commit2112249916c16b88591739fbc9f36400e9c009cd (patch)
treefbe6143c6753cabd410709b54ef4c8d47b830fb9
parentaa510823d308bcf27b8dc58ae8f4c13963a0bbcd (diff)
downloadsparse-2112249916c16b88591739fbc9f36400e9c009cd.tar.gz
asm: linearization of output memory operands is different
ASM memory operands are considered by GCC as some kind of implicit reference. Their linearization should thus not create any storage statement: the storage is done by the ASM code itself. Adjust the linearization of such operands accordingly. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--linearize.c13
-rw-r--r--validation/linear/asm-memop.c1
2 files changed, 9 insertions, 5 deletions
diff --git a/linearize.c b/linearize.c
index 7724350b..68be3ab1 100644
--- a/linearize.c
+++ b/linearize.c
@@ -2089,12 +2089,17 @@ static void add_asm_input(struct entrypoint *ep, struct instruction *insn, struc
static void add_asm_output(struct entrypoint *ep, struct instruction *insn, struct asm_operand *op)
{
struct access_data ad = { NULL, };
- pseudo_t pseudo = alloc_pseudo(insn);
+ pseudo_t pseudo;
struct asm_constraint *rule;
- if (!op->expr || !linearize_address_gen(ep, op->expr, &ad))
- return;
- linearize_store_gen(ep, pseudo, &ad);
+ if (op->is_memory) {
+ pseudo = linearize_expression(ep, op->expr);
+ } else {
+ if (!linearize_address_gen(ep, op->expr, &ad))
+ return;
+ pseudo = alloc_pseudo(insn);
+ linearize_store_gen(ep, pseudo, &ad);
+ }
rule = __alloc_asm_constraint(0);
rule->ident = op->name;
rule->constraint = op->constraint ? op->constraint->string->data : "";
diff --git a/validation/linear/asm-memop.c b/validation/linear/asm-memop.c
index 97df98e2..245c8d0f 100644
--- a/validation/linear/asm-memop.c
+++ b/validation/linear/asm-memop.c
@@ -8,7 +8,6 @@ static int foo(int *p)
/*
* check-name: linear-asm-memop
* check-command: test-linearize $file
- * check-known-to-fail
*
* check-output-start
foo: