diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2017-08-15 09:55:19 +0200 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-06-23 07:46:40 +0200 |
| commit | c8fac68af94b9d23b64e844a283f16b9bed2f9e0 (patch) | |
| tree | cc5ace2a1e618680ce141e5b0aa6ad7066bad21c /linearize.c | |
| parent | ff7f001bef9aa88ff951d61ec10772e7d2143180 (diff) | |
| download | sparse-dev-c8fac68af94b9d23b64e844a283f16b9bed2f9e0.tar.gz | |
cast: specialize cast from pointers
Currently all casts to pointers are processed alike. This is
simple but rather unconvenient in later phases as this
correspond to different operations that obeys to different
rules and which later need extra checks.
Change this by using a specific instructions (OP_UTPTR) for
[unsigned] integer to pointers.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Diffstat (limited to 'linearize.c')
| -rw-r--r-- | linearize.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/linearize.c b/linearize.c index 01bd68d2..de6e4b93 100644 --- a/linearize.c +++ b/linearize.c @@ -269,6 +269,7 @@ static const char *opcodes[] = { [OP_SCVTF] = "scvtf", [OP_FCVTF] = "fcvtf", [OP_UTPTR] = "utptr", + [OP_PTRTU] = "ptrtu", [OP_PTRCAST] = "ptrcast", [OP_INLINED_CALL] = "# call", [OP_CALL] = "call", @@ -454,6 +455,7 @@ const char *show_instruction(struct instruction *insn) case OP_UCVTF: case OP_SCVTF: case OP_FCVTF: case OP_UTPTR: + case OP_PTRTU: case OP_PTRCAST: buf += sprintf(buf, "%s <- (%d) %s", show_pseudo(insn->target), @@ -1250,6 +1252,11 @@ static int get_cast_opcode(struct symbol *dst, struct symbol *src) switch (stype) { case MTYPE_FLOAT: return dtype == MTYPE_UINT ? OP_FCVTU : OP_FCVTS; + case MTYPE_PTR: + return OP_PTRTU; + case MTYPE_VPTR: + case MTYPE_UINT: + return OP_CAST; case MTYPE_SINT: return OP_SCAST; default: |
