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 (but now I've lost it). Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- linearize.c | 6 +++--- linearize.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/linearize.c b/linearize.c index 1081bda86425..b7da35fa0ede 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, diff --git a/linearize.h b/linearize.h index 76efd0b47ffa..d8cbc3f339b4 100644 --- a/linearize.h +++ b/linearize.h @@ -117,7 +117,7 @@ struct instruction { }; struct /* memops */ { pseudo_t addr; /* alias .src */ - unsigned int offset; + long long offset; unsigned int is_volatile:1; }; struct /* binops and sel */ { -- 2.28.0