diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2017-08-15 09:38:40 +0200 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-06-23 07:46:40 +0200 |
| commit | ff7f001bef9aa88ff951d61ec10772e7d2143180 (patch) | |
| tree | dc9f33aea66424b69f017843a24b096238493f0e | |
| parent | 0d19a077e74ce523f05b64708517bd657721a68e (diff) | |
| download | sparse-dev-ff7f001bef9aa88ff951d61ec10772e7d2143180.tar.gz | |
cast: temporary simplify handling cast to/from void*
Currently pointer casts from/to void are treated as casts
to/from integer. The rationale being that a void pointer can't
anyway be dereferenced.
Allow to continue to do so by using a new 'machine type' for void
pointers which then allow to select the right type of cast:
OP_PTRCAST or OP_[S]CAST.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
| -rw-r--r-- | linearize.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/linearize.c b/linearize.c index 413b8ab5..01bd68d2 100644 --- a/linearize.c +++ b/linearize.c @@ -1167,6 +1167,7 @@ enum mtype { MTYPE_UINT, MTYPE_SINT, MTYPE_PTR, + MTYPE_VPTR, // TODO: must be removed ? MTYPE_FLOAT, MTYPE_BAD, }; @@ -1181,8 +1182,7 @@ retry: switch (s->type) { goto retry; case SYM_PTR: if (s->ctype.base_type == &void_ctype) - // handle void pointer like an uint - goto case_int; + return MTYPE_VPTR; return MTYPE_PTR; case SYM_BITFIELD: case SYM_RESTRICT: @@ -1226,14 +1226,25 @@ static int get_cast_opcode(struct symbol *dst, struct symbol *src) switch (stype) { case MTYPE_UINT: case MTYPE_SINT: - if (is_ptr_type(src)) // must be a void pointer - return OP_PTRCAST;// FIXME: to be removed? return OP_UTPTR; case MTYPE_PTR: + case MTYPE_VPTR: return OP_PTRCAST; default: return OP_BADOP; } + case MTYPE_VPTR: + switch (stype) { + case MTYPE_PTR: + case MTYPE_VPTR: + case MTYPE_UINT: + return OP_CAST; + case MTYPE_SINT: + return OP_SCAST; + default: + return OP_BADOP; + break; + } case MTYPE_UINT: case MTYPE_SINT: switch (stype) { |
