<div dir="ltr">On Sun, Aug 18, 2013 at 3:37 PM, Nicholas Chapman <span dir="ltr"><<a href="mailto:admin@indigorenderer.com" target="_blank">admin@indigorenderer.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi All,<br>
I have run into an issue when writing some LLVM code to read from a C++ structure.<br>
The structure as defined in LLVM is { { <4 x float> }, { <4 x float> }, { <16 x float> }, { <4 x float> }, { <4 x float> } }.<br>
On Windows, with Visual Studio 2012, the vector members of the structure are packed tightly together.<br>
However, LLVM seems to be leaving 32 bytes between the second 4 x float vector and the 16 x float vector.  This is maybe because the 16 x float vector<br>
is getting aligned to 64 bytes inside the structure.<br>
The result is that the JIT'd LLVM code is reading from the wrong memory location, resulting in errors.<br>
<br>
Is this known behaviour of LLVM?  Presumably the structure layout is supposed to match that of the platform / Visual Studio?<br>
Why would it leave a 32 byte gap anyway?<br>
<br>
I'm using LLVM 3.2, on Windows 64 bit.<br>
<br><br></blockquote><div><br></div><div>The natural alignment of a 32-byte vector is 32 bytes, so LLVM will add padding as appropriate.<br><br></div><div>It's possible the data layout string for Windows targets is incorrect, though.  Take a look at the data layout string in your IR and X86TargetMachine.cpp (which overrides the string specified in the IR for code generation, IIRC).<br>
<br></div><div>Alternatively, you can use a packed struct and add the padding by hand.<br></div><div><br></div><div>-Eli<br></div></div></div></div>