From 70adc3e3e8560eb76d5eb6b93a1f88be7fba549c Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 5 Sep 2023 09:06:28 +0200 Subject: make ptr offset in init take obj size into account --- c.c | 7 ++++--- test/init.c | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/c.c b/c.c index 3f2bdc5..daedde4 100644 --- a/c.c +++ b/c.c @@ -1114,11 +1114,12 @@ expr2reloc(union ref *psym, vlong *paddend, const struct expr *ex) } else if (globsym(psym, ex) && in_range(ex->ty.t, TYARRAY, TYFUNC)) { *paddend = 0; } else if (ex->t == ESUB && globsym(psym, &ex->sub[0]) && isint(ex->sub[1].ty) && ex->sub[1].t == ENUMLIT) { - *paddend = ex->sub[1].i; + *paddend = ex->sub[1].i * typesize(ex->sub[0].ty); } else if (ex->t == EADD) { for (int swp = 0; swp < 2; ++swp) { - if (globsym(psym, &ex->sub[swp]) && isint(ex->sub[swp^1].ty) && ex->sub[swp^1].t == ENUMLIT) { - *paddend = ex->sub[swp^1].i; + struct expr *a = &ex->sub[swp], *b = &ex->sub[swp ^ 1]; + if (globsym(psym, a) && isint(b->ty) && b->t == ENUMLIT) { + *paddend = b->i * typesize(a->ty); return; } } diff --git a/test/init.c b/test/init.c index 24d1b7f..4087cd9 100644 --- a/test/init.c +++ b/test/init.c @@ -41,7 +41,7 @@ void f() { } */ -void *rec[1] = {rec}; +void *rec[1] = {rec+1}; int printf(char *, ...); int main() { -- cgit v1.2.3