This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] tile: Fix up corner cases with signed relocations
- From: Rich Felker <dalias at libc dot org>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>
- Cc: Chris Metcalf <cmetcalf at tilera dot com>, Andreas Schwab <schwab at linux-m68k dot org>, libc-alpha at sourceware dot org
- Date: Mon, 8 Sep 2014 11:27:07 -0400
- Subject: Re: [PATCH] tile: Fix up corner cases with signed relocations
- Authentication-results: sourceware.org; auth=none
- References: <201409051854 dot s85IsfM0024659 at gx-1 dot internal dot tilera dot com> <8761h1hkog dot fsf at linux-m68k dot org> <540A1F34 dot 2020303 at tilera dot com> <871trphhkr dot fsf at linux-m68k dot org> <540B3349 dot 1000507 at tilera dot com> <Pine dot LNX dot 4 dot 64 dot 1409081518450 dot 6075 at digraph dot polyomino dot org dot uk>
On Mon, Sep 08, 2014 at 03:20:59PM +0000, Joseph S. Myers wrote:
> On Sat, 6 Sep 2014, Chris Metcalf wrote:
>
> > Right, sorry. On tile, the compiler will always generate a "shli" for
> > shifting an unknown value by a known constant, and shli is defined with
> > unsigned semantics on tile, so in practice this code generates the correct
> > value.
>
> In any case, the GNU C language defines signed shifts (as long as the
> shift amount is >= 0 and < width of type), although it may still be useful
> to avoid the cases that are outside what ISO C defines.
I don't think this is true. For example, in many versions of GCC, this
is (rightfully!) an infinite loop:
int i;
for (i=1; i>0; i<<=1);
On the other hand, defining a<<b when a is negative but a*(2**b) does
not overflow makes sense, and it's frustrating that the C standard
doesn't already define this (but see my workaround, i.e. just using
*(1<<b) or similar). But defining a<<b when it would overflow is
inconsistent and unreasonable.
Rich