[llvm-dev] Kaleidoscope tutorial: extern functions failing

Lang Hames via llvm-dev llvm-dev at lists.llvm.org
Tue Jan 8 12:49:01 PST 2019


Hi Eli,

Could you replace this code:

double (*FP)() = (double (*)())(intptr_t)cantFail(ExprSymbol.getAddress());

with:

double (*FP)() = nullptr;
if (auto ExprAddr = ExprSymbol.getAddress())
  FP = (double(*)())*ExprAddr;
else {
  logAllUnhandledErrors(ExprAddr.takeError(), llvm::errs(), "kaleidoscope
error:");
  exit(1);
}

Then reproduce the error?

That should allow us to log the error that RuntimeDyld is returning from
processRelocationRef. I guess this will be an unimplemented relocation on
Windows. It will be helpful to know which one it is.

Cheers,
Lang.


On Sun, Jan 6, 2019 at 6:45 PM Eli Baum via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Hi all,
>
> 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: https://llvm.org/docs/tutorial/LangImpl05.html#full-code-listing
>
> [c34n10 kaleidoscope] ./toy
> ready> extern sin(x); sin(1);
> ready> Read extern:
> declare double @sin(double)
>
> ready> ready> Evaluated to 0.841471
> ready> extern putchard(x); putchard(120);
> ready> Read extern:
> declare double @putchard(double)
>
> ready> ready> Failure value returned from cantFail wrapped call
> UNREACHABLE executed at ~/project/llvm/include/llvm/Support/Error.h:732!
> Aborted (core dumped)
>
> sin is, of course, defined in libm. putchard is declared in my code, per
> the tutorial, as
>
> /// putchard - putchar that takes a double and returns 0.
> extern "C" DLLEXPORT double putchard(double X) {
>   fputc((char)X, stderr);
>   return 0;
> }
>
> Other posts online suggest that this issue could be caused by not
> compiling with -rdynamic, but I am.
>
> The actual error is occuring with the following code (on the cantFail line)
>
> auto ExprSymbol = TheJIT->findSymbol("__anon_expr");
> assert(ExprSymbol && "Function not found");
>
> // cast to double-returning function
> double (*FP)() = (double (*)())(intptr_t)cantFail(ExprSymbol.getAddress());
> fprintf(stderr, "Evaluated to %f\n", FP());
>
> 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:
>
> if (auto IOrErr = processRelocationRef(SectionID, I, Obj, LocalSections,
> Stubs))
>
> 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.
>
> 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.
>
> Finally, my makefile looks like
>
> LIBS=core orcjit native analysis executionengine instcombine object
> runtimedyld scalaropts support
> FLAGS=`llvm-config --cxxflags --ldflags --system-libs --libs $(LIBS)`
>
> %: %.cpp
>         clang++ -v -g3 -O0 $^ -o $@ $(FLAGS) -rdynamic
>
> 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.
>
> (Note: I also have posted this question on the LLVM IRC channel, and on
> Stack
> <https://stackoverflow.com/questions/54048268/llvm-kaleidoscope-tutorial-failing-on-local-extern>
> .)
>
> 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.
>
> Best,
> Eli Baum
> eli.baum at yale.edu
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190108/e9a9325c/attachment.html>


More information about the llvm-dev mailing list