<div dir="ltr">My code was hinky, but only in the sense that I was accidentally duplicating the definition variable in the module where the function was. With only the declaration in the second module loading the bitcode reproduces the issue.<br><br>Managed an lli reproduction:<br><br><div><div><font face="monospace, monospace">$ cat jit-0.ll<br></font></div><div><font face="monospace, monospace">target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"</font></div><div><font face="monospace, monospace">target triple = "i686-pc-windows-msvc"</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">@foo = global { i8*, i32 } undef</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">$ cat jit-1-clobber.ll<br></font></div><div><font face="monospace, monospace">target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"</font></div><div><font face="monospace, monospace">target triple = "i686-pc-windows-msvc"</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">@foo = external global { i8*, i32 }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">define void @setfoo() {</font></div><div><font face="monospace, monospace">entry:</font></div><div><font face="monospace, monospace">  %p = inttoptr i32 42 to i8*</font></div><div><font face="monospace, monospace">  store i8* %p, i8** getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 0), align 4</font></div><div><font face="monospace, monospace">  store i32 13, i32* getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 1), align 4</font></div><div><font face="monospace, monospace">  ret void</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">$ cat jit-1-noclobber.ll<br></font></div><div><font face="monospace, monospace">target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"</font></div><div><font face="monospace, monospace">target triple = "i686-pc-windows-msvc"</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">@foo = external global { i8*, i32 }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">define void @setfoo() {</font></div><div><font face="monospace, monospace">entry:</font></div><div><font face="monospace, monospace">  %p = inttoptr i32 42 to i8*</font></div><div><font face="monospace, monospace">  store i8* %p, i8** getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 0), align 4</font></div><div><font face="monospace, monospace">  ret void</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">$ lli -jit-kind=orc-mcjit -extra-module=jit-0.ll -extra-module=jit-1-clobber.ll main.ll; echo $?<br></font></div><div><font face="monospace, monospace">13</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">$ lli -jit-kind=orc-mcjit -extra-module=jit-0.ll -extra-module=jit-1-noclobber.ll main.ll; echo $?<br></font></div><div><font face="monospace, monospace">42</font></div></div><div><br></div><div>(Same happens with -jit-kind=mcjit.)</div><div><br></div><div>Cheers,</div><div><br></div><div> -- nikodemus</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 7, 2017 at 12:41 AM, Nikodemus Siivola <span dir="ltr"><<a href="mailto:nikodemus@random-state.net" target="_blank">nikodemus@random-state.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I just managed a quick experiment today to dump and load the definition of the variable and the function that sets it into separate modules.<div><br>...loading those bitcode files into separate modules (and handing those modules to JIT) works as expected. What *should* be same code going directly into JIT does not work.<br></div><div><br></div><div>Which smells like the problem may be in my JIT hookup and not in RuntimeDyld.<br><br>I'll try to sort out my codepaths before digging into RuntimeDyld, so I can be sure I'm doing same things in "live" JIT and when dumping/loading bitcode.<br><br>I'll let you know what turns up.</div><div><br>Cheers,</div><div><br></div><div> -- nikodemus</div><div><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 7, 2017 at 12:16 AM, Sean Silva <span dir="ltr"><<a href="mailto:chisophugis@gmail.com" target="_blank">chisophugis@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>That's useful to know that the static compilation code path works. Furthermore, as expected from that:</div><span><br><div><div style="font-size:12.8px"><font face="monospace, monospace" size="1">      52:       c7 05 04 00 00 00 d5 00 00 00   movl    $213, 4</font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1">                        00000054:  IMAGE_REL_I386_DIR32 _foo</font></div></div><div><br></div></span><div>It looks like the offset `4` of the second field of your struct is correct in the object file, so this does seem to be a problem in the JIT-specific linking/loading.</div><div><br></div><div>Can you try debugging into lib/ExecutionEngine/Runti<wbr>meDyld/Targets/RuntimeDyldCOFF<wbr>I386.h to see if the relocation is getting applied correctly in the context of your JIT?</div><div><br></div><div>You may be able to repro this more easily using `lli`. It has a `-jit-kind` argument that should get you into the JIT codepath. (see test/ExecutionEngine/{MCJIT,OR<wbr>CMCJIT}/)</div><span class="m_729846335902084833HOEnZb"><font color="#888888"><div><br></div><div>-- Sean Silva</div><div><br></div></font></span></div><div class="m_729846335902084833HOEnZb"><div class="m_729846335902084833h5"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 6, 2017 at 1:09 AM, Nikodemus Siivola <span dir="ltr"><<a href="mailto:nikodemus@random-state.net" target="_blank">nikodemus@random-state.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><font face="arial, helvetica, sans-serif">This is on Windows 10: didn't yet manage to get a 64-bit toolchain set up that agreed on everything necessary.</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Dumped bitcode, but when I did that everything landed in the same module (normally the global is defined in a different module then its uses) --> the relocations are different... </font><span style="font-family:arial,helvetica,sans-serif">different enough that when I loaded the bitcode back in and handed the single module to JIT it worked fine.</span></div><div><span style="font-family:arial,helvetica,sans-serif"><br></span></div><div><font face="arial, helvetica, sans-serif">I'll try to dump a case where the definition is in a different module tomorrow. </font></div><div><font face="arial, helvetica, sans-serif"><br></font>Anyhow, below is what clang-cl turned the bitcode from my IR into -- probably not very useful though as this code does what it should...<font face="arial, helvetica, sans-serif"><br></font></div><div><br></div><div><div><font face="monospace, monospace" size="1">$ llvm-objdump.exe -r -d test.o</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">test.o: file format COFF-i386</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">Disassembly of section .text:</font></div><div><font face="monospace, monospace" size="1">.text:</font></div><div><font face="monospace, monospace" size="1">       0:       00 00   addb    %al, (%eax)</font></div><div><font face="monospace, monospace" size="1">                        00000000:  IMAGE_REL_I386_DIR32 _XEP:setfoo</font></div><div><font face="monospace, monospace" size="1">       2:       00 00   addb    %al, (%eax)</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">_setfoo:</font></div><div><font face="monospace, monospace" size="1">       4:       56      pushl   %esi</font></div><div><font face="monospace, monospace" size="1">       5:       83 ec 40        subl    $64, %esp</font></div><div><font face="monospace, monospace" size="1">       8:       89 e0   movl    %esp, %eax</font></div><div><font face="monospace, monospace" size="1">       a:       c7 00 00 00 00 00       movl    $0, (%eax)</font></div><div><font face="monospace, monospace" size="1">                        0000000c:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">      10:       e8 00 00 00 00  calll   0 <_setfoo+0x11></font></div><div><font face="monospace, monospace" size="1">                        00000011:  IMAGE_REL_I386_REL32 _debugPointer</font></div><div><font face="monospace, monospace" size="1">      15:       89 e1   movl    %esp, %ecx</font></div><div><font face="monospace, monospace" size="1">      17:       c7 01 00 00 00 00       movl    $0, (%ecx)</font></div><div><font face="monospace, monospace" size="1">                        00000019:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">      1d:       89 44 24 3c     movl    %eax, 60(%esp)</font></div><div><font face="monospace, monospace" size="1">      21:       89 54 24 38     movl    %edx, 56(%esp)</font></div><div><font face="monospace, monospace" size="1">      25:       e8 00 00 00 00  calll   0 <_setfoo+0x26></font></div><div><font face="monospace, monospace" size="1">                        00000026:  IMAGE_REL_I386_REL32 _debugInt</font></div><div><font face="monospace, monospace" size="1">      2a:       c7 05 00 00 00 00 00 00 00 00   movl    $0, 0</font></div><div><font face="monospace, monospace" size="1">                        0000002c:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">                        00000030:  IMAGE_REL_I386_DIR32 _JazzFixnumClass</font></div><div><font face="monospace, monospace" size="1">      34:       b9 00 00 00 00  movl    $0, %ecx</font></div><div><font face="monospace, monospace" size="1">                        00000035:  IMAGE_REL_I386_DIR32 _JazzFixnumClass</font></div><div><font face="monospace, monospace" size="1">      39:       89 e6   movl    %esp, %esi</font></div><div><font face="monospace, monospace" size="1">      3b:       c7 06 04 00 00 00       movl    $4, (%esi)</font></div><div><font face="monospace, monospace" size="1">                        0000003d:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">      41:       89 44 24 34     movl    %eax, 52(%esp)</font></div><div><font face="monospace, monospace" size="1">      45:       89 54 24 30     movl    %edx, 48(%esp)</font></div><div><font face="monospace, monospace" size="1">      49:       89 4c 24 2c     movl    %ecx, 44(%esp)</font></div><div><font face="monospace, monospace" size="1">      4d:       e8 00 00 00 00  calll   0 <_setfoo+0x4E></font></div><div><font face="monospace, monospace" size="1">                        0000004e:  IMAGE_REL_I386_REL32 _debugInt</font></div><div><font face="monospace, monospace" size="1">      52:       c7 05 04 00 00 00 d5 00 00 00   movl    $213, 4</font></div><div><font face="monospace, monospace" size="1">                        00000054:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">      5c:       89 e1   movl    %esp, %ecx</font></div><div><font face="monospace, monospace" size="1">      5e:       c7 01 00 00 00 00       movl    $0, (%ecx)</font></div><div><font face="monospace, monospace" size="1">                        00000060:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">      64:       89 44 24 28     movl    %eax, 40(%esp)</font></div><div><font face="monospace, monospace" size="1">      68:       89 54 24 24     movl    %edx, 36(%esp)</font></div><div><font face="monospace, monospace" size="1">      6c:       e8 00 00 00 00  calll   0 <_setfoo+0x6D></font></div><div><font face="monospace, monospace" size="1">                        0000006d:  IMAGE_REL_I386_REL32 _debugPointer</font></div><div><font face="monospace, monospace" size="1">      71:       c7 05 00 00 00 00 00 00 00 00   movl    $0, 0</font></div><div><font face="monospace, monospace" size="1">                        00000073:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">                        00000077:  IMAGE_REL_I386_DIR32 _JazzFixnumClass</font></div><div><font face="monospace, monospace" size="1">      7b:       c7 05 04 00 00 00 d5 00 00 00   movl    $213, 4</font></div><div><font face="monospace, monospace" size="1">                        0000007d:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">      85:       89 e1   movl    %esp, %ecx</font></div><div><font face="monospace, monospace" size="1">      87:       c7 01 00 00 00 00       movl    $0, (%ecx)</font></div><div><font face="monospace, monospace" size="1">                        00000089:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">      8d:       89 44 24 20     movl    %eax, 32(%esp)</font></div><div><font face="monospace, monospace" size="1">      91:       89 54 24 1c     movl    %edx, 28(%esp)</font></div><div><font face="monospace, monospace" size="1">      95:       e8 00 00 00 00  calll   0 <_setfoo+0x96></font></div><div><font face="monospace, monospace" size="1">                        00000096:  IMAGE_REL_I386_REL32 _debugPointer</font></div><div><font face="monospace, monospace" size="1">      9a:       89 e1   movl    %esp, %ecx</font></div><div><font face="monospace, monospace" size="1">      9c:       c7 41 08 d5 00 00 00    movl    $213, 8(%ecx)</font></div><div><font face="monospace, monospace" size="1">      a3:       c7 41 04 00 00 00 00    movl    $0, 4(%ecx)</font></div><div><font face="monospace, monospace" size="1">                        000000a6:  IMAGE_REL_I386_DIR32 _JazzFixnumClass</font></div><div><font face="monospace, monospace" size="1">      aa:       c7 01 00 00 00 00       movl    $0, (%ecx)</font></div><div><font face="monospace, monospace" size="1">                        000000ac:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">      b0:       89 44 24 18     movl    %eax, 24(%esp)</font></div><div><font face="monospace, monospace" size="1">      b4:       89 54 24 14     movl    %edx, 20(%esp)</font></div><div><font face="monospace, monospace" size="1">      b8:       e8 00 00 00 00  calll   0 <_setfoo+0xB9></font></div><div><font face="monospace, monospace" size="1">                        000000b9:  IMAGE_REL_I386_REL32 _setGlobal</font></div><div><font face="monospace, monospace" size="1">      bd:       89 e0   movl    %esp, %eax</font></div><div><font face="monospace, monospace" size="1">      bf:       c7 00 00 00 00 00       movl    $0, (%eax)</font></div><div><font face="monospace, monospace" size="1">                        000000c1:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">      c5:       e8 00 00 00 00  calll   0 <_setfoo+0xC6></font></div><div><font face="monospace, monospace" size="1">                        000000c6:  IMAGE_REL_I386_REL32 _debugPointer</font></div><div><font face="monospace, monospace" size="1">      ca:       b9 d5 00 00 00  movl    $213, %ecx</font></div><div><font face="monospace, monospace" size="1">      cf:       8b 74 24 2c     movl    44(%esp), %esi</font></div><div><font face="monospace, monospace" size="1">      d3:       89 44 24 10     movl    %eax, 16(%esp)</font></div><div><font face="monospace, monospace" size="1">      d7:       89 f0   movl    %esi, %eax</font></div><div><font face="monospace, monospace" size="1">      d9:       89 54 24 0c     movl    %edx, 12(%esp)</font></div><div><font face="monospace, monospace" size="1">      dd:       89 ca   movl    %ecx, %edx</font></div><div><font face="monospace, monospace" size="1">      df:       83 c4 40        addl    $64, %esp</font></div><div><font face="monospace, monospace" size="1">      e2:       5e      popl    %esi</font></div><div><font face="monospace, monospace" size="1">      e3:       c3      retl</font></div><div><font face="monospace, monospace" size="1">      e4:       66 66 66 2e 0f 1f 84 00 00 00 00 00     nopw    %cs:(%eax,%eax)</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">_XEP:setfoo:</font></div><div><font face="monospace, monospace" size="1">      f0:       8b 44 24 04     movl    4(%esp), %eax</font></div><div><font face="monospace, monospace" size="1">      f4:       83 f8 00        cmpl    $0, %eax</font></div><div><font face="monospace, monospace" size="1">      f7:       0f 84 05 00 00 00       je      5 <_XEP:setfoo+0x12></font></div><div><font face="monospace, monospace" size="1">      fd:       e8 00 00 00 00  calll   0 <_XEP:setfoo+0x12></font></div><div><font face="monospace, monospace" size="1">                        000000fe:  IMAGE_REL_I386_REL32 _typeError</font></div><div><font face="monospace, monospace" size="1">     102:       e8 00 00 00 00  calll   0 <_XEP:setfoo+0x17></font></div><div><font face="monospace, monospace" size="1">                        00000103:  IMAGE_REL_I386_REL32 _setfoo</font></div><div><font face="monospace, monospace" size="1">     107:       c3      retl</font></div><div><font face="monospace, monospace" size="1">     108:       0f 1f 84 00 00 00 00 00         nopl    (%eax,%eax)</font></div><div><font face="monospace, monospace" size="1">     110:       00 00   addb    %al, (%eax)</font></div><div><font face="monospace, monospace" size="1">                        00000110:  IMAGE_REL_I386_DIR32 _XEP:getfoo</font></div><div><font face="monospace, monospace" size="1">     112:       00 00   addb    %al, (%eax)</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">_getfoo:</font></div><div><font face="monospace, monospace" size="1">     114:       50      pushl   %eax</font></div><div><font face="monospace, monospace" size="1">     115:       89 e0   movl    %esp, %eax</font></div><div><font face="monospace, monospace" size="1">     117:       c7 00 00 00 00 00       movl    $0, (%eax)</font></div><div><font face="monospace, monospace" size="1">                        00000119:  IMAGE_REL_I386_DIR32 _foo</font></div><div><font face="monospace, monospace" size="1">     11d:       e8 00 00 00 00  calll   0 <_getfoo+0xE></font></div><div><font face="monospace, monospace" size="1">                        0000011e:  IMAGE_REL_I386_REL32 _getGlobal</font></div><div><font face="monospace, monospace" size="1">     122:       59      popl    %ecx</font></div><div><font face="monospace, monospace" size="1">     123:       c3      retl</font></div><div><font face="monospace, monospace" size="1">     124:       66 66 66 2e 0f 1f 84 00 00 00 00 00     nopw    %cs:(%eax,%eax)</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">_XEP:getfoo:</font></div><div><font face="monospace, monospace" size="1">     130:       8b 44 24 04     movl    4(%esp), %eax</font></div><div><font face="monospace, monospace" size="1">     134:       83 f8 00        cmpl    $0, %eax</font></div><div><font face="monospace, monospace" size="1">     137:       0f 84 05 00 00 00       je      5 <_XEP:getfoo+0x12></font></div><div><font face="monospace, monospace" size="1">     13d:       e8 00 00 00 00  calll   0 <_XEP:getfoo+0x12></font></div><div><font face="monospace, monospace" size="1">                        0000013e:  IMAGE_REL_I386_REL32 _typeError</font></div><div><font face="monospace, monospace" size="1">     142:       e8 00 00 00 00  calll   0 <_XEP:getfoo+0x17></font></div><div><font face="monospace, monospace" size="1">                        00000143:  IMAGE_REL_I386_REL32 _getfoo</font></div><div><font face="monospace, monospace" size="1">     147:       c3      retl</font></div></div><div><div class="m_729846335902084833m_-2946599472301117198h5"><div><br></div><div class="gmail_extra"><font size="1" face="arial, helvetica, sans-serif"><br></font><div class="gmail_quote"><font size="1" face="arial, helvetica, sans-serif">On Tue, Jun 6, 2017 at 3:18 AM, Sean Silva <span dir="ltr"><<a href="mailto:chisophugis@gmail.com" target="_blank">chisophugis@gmail.com</a>></span> wrote:<br></font><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><font size="1" face="arial, helvetica, sans-serif"><br></font><div class="gmail_extra"><font size="1" face="arial, helvetica, sans-serif"><br></font><div class="gmail_quote"><span class="m_729846335902084833m_-2946599472301117198m_-423278034153121897gmail-"><font size="1" face="arial, helvetica, sans-serif">On Mon, Jun 5, 2017 at 1:34 PM, Nikodemus Siivola <span dir="ltr"><<a href="mailto:nikodemus@random-state.net" target="_blank">nikodemus@random-state.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Uh. Turns out that if I hide the pointer to @foo from LLVM by passing it through an opaque identity function ... then everything works fine.<br><br>Is this a bug in LLVM or is there some magic involving globals I'm misunderstanding?</div></div></blockquote><div><br></div></font></span><div><font size="1" face="arial, helvetica, sans-serif">This looks like a bug in the handling of constant GEP's. Specifically the `getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 1)` used to calculate the address of the integer inside the struct. Your observation "The bizarre thing is that even this looks correct: the debugInt is called first with @foo, then @foo+4, and the stores seem to be going to the right addresses as well: @foo and @foo+4!" at the level of the MachineInstr dump rules out problems before that.</font></div><div><font size="1" face="arial, helvetica, sans-serif"><br></font></div><div><font size="1" face="arial, helvetica, sans-serif">After MachineInstr comes MC to emit the object file, but `foo+4` is one of the most basic relocation types, so I doubt that there's a bug in the lowering there or else "everything" would be broken.</font></div><div><div><font size="1" face="arial, helvetica, sans-serif">Just to verify though, checking assembly of a small example across 32-bit targets of all 3 object file formats looks fine at a glance (MC is getting the +4 addend, though you would need to run `llvm-objdump -d -r` to see the actual relocation in the binary) .</font></div><div><a href="https://godbolt.org/g/0Owzf5" target="_blank"><font size="1" face="arial, helvetica, sans-serif">https://godbolt.org/g/0Owzf5</font></a></div><div><a href="https://godbolt.org/g/n0qzmg" target="_blank"><font size="1" face="arial, helvetica, sans-serif">https://godbolt.org/g/n0qzmg</font></a></div><div><a href="https://godbolt.org/g/kAOvkQ" target="_blank"><font size="1" face="arial, helvetica, sans-serif">https://godbolt.org/g/kAOvkQ</font></a></div></div><div><font size="1" face="arial, helvetica, sans-serif"><br></font></div><div><font size="1" face="arial, helvetica, sans-serif">Beyond MC, you already have your static object file. If that is fine, then in a JIT context you might be running into issues with RuntimeDyld. The actual GEP's that clang generates are identical to the ones in your code, further suggesting that this is JIT specific and that static links are unaffected (if you could verify that, it would help to narrow down the possibilities).</font></div><div><font size="1" face="arial, helvetica, sans-serif">Maybe look at the output of `llvm-objdump -d -r` on a static .o file generated from your IR and see where the relocation is handled in lib/ExecutionEngine/Runtime<wbr>Dyld (this will depend on your platform; grepping for the name of the relocation shown by llvm-objdump should find the right code to look at).</font></div><div><font size="1" face="arial, helvetica, sans-serif"><br></font></div><div><font size="1" face="arial, helvetica, sans-serif">By the way, what platform are you JIT'ing on? I noticed that it is a 32-bit target, and I suspect that the 32-bit support in the JIT infrastructure isn't as well tested / commonly used as the 64-bit code, possibly explaining why this sort of bug could sneak through.</font></div><span class="m_729846335902084833m_-2946599472301117198m_-423278034153121897gmail-HOEnZb"><font color="#888888" size="1" face="arial, helvetica, sans-serif"><div><br></div><div>-- Sean Silva</div></font></span><div><div class="m_729846335902084833m_-2946599472301117198m_-423278034153121897gmail-h5"><div><font face="monospace, monospace" size="1"> </font></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><span class="m_729846335902084833m_-2946599472301117198m_-423278034153121897gmail-m_7410293521095926778gmail-"><font face="monospace, monospace" size="1"><br><div>define { i8*, i32 } @"__anonToplevel/0"() prefix { i8*, i32 } (i32)* @"XEP:__anonToplevel/0" {</div><div>entry:</div></font></span><div><font face="monospace, monospace" size="1">  %0 = call { i8*, i32 }* @identity({ i8*, i32 }* nonnull @foo)</font></div><div><font face="monospace, monospace" size="1">  %1 = call { i8*, i32 } @debugPointer({ i8*, i32 }* %0)</font></div><div><font face="monospace, monospace" size="1">  %2 = getelementptr { i8*, i32 }, { i8*, i32 }* %0, i32 0, i32 0</font></div><div><font face="monospace, monospace" size="1">  %3 = ptrtoint { i8*, i32 }* %0 to i32</font></div><div><font face="monospace, monospace" size="1">  %4 = call { i8*, i32 } @debugInt(i32 %3)</font></div><div><font face="monospace, monospace" size="1">  store i8* @FixnumClass, i8** %2, align 4</font></div><div><font face="monospace, monospace" size="1">  %5 = getelementptr { i8*, i32 }, { i8*, i32 }* %0, i32 0, i32 1</font></div><div><font face="monospace, monospace" size="1">  %6 = ptrtoint i32* %5 to i32</font></div><div><font face="monospace, monospace" size="1">  %7 = call { i8*, i32 } @debugInt(i32 %6)</font></div><div><font face="monospace, monospace" size="1">  store i32 123, i32* %5, align 4</font></div><div><font face="monospace, monospace" size="1">  %8 = call { i8*, i32 } @debugPointer({ i8*, i32 }* %0)</font></div><div><font face="monospace, monospace" size="1">  store i8* @FixnumClass, i8** %2, align 4</font></div><div><font face="monospace, monospace" size="1">  store i32 123, i32* %5, align 4</font></div><div><font face="monospace, monospace" size="1">  %9 = call { i8*, i32 } @debugPointer({ i8*, i32 }* %0)</font></div><div><font face="monospace, monospace" size="1">  call void @setGlobal({ i8*, i32 }* %0, { i8*, i32 } { i8* @FixnumClass, i32 123 })</font></div><div><font face="monospace, monospace" size="1">  %10 = call { i8*, i32 } @debugPointer({ i8*, i32 }* %0)</font></div><span class="m_729846335902084833m_-2946599472301117198m_-423278034153121897gmail-m_7410293521095926778gmail-"><font face="monospace, monospace" size="1"><div>  ret { i8*, i32 } { i8* @FixnumClass, i32 123 }</div><div>}</div><div><br></div></font></span><div><font face="monospace, monospace" size="1">Output, now with correct addresses out of the GEPs, and memory being modified as expected:</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font size="1" face="monospace, monospace">p = 02F80000</font></div><div><font size="1" face="monospace, monospace">  class: 00000000</font></div><div><font size="1" face="monospace, monospace">  datum: 00000000</font></div><div><font size="1" face="monospace, monospace">x = 02F80000</font></div><div><font size="1" face="monospace, monospace">x = 02F80004</font></div><div><font size="1" face="monospace, monospace">p = 02F80000</font></div><div><font size="1" face="monospace, monospace">  class: 028D3E98</font></div><div><font size="1" face="monospace, monospace">  datum: 0000007B</font></div><div><font size="1" face="monospace, monospace">p = 02F80000</font></div><div><font size="1" face="monospace, monospace">  class: 028D3E98</font></div><div><font size="1" face="monospace, monospace">  datum: 0000007B</font></div><div><font size="1" face="monospace, monospace">p = 02F80000</font></div><div><font size="1" face="monospace, monospace">  class: 028D3E98</font></div><div><font size="1" face="monospace, monospace">  datum: 0000007B</font></div></div><div><font face="monospace, monospace" size="1"><br>Cheers,</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1"> -- nikodemus</font></div><div><font face="monospace, monospace" size="1"><br></font></div></div><div class="m_729846335902084833m_-2946599472301117198m_-423278034153121897gmail-m_7410293521095926778gmail-HOEnZb"><div class="m_729846335902084833m_-2946599472301117198m_-423278034153121897gmail-m_7410293521095926778gmail-h5"><div class="gmail_extra"><font face="monospace, monospace" size="1"><br></font><div class="gmail_quote"><font face="monospace, monospace" size="1">On Mon, Jun 5, 2017 at 10:57 PM, Nikodemus Siivola <span dir="ltr"><<a href="mailto:nikodemus@random-state.net" target="_blank">nikodemus@random-state.net</a>></span> wrote:<br></font><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><font face="monospace, monospace" size="1">Since the getelementptrs were implicitly generated by the CreateStore/Load I'm not sure how to get access to them.<br><br>So I hacked the assignment to be done thrice: once using a manual decomposition into two GEPs and stores, once using the "big" CreateStore, once via the setGlobal function, printing addresses and memory contents at each point to the degree that I have access to them.</font></div><div><font face="monospace, monospace" size="1"><br>It seems the following GEPs compute the same address?! I can buy myself not understanding how GEP works and doing it wrong, but builder.CreateStore() creates what look like identical GEPs implicitly...<br></font></div><div><font face="monospace, monospace" size="1"><span><br>i8** getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 0), align 4<br></span><span>i32* getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 1), align 4<br><br></span>The details.<br><br>This is the relevant part from my codegen:</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><div><div><font face="monospace, monospace" size="1">            auto ty = val->getType();</font></div><div><font face="monospace, monospace" size="1">            cout << "val type:" << endl;</font></div><div><font face="monospace, monospace" size="1">            ty->dump();</font></div><div><font face="monospace, monospace" size="1">            cout << "ptr type:" << endl;</font></div><div><font face="monospace, monospace" size="1">            ptr->getType()->dump();</font></div><div><font face="monospace, monospace" size="1">            // Print memory</font></div><div><font face="monospace, monospace" size="1">            ctx.EmitCall1("debugPointer", ptr);</font></div><div><font face="monospace, monospace" size="1">            // Set class pointer</font></div><div><font face="monospace, monospace" size="1">            auto c = ctx.bld.CreateExtractValue(val<wbr>, 0, "class");</font></div><div><font face="monospace, monospace" size="1">            auto cp = ctx.bld.CreateConstGEP2_32(ty, ptr, 0, 0);</font></div><div><font face="monospace, monospace" size="1">            auto cx = ctx.bld.CreatePtrToInt(cp, ctx.Int32Type());</font></div><div><font face="monospace, monospace" size="1">            ctx.EmitCall1("debugInt", cx);</font></div><div><font face="monospace, monospace" size="1">            ctx.bld.CreateStore(c, cp);</font></div><div><font face="monospace, monospace" size="1">            // Set datum</font></div><div><font face="monospace, monospace" size="1">            auto d = ctx.bld.CreateExtractValue(val<wbr>, 1, "datum");</font></div><div><font face="monospace, monospace" size="1">            auto dp = ctx.bld.CreateConstGEP2_32(ty, ptr, 0, 1);</font></div><div><font face="monospace, monospace" size="1">            auto dx = ctx.bld.CreatePtrToInt(dp, ctx.Int32Type());</font></div><div><font face="monospace, monospace" size="1">            ctx.EmitCall1("debugInt", dx);</font></div><div><font face="monospace, monospace" size="1">            ctx.bld.CreateStore(d, dp);</font></div><div><font face="monospace, monospace" size="1">            // Print memory</font></div><div><font face="monospace, monospace" size="1">            ctx.EmitCall1("debugPointer", ptr);</font></div><div><font face="monospace, monospace" size="1">            // Do the same with a single store</font></div><div><font face="monospace, monospace" size="1">            ctx.bld.CreateStore(val, ptr);</font></div><div><font face="monospace, monospace" size="1">            // Print memory</font></div><div><font face="monospace, monospace" size="1">            ctx.EmitCall1("debugPointer", ptr);</font></div><div><font face="monospace, monospace" size="1">            // Call out</font></div><div><font face="monospace, monospace" size="1">            ctx.EmitCall2("setGlobal", ptr, val);</font></div><div><font face="monospace, monospace" size="1">            // Print memory</font></div><div><font face="monospace, monospace" size="1">            ctx.EmitCall1("debugPointer", ptr);</font></div></div></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">Here is the compile-time output showing types of the value and the pointer:<br><br></font><div><div><font face="monospace, monospace" size="1">val type:</font></div><div><font face="monospace, monospace" size="1">{ i8*, i32 }</font></div><div><font face="monospace, monospace" size="1">ptr type:</font></div><div><font face="monospace, monospace" size="1">{ i8*, i32 }*</font></div></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">Here is the IR dump for the function (after a couple of passes), right before it's fed to the JIT:</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">define { i8*, i32 } @"__anonToplevel/0"() prefix { i8*, i32 } (i32)* @"XEP:__anonToplevel/0" {</font></div><div><font face="monospace, monospace" size="1">entry:</font></div><div><font face="monospace, monospace" size="1">  %0 = call { i8*, i32 } @debugPointer({ i8*, i32 }* nonnull @foo)</font></div><div><font face="monospace, monospace" size="1">  %1 = call { i8*, i32 } @debugInt(i32 ptrtoint ({ i8*, i32 }* @foo to i32))</font></div><span><div><font face="monospace, monospace" size="1">  store i8* @FixnumClass, i8** getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 0), align 4</font></div></span><div><font face="monospace, monospace" size="1">  %2 = call { i8*, i32 } @debugInt(i32 ptrtoint (i32* getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 1) to i32))</font></div><span><div><font face="monospace, monospace" size="1">  store i32 123, i32* getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 1), align 4</font></div></span><div><font face="monospace, monospace" size="1">  %3 = call { i8*, i32 } @debugPointer({ i8*, i32 }* nonnull @foo)</font></div><span><div><font face="monospace, monospace" size="1">  store i8* @FixnumClass, i8** getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 0), align 4</font></div><div><font face="monospace, monospace" size="1">  store i32 123, i32* getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 1), align 4</font></div></span><div><font face="monospace, monospace" size="1">  %4 = call { i8*, i32 } @debugPointer({ i8*, i32 }* nonnull @foo)</font></div><span><div><font face="monospace, monospace" size="1">  call void @setGlobal({ i8*, i32 }* nonnull @foo, { i8*, i32 } { i8* @FixnumClass, i32 123 })</font></div></span><div><font face="monospace, monospace" size="1">  %5 = call { i8*, i32 } @debugPointer({ i8*, i32 }* nonnull @foo)</font></div><div><font face="monospace, monospace" size="1">  ret { i8*, i32 } { i8* @FixnumClass, i32 123 }</font></div><div><font face="monospace, monospace" size="1">}</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">​Here is the runtime from calling the JITed function, including memory addresses and contents, with my annotations:<br></font></div></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1"># Before</font></div><div><div><div><font face="monospace, monospace" size="1">p = 03C10000</font></div><div><font face="monospace, monospace" size="1">  class: 00000000</font></div><div><font face="monospace, monospace" size="1">  datum: 00000000</font></div><div><font face="monospace, monospace" size="1"># Should be address of the class slot --> correct</font></div><div><font face="monospace, monospace" size="1">x = 03C10000</font></div><div><font face="monospace, monospace" size="1"># Should be address of the datum slot, ie address of class slot + 4 --> incorrect</font></div><div><font face="monospace, monospace" size="1">x = 03C10000</font></div><div><font face="monospace, monospace" size="1"># Yeah, both values want to class slot, so actual class pointer got clobbered</font></div><div><font face="monospace, monospace" size="1">p = 03C10000</font></div><div><font face="monospace, monospace" size="1">  class: 0000007B</font></div><div><font face="monospace, monospace" size="1">  datum: 00000000</font></div><div><font face="monospace, monospace" size="1"># Same result from the single CreateStore</font></div><div><font face="monospace, monospace" size="1">p = 03C10000</font></div><div><font face="monospace, monospace" size="1">  class: 0000007B</font></div><div><font face="monospace, monospace" size="1">  datum: 00000000</font></div><div><font face="monospace, monospace" size="1"># Calling out to setGlobal as in my first email works</font></div><div><font face="monospace, monospace" size="1">p = 03C10000</font></div><div><font face="monospace, monospace" size="1">  class: 039D2E98</font></div><div><font face="monospace, monospace" size="1">  datum: 0000007B</font></div></div></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">Finally, I didn't manage nice disassembly yet, so here is the last output from --print-after-all for the function. The bizarre thing is that even this looks correct: the debugInt is called first with @foo, then @foo+4, and the stores seem to be going to the right addresses as well: @foo and @foo+4!</font></div><div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">BB#0: derived from LLVM BB %entry</font></div><div><font face="monospace, monospace" size="1">        PUSHi32 <ga:@foo>, %ESP<imp-def>, %ESP<imp-use></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        CALLpcrel32 <ga:@debugPointer>, <regmask %BH %BL %BP %BPL %BX %DI %DIL %EBP %EBX %EDI %ESI %SI %SIL>, %ESP<imp-use>, %ESP<imp-def>, %EAX<imp-def,dead>, %EDX<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        %ESP<def,tied1> = ADD32ri8 %ESP<tied0>, 4, %EFLAGS<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        PUSHi32 <ga:@foo>, %ESP<imp-def>, %ESP<imp-use></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        CALLpcrel32 <ga:@debugInt>, <regmask %BH %BL %BP %BPL %BX %DI %DIL %EBP %EBX %EDI %ESI %SI %SIL>, %ESP<imp-use>, %ESP<imp-def>, %EAX<imp-def,dead>, %EDX<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        %ESP<def,tied1> = ADD32ri8 %ESP<tied0>, 4, %EFLAGS<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        MOV32mi %noreg, 1, %noreg, <ga:@foo>, %noreg, <ga:@JazzFixnumClass>; mem:ST4[getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 0)]</font></div><div><font face="monospace, monospace" size="1">        PUSHi32 <ga:@foo+4>, %ESP<imp-def>, %ESP<imp-use></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        CALLpcrel32 <ga:@debugInt>, <regmask %BH %BL %BP %BPL %BX %DI %DIL %EBP %EBX %EDI %ESI %SI %SIL>, %ESP<imp-use>, %ESP<imp-def>, %EAX<imp-def,dead>, %EDX<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        %ESP<def,tied1> = ADD32ri8 %ESP<tied0>, 4, %EFLAGS<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        MOV32mi %noreg, 1, %noreg, <ga:@foo+4>, %noreg, 123; mem:ST4[getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 1)]</font></div><div><font face="monospace, monospace" size="1">        PUSHi32 <ga:@foo>, %ESP<imp-def>, %ESP<imp-use></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        CALLpcrel32 <ga:@debugPointer>, <regmask %BH %BL %BP %BPL %BX %DI %DIL %EBP %EBX %EDI %ESI %SI %SIL>, %ESP<imp-use>, %ESP<imp-def>, %EAX<imp-def,dead>, %EDX<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        %ESP<def,tied1> = ADD32ri8 %ESP<tied0>, 4, %EFLAGS<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        MOV32mi %noreg, 1, %noreg, <ga:@foo>, %noreg, <ga:@JazzFixnumClass>; mem:ST4[getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 0)]</font></div><div><font face="monospace, monospace" size="1">        MOV32mi %noreg, 1, %noreg, <ga:@foo+4>, %noreg, 123; mem:ST4[getelementptr inbounds ({ i8*, i32 }, { i8*, i32 }* @foo, i32 0, i32 1)]</font></div><div><font face="monospace, monospace" size="1">        PUSHi32 <ga:@foo>, %ESP<imp-def>, %ESP<imp-use></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        CALLpcrel32 <ga:@debugPointer>, <regmask %BH %BL %BP %BPL %BX %DI %DIL %EBP %EBX %EDI %ESI %SI %SIL>, %ESP<imp-use>, %ESP<imp-def>, %EAX<imp-def,dead>, %EDX<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        %ESP<def,tied1> = ADD32ri8 %ESP<tied0>, 4, %EFLAGS<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        PUSH32i8 123, %ESP<imp-def>, %ESP<imp-use></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        PUSHi32 <ga:@JazzFixnumClass>, %ESP<imp-def>, %ESP<imp-use></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        PUSHi32 <ga:@foo>, %ESP<imp-def>, %ESP<imp-use></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        CALLpcrel32 <ga:@setGlobal>, <regmask %BH %BL %BP %BPL %BX %DI %DIL %EBP %EBX %EDI %ESI %SI %SIL>, %ESP<imp-use>, %ESP<imp-def></font></div><div><font face="monospace, monospace" size="1">        %ESP<def,tied1> = ADD32ri8 %ESP<tied0>, 12, %EFLAGS<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        PUSHi32 <ga:@foo>, %ESP<imp-def>, %ESP<imp-use></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        CALLpcrel32 <ga:@debugPointer>, <regmask %BH %BL %BP %BPL %BX %DI %DIL %EBP %EBX %EDI %ESI %SI %SIL>, %ESP<imp-use>, %ESP<imp-def>, %EAX<imp-def,dead>, %EDX<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        %ESP<def,tied1> = ADD32ri8 %ESP<tied0>, 4, %EFLAGS<imp-def,dead></font></div><div><font face="monospace, monospace" size="1">        CFI_INSTRUCTION <call frame instruction></font></div><div><font face="monospace, monospace" size="1">        %EAX<def> = MOV32ri <ga:@JazzFixnumClass></font></div><div><font face="monospace, monospace" size="1">        %EDX<def> = MOV32ri 123</font></div><div><font face="monospace, monospace" size="1">        RETL %EAX<kill>, %EDX<kill></font></div></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">Also, I have essentially identical code working perfectly fine when the memory being written to is from @alloca.<br><br>I am completely clueless. Any suggestions most welcome.</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">Cheers,</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1"> -- nikodemus</font></div><div><font face="monospace, monospace" size="1"><br></font></div></div>
</blockquote></div><font face="monospace, monospace" size="1"><br></font></div>
</div></div></blockquote></div></div></div><font face="monospace, monospace" size="1"><br></font></div></div>
</blockquote></div><br></div></div></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>