From: Matthias Kaehlcke <mka@chromium.org>
To: Heiko Stuebner <heiko@sntech.de>
Cc: Elaine Zhang <zhangqing@rock-chips.com>,
Caesar Wang <wxt@rock-chips.com>,
Shawn Lin <shawn.lin@rock-chips.com>,
Douglas Anderson <dianders@chromium.org>,
Grant Grundler <grundler@chromium.org>,
linux-arm-kernel@lists.infradead.org,
linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v1] soc: rockchip: power-domain: Fix clang warning about negative shift count
Date: Mon, 13 Mar 2017 11:49:01 -0700 [thread overview]
Message-ID: <20170313184901.GB50582@google.com> (raw)
In-Reply-To: <20170313172222.GA50582@google.com>
El Mon, Mar 13, 2017 at 10:22:22AM -0700 Matthias Kaehlcke ha dit:
> El Sat, Mar 11, 2017 at 01:03:48PM +0100 Heiko Stuebner ha dit:
>
> > Hi Matthias,
> >
> > Am Freitag, 10. März 2017, 18:21:53 CET schrieb Matthias Kaehlcke:
> > > The following warning is generated when building with clang:
> > >
> > > drivers/soc/rockchip/pm_domains.c:726:22: error: shift count is negative
> > > [-Werror,-Wshift-count-negative] [RK3399_PD_TCPD0] = DOMAIN_RK3399(8,
> > > 8, -1, false),
> > > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > > drivers/soc/rockchip/pm_domains.c:101:2: note: expanded from macro
> > > 'DOMAIN_RK3399' DOMAIN(pwr, status, req, req, req, wakeup)
> > > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > > drivers/soc/rockchip/pm_domains.c:88:27: note: expanded from macro 'DOMAIN'
> > > .req_mask = (req >= 0) ? BIT(req) : 0, \
> > > ^~~~~~~~
> > > include/linux/bitops.h:6:24: note: expanded from macro 'BIT'
> > >
> > > The BIT macro is evaluated with the negative value -1, even though the
> > > resulting value would not be assigned. To fix this we only pass values
> > > between 0 and 63 to BIT(). Unfortunately this means that we lose the
> > > benefit of the compiler checking for out of bounds errors.
> >
> > I tend to disagree here. This looks more like a case of "fix your compiler".
> >
> > That conditional seems perfectly valid as the BIT(req) will never be reached
> > if req < 0 - your clang simply doesn't recognize the pattern somehow, while
> > for example gcc does.
>
> My interpretation is that with clang the '(req >= 0) ?' condition is
> not evaluated by the preprocessor, but only by the compiler. This seems to
> be different with gcc.
>
> > Catering to specific whims of specific compilers feels somehow wrong, as what
> > will happen if some imaginary third compiler requires another different hack
> > to be satisfied?
>
> I'll check with the clang developers if clang can be changed to behave
> like gcc in this aspect.
FYI:
"We currently don't construct control-flow graphs (CFGs) when
processing initializer expressions in a global context. CFGs have
been used for doing a variety of flow-based warnings in functions, but
at this point they haven't been used for global initializer
expressions."
https://bugs.llvm.org//show_bug.cgi?id=10030
m.
WARNING: multiple messages have this Message-ID (diff)
From: mka@chromium.org (Matthias Kaehlcke)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v1] soc: rockchip: power-domain: Fix clang warning about negative shift count
Date: Mon, 13 Mar 2017 11:49:01 -0700 [thread overview]
Message-ID: <20170313184901.GB50582@google.com> (raw)
In-Reply-To: <20170313172222.GA50582@google.com>
El Mon, Mar 13, 2017 at 10:22:22AM -0700 Matthias Kaehlcke ha dit:
> El Sat, Mar 11, 2017 at 01:03:48PM +0100 Heiko Stuebner ha dit:
>
> > Hi Matthias,
> >
> > Am Freitag, 10. M?rz 2017, 18:21:53 CET schrieb Matthias Kaehlcke:
> > > The following warning is generated when building with clang:
> > >
> > > drivers/soc/rockchip/pm_domains.c:726:22: error: shift count is negative
> > > [-Werror,-Wshift-count-negative] [RK3399_PD_TCPD0] = DOMAIN_RK3399(8,
> > > 8, -1, false),
> > > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > > drivers/soc/rockchip/pm_domains.c:101:2: note: expanded from macro
> > > 'DOMAIN_RK3399' DOMAIN(pwr, status, req, req, req, wakeup)
> > > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > > drivers/soc/rockchip/pm_domains.c:88:27: note: expanded from macro 'DOMAIN'
> > > .req_mask = (req >= 0) ? BIT(req) : 0, \
> > > ^~~~~~~~
> > > include/linux/bitops.h:6:24: note: expanded from macro 'BIT'
> > >
> > > The BIT macro is evaluated with the negative value -1, even though the
> > > resulting value would not be assigned. To fix this we only pass values
> > > between 0 and 63 to BIT(). Unfortunately this means that we lose the
> > > benefit of the compiler checking for out of bounds errors.
> >
> > I tend to disagree here. This looks more like a case of "fix your compiler".
> >
> > That conditional seems perfectly valid as the BIT(req) will never be reached
> > if req < 0 - your clang simply doesn't recognize the pattern somehow, while
> > for example gcc does.
>
> My interpretation is that with clang the '(req >= 0) ?' condition is
> not evaluated by the preprocessor, but only by the compiler. This seems to
> be different with gcc.
>
> > Catering to specific whims of specific compilers feels somehow wrong, as what
> > will happen if some imaginary third compiler requires another different hack
> > to be satisfied?
>
> I'll check with the clang developers if clang can be changed to behave
> like gcc in this aspect.
FYI:
"We currently don't construct control-flow graphs (CFGs) when
processing initializer expressions in a global context. CFGs have
been used for doing a variety of flow-based warnings in functions, but
at this point they haven't been used for global initializer
expressions."
https://bugs.llvm.org//show_bug.cgi?id=10030
m.
next prev parent reply other threads:[~2017-03-13 18:49 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-11 2:21 [PATCH v1] soc: rockchip: power-domain: Fix clang warning about negative shift count Matthias Kaehlcke
2017-03-11 2:21 ` Matthias Kaehlcke
2017-03-11 2:21 ` Matthias Kaehlcke
2017-03-11 12:03 ` Heiko Stuebner
2017-03-11 12:03 ` Heiko Stuebner
2017-03-13 17:22 ` Matthias Kaehlcke
2017-03-13 17:22 ` Matthias Kaehlcke
2017-03-13 18:49 ` Matthias Kaehlcke [this message]
2017-03-13 18:49 ` Matthias Kaehlcke
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170313184901.GB50582@google.com \
--to=mka@chromium.org \
--cc=dianders@chromium.org \
--cc=grundler@chromium.org \
--cc=heiko@sntech.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=shawn.lin@rock-chips.com \
--cc=wxt@rock-chips.com \
--cc=zhangqing@rock-chips.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.