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: libc-alpha at sourceware dot org
- Date: Fri, 5 Sep 2014 21:02:44 -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>
On Fri, Sep 05, 2014 at 11:40:20PM +0200, Andreas Schwab wrote:
> Chris Metcalf <cmetcalf@tilera.com> writes:
>
> > On 9/5/2014 4:33 PM, Andreas Schwab wrote:
> >> Chris Metcalf <cmetcalf@tilera.com> writes:
> >>
> >>> @@ -686,13 +686,17 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
> >>> tile_bundle_bits *p = (tile_bundle_bits *) reloc_addr;
> >>> tile_bundle_bits bits = *p;
> >>> -#define MUNGE(func) do {
> >>> \
> >>> +#define MUNGE_SIGNED(func, length) do { \
> >>> bits = ((bits & ~create_##func (-1)) | create_##func (value)); \
> >>> - if (get_##func (bits) != value) \
> >>> + ElfW(Addr) result = (long) get_##func (bits) \
> >>> + << (__WORDSIZE - length) >> (__WORDSIZE - length); \
> >> Left shifting a negative value has undefined value.
> >
> > The shift is always a non-negative value less than __WORDSIZE
> > here, by intention. Are you seeing something I'm missing?
>
> I'm talking about the value, not the shift amount.
In general, this issue should always be solvable, in cases where
overflow won't happen, by replacing a<<b with a*(1<<b).
Rich