logo

oasis

Own branch of Oasis Linux (upstream: <https://git.sr.ht/~mcf/oasis/>) git clone https://anongit.hacktivis.me/git/oasis.git
commit: 4b4af15f94153bc9a4fc9e546715c57ab9738671
parent b72e6b1e8aab4201bd95b0f3caa1fad5bf44c1da
Author: Michael Forney <mforney@mforney.org>
Date:   Wed, 20 Nov 2019 00:30:25 -0800

qbe: Fix usage of compound literal outside its scope

This popped up after upgrading to gcc 9.2, so is likely caused by
some new optimization.

Diffstat:

Apkg/qbe/patch/0012-copy-Fix-use-of-compound-literal-outside-its-scope.patch55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpkg/qbe/ver2+-
2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/pkg/qbe/patch/0012-copy-Fix-use-of-compound-literal-outside-its-scope.patch b/pkg/qbe/patch/0012-copy-Fix-use-of-compound-literal-outside-its-scope.patch @@ -0,0 +1,55 @@ +From 16e9c4852eb471f9a96219ab38b6bb44a8d49ac9 Mon Sep 17 00:00:00 2001 +From: Michael Forney <mforney@mforney.org> +Date: Wed, 20 Nov 2019 00:01:42 -0800 +Subject: [PATCH] copy: Fix use of compound literal outside its scope + +C99 6.5.2.5p6: +> If the compound literal occurs outside the body of a function, +> the object has static storage duration; otherwise, it has automatic +> storage duration associated with the enclosing block. + +So, we can't use the address of a compound literal here. Instead, +just set p to NULL, and make the loop conditional on p being non-NULL. +--- + copy.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +diff --git a/copy.c b/copy.c +index 3aa3b98..6fb0f98 100644 +--- a/copy.c ++++ b/copy.c +@@ -77,7 +77,7 @@ phisimpl(Phi *p, Ref r, Ref *cpy, Use ***pstk, BSet *ts, BSet *as, Fn *fn) + while (nstk) { + u = stk[--nstk]; + if (u->type == UIns && iscopy(u->u.ins, r, fn)) { +- p = &(Phi){.narg = 0}; ++ p = NULL; + t = u->u.ins->to.val; + } + else if (u->type == UPhi) { +@@ -89,13 +89,15 @@ phisimpl(Phi *p, Ref r, Ref *cpy, Use ***pstk, BSet *ts, BSet *as, Fn *fn) + if (bshas(ts, t)) + continue; + bsset(ts, t); +- for (a=0; a<p->narg; a++) { +- r1 = copyof(p->arg[a], cpy); +- if (req(r1, r)) +- continue; +- if (rtype(r1) != RTmp) +- return; +- bsset(as, r1.val); ++ if (p) { ++ for (a=0; a<p->narg; a++) { ++ r1 = copyof(p->arg[a], cpy); ++ if (req(r1, r)) ++ continue; ++ if (rtype(r1) != RTmp) ++ return; ++ bsset(as, r1.val); ++ } + } + u = fn->tmp[t].use; + u1 = &u[fn->tmp[t].nuse]; +-- +2.24.0 + diff --git a/pkg/qbe/ver b/pkg/qbe/ver @@ -1 +1 @@ -acc3af4733 r1 +acc3af4733 r2