<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 22 November 2017 at 21:59, Ben Coman <span dir="ltr"><<a href="mailto:btc@openinworld.com" target="_blank">btc@openinworld.com</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"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="gmail-m_-4929630517411459228gmail-">On 22 November 2017 at 13:38, Todd Blanchard <span dir="ltr"><<a href="mailto:tblanchard@mac.com" target="_blank">tblanchard@mac.com</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"> <br><div style="word-wrap:break-word">I've been trying to track this down for a couple weeks now.<div><br></div><div>I have concluded that structs passed by value to functions on the 64 bit VM are not properly populated.  The struct's memory is all zero'd.</div><div><br></div><div>I found this while trying to work with LibClang and found that functions that fetched code locations from code ranges always returned invalid zero'd locations.  After spending some time with lldb I have traced the problem into the native code and found that the argument is not correct.</div><div><br></div><div>I've carved out the wee bit of clang to reproduce this in a tiny library.</div><div><br></div><div>The gist of it is below and the entire file is included.  Basically the struct passed to the function clang_getRangeStart is zero'd memory regardless of the data I send from the image side.</div><div><br></div><div>The build command I used on sierra is <span style="font-family:Menlo;font-size:11px;background-color:rgb(255,255,255)">clang -shared -undefined dynamic_lookup -o microclang.dylib microclang.c</span></div></div></blockquote><div><br></div></span><div>On Ubuntu 16.04 I used...</div><div><div>$ clang -shared -fPIC -o libmicroclang.so microclang.c</div></div><div><div><br></div></div><div>$ clang test.c -L. -l microclang</div><div><div><div>   test.c:6:53: error: no member named 'begin_int_data' in 'CXSourceLocation'</div><div>   if(clang_getRangeStart(clang_<wbr>getArbitraryRange()).begin_int<wbr>_data == 0) </div></div></div><div><br></div><div>I presume you meant...</div><div>    if(clang_getRangeStart(clang<wbr>_getArbitraryRange()).int_data == 0) </div><div>so correcting and continuing...</div><div><br></div><div>$ clang test.c -L. -l microclang</div><div><div>$ LD_LIBRARY_PATH=. ./a.out</div></div><div><div>That failed</div></div><div><br></div><div>So I'm not sure how to proceed.  </div><div>I was expecting that would work while Pharo failed.</div><div><br></div><div>Now interestingly...</div><div><div>$ clang test.c microlang.c</div><div>$ ./a.out</div><div></div></div><div>That worked</div><div><br></div><div><br></div><div>So it seems a similar problem exists outside our FFI. </div><div><br></div><div>cheers -ben</div><div><br></div><div>P.S. I refactored you code to extract a header file (attached)</div></div></div></div></blockquote><div><br></div><div>The issue is still beyond my ken, but I've made some progress towards isolating/understanding the issue.</div><div>Attached zip exploded here for easy reference...</div><div><br></div><div><br></div><div>___microlang.h___</div><div><div>typedef unsigned  uintptr_t;</div><div><br></div><div>typedef struct {</div><div>  const void *ptr_data[2];</div><div>} CXSourceRange_;</div><div><br></div><div>CXSourceRange_ clang_getArbitraryRange_();</div><div>int clang_getRangeEnd_(CXSourceRange_ range);</div></div><div><br></div><div><br></div><div><br></div><div>___microclang.c___</div><div><div>#include "microclang.h"</div><div>const char* libraryString = "library_pointer";</div><div><br></div><div>CXSourceRange_ clang_getArbitraryRange_()</div><div>{       CXSourceRange_ range = {0};</div><div>        range.ptr_data[0] = (void*)libraryString;</div><div>        return range;</div><div>}</div><div><br></div><div>int clang_getRangeEnd_(CXSourceRange_ range)</div><div>{       // Special decoding for CXSourceLocations for CXLoadedDiagnostics.</div><div>        if ((uintptr_t)range.ptr_data[0] & 0x1)</div><div>        {       return 0;       }</div><div>        else</div><div>        {       return 1;       }</div><div>}</div></div><div><br></div><div><br></div><div><br></div><div><br></div><div>___test.c___</div><div><div>#include <stdio.h></div><div>#include "microclang.h"</div><div>const char* localString =  "local_pointer";</div><div><br></div><div>void test( CXSourceRange_ range, char *note )</div><div>{       int result = clang_getRangeEnd_(range);</div><div>        if(result == 0)</div><div>        {       printf("That failed (%s)\n", note); }</div><div>        else</div><div>        {       printf("That worked (%s)\n", note); }</div><div>}</div><div><br></div><div>int main()</div><div>{       CXSourceRange_ range1 = clang_getArbitraryRange_();</div><div>        test(range1, "library string");</div><div><br></div><div>        CXSourceRange_ range2 = {0};</div><div>        range2.ptr_data[0] = (void*)localString;</div><div>        test(range2, "local string");</div><div>}</div><div><br></div></div><div><br></div><div><br></div><div>___Makefile___</div><div><div>default: clean static shared</div><div><br></div><div>clean:</div><div>        rm -f *so *App</div><div>        @echo</div><div><br></div><div>shared:</div><div>        clang -g -o libmicroclang.so -shared -fPIC microclang.c</div><div>        clang -g -o sharedApp test.c -L. -lmicroclang</div><div>        LD_LIBRARY_PATH=. ./sharedApp</div><div>        @echo</div><div><br></div><div>static:</div><div>        clang -g -o staticApp test.c microclang.c</div><div>        ./staticApp</div><div>        @echo</div></div><div><br></div><div><br></div><div><br></div><div>Now running...</div><div>$ make > report</div><div><br></div><div>gives...</div><div>___report___<br></div><div><div>rm -f *so *App</div><div><br></div><div>clang -g -o staticApp test.c microclang.c</div><div>./staticApp</div><div>That worked (library string)</div><div>That worked (local string)</div><div><br></div><div>clang -g -o libmicroclang.so -shared -fPIC microclang.c</div><div>clang -g -o sharedApp test.c -L. -lmicroclang</div><div>LD_LIBRARY_PATH=. ./sharedApp</div><div>That failed (library string)</div><div>That worked (local string)</div><div><br></div></div><div><br></div><div>cheers -ben</div></div></div></div>