This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] tile: Fix up corner cases with signed relocations


On 9/5/2014 5:40 PM, Andreas Schwab wrote:
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.

I'm talking about the value, not the shift amount.

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.

That said, you're right that we're better off to avoid relying on undefined behavior, so, thanks.  I've changed that part of the code to look like:

    ElfW(Addr) result = get_##func (bits); \
    int signbits = __WORDSIZE - length; \
    result = (long) (result << signbits) >> signbits;               \

I'll go ahead and push the commit with that change.

--
Chris Metcalf, Tilera Corp.
http://www.tilera.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]