<div dir="ltr"><div dir="ltr"><div class="gmail_default"><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">Hi all,</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif" style="font-family:Arial,Helvetica,sans-serif">I am new to LLVM and have been working through the Kaleidoscope tutorial. Everything is working fine so far except for local externs (as opposed to things like the math functions, which are working). Note that I have seen this bug with the reference code listing, as well as my own code. link to code: </font><font face="arial, helvetica, sans-serif"><a href="https://llvm.org/docs/tutorial/LangImpl05.html#full-code-listing">https://llvm.org/docs/tutorial/LangImpl05.html#full-code-listing</a></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">[c34n10 kaleidoscope] ./toy</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">ready> extern sin(x); sin(1);</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">ready> Read extern:</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">declare double @sin(double)</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">ready> ready> Evaluated to 0.841471</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">ready> extern putchard(x); putchard(120);</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">ready> Read extern:</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">declare double @putchard(double)</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">ready> ready> Failure value returned from cantFail wrapped call</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">UNREACHABLE executed at ~/project/llvm/include/llvm/Support/Error.h:732!</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">Aborted (core dumped)</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">sin is, of course, defined in libm. putchard is declared in my code, per the tutorial, as</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">/// putchard - putchar that takes a double and returns 0.</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">extern "C" DLLEXPORT double putchard(double X) {</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">  fputc((char)X, stderr);</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">  return 0;</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">}</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">Other posts online suggest that this issue could be caused by not compiling with -rdynamic, but I am.</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">The actual error is occuring with the following code (on the cantFail line)</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">auto ExprSymbol = TheJIT->findSymbol("__anon_expr");</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">assert(ExprSymbol && "Function not found");</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">// cast to double-returning function</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">double (*FP)() = (double (*)())(intptr_t)cantFail(ExprSymbol.getAddress());</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">fprintf(stderr, "Evaluated to %f\n", FP());</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">and some investigation with GDB reveals that the hasError flag of ExprSymbol.getAddress() is true, which is why the cantFail is failing. As to why that flag is set, I'm at a loss. I have run through GDB with both the sin and putchard examples, to try and see where they are diverging. I'm not totally sure, but I think the divergence might be happening on line 347 of RuntimeDyld.cpp:</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="monospace, monospace">if (auto IOrErr = processRelocationRef(SectionID, I, Obj, LocalSections, Stubs))<br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">That is, in the sin example, this expression is false; in the putchard example, it is true. However there may be something earlier on that I missed – there were a few thousand lines of GDB logging to diff through.</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">It appears not to be an issue with the function itself, nor the compilation/link process: from within GDB, I can successfully run call putchard(120), so the symbol is definitely being included in the executable. Just for some reason the JIT can't find it.</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">Finally, my makefile looks like</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="monospace, monospace">LIBS=core orcjit native analysis executionengine instcombine object runtimedyld scalaropts support</font></div><div class="gmail_default"><font face="monospace, monospace">FLAGS=`llvm-config --cxxflags --ldflags --system-libs --libs $(LIBS)`</font></div><div class="gmail_default"><font face="monospace, monospace"><br></font></div><div class="gmail_default"><font face="monospace, monospace">%: %.cpp</font></div><div class="gmail_default"><font face="monospace, monospace">        clang++ -v -g3 -O0 $^ -o $@ $(FLAGS) -rdynamic</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">Please let me know if I can provide any additional code or debug information. I don't know a ton about LLVM so am a bit lost as to where to go from here.</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">(Note: I also have posted this question on the LLVM IRC channel, and on <a href="https://stackoverflow.com/questions/54048268/llvm-kaleidoscope-tutorial-failing-on-local-extern">Stack</a>.)</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">Thank you so much! I'm very excited to start working with LLVM and have just been stuck on this issue for a couple of days.</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">Best,</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif">Eli Baum</font></div><div class="gmail_default" style="font-family:Arial,Helvetica,sans-serif"><font face="arial, helvetica, sans-serif"><a href="mailto:eli.baum@yale.edu">eli.baum@yale.edu</a></font></div><br class="gmail-Apple-interchange-newline"></div></div></div>