aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/validation/backend/constant-pointer.c
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-03-08 08:19:50 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-11-17 10:04:36 +0100
commit36fdd6e4ee4a3181ce47d885f818a3d15ad3f905 (patch)
treea79ace370ae006b21534926e4c0e61a726c993bc /validation/backend/constant-pointer.c
parent1b78178a9bccdedf29f08e5517817f0b16e70949 (diff)
downloadsparse-dev-36fdd6e4ee4a3181ce47d885f818a3d15ad3f905.tar.gz
llvm: fix translation of PSEUDO_VALs into a ValueRefs
In sparse-llvm there is the assumption that a PSEUDO_VAL is always of integer type. But this is not always the case: constant pointers, like NULL, are also of the PSEUDO_VAL kind. Fix this by adding a helper 'val_to_value()' and using the instruction's type where this pseudo is used as the type of the value. Note: while this patch improve the situation, like for example for the test cases added here, it's still not correct because now we're making the assumption that 'insn->type' is the type we need for the pseudo. This is often true, but certainly not always. For example this is not true for: - OP_STORE/OP_LOAD's insn->src - OP_SET{EQ,...}'s insn->src[12] - probably some others ones - in general, obviously, for any instructions where the target has a different type than the operands. Reported-by: Dibyendu Majumdar <mobile@majumdar.org.uk> Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Diffstat (limited to 'validation/backend/constant-pointer.c')
-rw-r--r--validation/backend/constant-pointer.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/validation/backend/constant-pointer.c b/validation/backend/constant-pointer.c
new file mode 100644
index 00000000..9012c784
--- /dev/null
+++ b/validation/backend/constant-pointer.c
@@ -0,0 +1,24 @@
+extern int *ip[];
+
+void foo(void);
+void foo(void)
+{
+ ip[0] = (void *)0L;
+ ip[1] = (int *)0L;
+ ip[2] = (void *)0;
+ ip[3] = (int *)0;
+ ip[4] = (void *)(long)0;
+ ip[5] = (int *)(long)0;
+ ip[6] = (void *)123;
+ ip[7] = (int *)123;
+ ip[8] = (void *)123L;
+ ip[9] = (int *)123L;
+ ip[10] = (void *)(long)123;
+ ip[11] = (int *)(long)123;
+}
+
+/*
+ * check-name: constant pointers
+ * check-command: sparse-llvm $file
+ * check-output-ignore
+ */