diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-09-18 00:33:02 +0200 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-10-22 07:03:04 +0200 |
| commit | 42363a630185eab18ce12afd2e7d1c959d690396 (patch) | |
| tree | 6c1a04b6e284ae299362329ee733c1f289640ca6 /linearize.c | |
| parent | cfca7b4c6cb48283cb554fc91dc859ff669f2547 (diff) | |
| download | sparse-dev-42363a630185eab18ce12afd2e7d1c959d690396.tar.gz | |
memops need long offsets
These days, declaring arrays bigger than 2GB or doing pointer
arithmetic with an offset larger than 2^31 is maybe not usual but
certainly not outrageous.
However, currently Sparse silently truncates 32 bits the offsets
of memory accesses.
So, fix this by using 64-bit offsets for memory accesses.
Also, use a signed type since these offsets can be negative.
Note: I had a really nice (real) example for this but the margin
of this patch is too small for it (and now I've lost it).
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Diffstat (limited to 'linearize.c')
| -rw-r--r-- | linearize.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/linearize.c b/linearize.c index 1081bda8..b7da35fa 100644 --- a/linearize.c +++ b/linearize.c @@ -426,10 +426,10 @@ const char *show_instruction(struct instruction *insn) break; } case OP_LOAD: - buf += sprintf(buf, "%s <- %d[%s]", show_pseudo(insn->target), insn->offset, show_pseudo(insn->src)); + buf += sprintf(buf, "%s <- %lld[%s]", show_pseudo(insn->target), insn->offset, show_pseudo(insn->src)); break; case OP_STORE: - buf += sprintf(buf, "%s -> %d[%s]", show_pseudo(insn->target), insn->offset, show_pseudo(insn->src)); + buf += sprintf(buf, "%s -> %lld[%s]", show_pseudo(insn->target), insn->offset, show_pseudo(insn->src)); break; case OP_INLINED_CALL: case OP_CALL: { @@ -925,7 +925,7 @@ struct access_data { struct symbol *type; // ctype struct symbol *btype; // base type of bitfields pseudo_t address; // pseudo containing address .. - unsigned int offset; // byte offset + long long offset; // byte offset }; static int linearize_simple_address(struct entrypoint *ep, |
