diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2017-03-08 08:19:50 +0100 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2017-11-17 10:04:36 +0100 |
| commit | 36fdd6e4ee4a3181ce47d885f818a3d15ad3f905 (patch) | |
| tree | a79ace370ae006b21534926e4c0e61a726c993bc /validation/backend/constant-pointer.c | |
| parent | 1b78178a9bccdedf29f08e5517817f0b16e70949 (diff) | |
| download | sparse-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.c | 24 |
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 + */ |
