[LLVMbugs] [Bug 16248] movaps used for unaligned memory involving va_list and nested structs

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Jun 10 17:59:20 PDT 2013


http://llvm.org/bugs/show_bug.cgi?id=16248

Justin Bogner <llvm-bugs at justinbogner.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
         Resolution|FIXED                       |---

--- Comment #3 from Justin Bogner <llvm-bugs at justinbogner.com> ---
While this doesn't segfault anymore, it doesn't seem to do the right thing. The
value that comes out of va_arg is garbage from somewhere nearby on the stack.

Here's the program from before with a main added to demonstrate:

    #include <stdarg.h>
    #include <stdio.h>
    #include <inttypes.h>

    typedef struct Uuid128 {
        __uint128_t __uint;
    } Uuid128_t;

    typedef struct SiteUuid {
      Uuid128_t   su_uuid;
    } SiteUuid_t;

    void
    vloadSiteUuid(void *entryRef, va_list argList)
    {
        SiteUuid_t *su = entryRef;

        su->su_uuid = va_arg(argList, Uuid128_t);
    }

    void
    loadSiteUuid(void *entryRef, ...)
    {
        va_list args;

        va_start(args, entryRef);
        vloadSiteUuid(entryRef, args);
        va_end(args);
    }


    int
    main(int argc, const char *argv[])
    {
        SiteUuid_t Buf;
        Uuid128_t uuid = {
            (__uint128_t)0x0f0e0d0c0b0a0908 << 64 | 0x0706050403020100
        };

        printf("%016" PRIx64 "%016" PRIx64 "\n",
               (uint64_t)(uuid.__uint >> 64),
               (uint64_t)uuid.__uint);
        // prints 0f0e0d0c0b0a09080706050403020100

        loadSiteUuid(&Buf, uuid);

        printf("%016" PRIx64 "%016" PRIx64 "\n",
               (uint64_t)(Buf.su_uuid.__uint >> 64),
               (uint64_t)Buf.su_uuid.__uint);
        // does not print 0f0e0d0c0b0a09080706050403020100
    }

When I disassembled the relevant function in my bigger program, I could see the
correct value in two places on the stack, one of which was aligned, but the
value returned was 0x60 away from there.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20130611/3c19d381/attachment.html>


More information about the llvm-bugs mailing list