[llvm-dev] Trouble with ORCv2 Tutorial
Zeke Medley via llvm-dev
llvm-dev at lists.llvm.org
Thu Aug 8 23:19:16 PDT 2019
HI Lang,
Thanks a bunch for the reply. That worked great for on my end and is a
pretty tiny change.
Really appreciate all the work you've done on this new JIT stuff and
putting together those great tutorials.
Zeke
On Thu, Aug 8, 2019 at 3:07 PM Lang Hames <lhames at gmail.com> wrote:
>
> Hi Zeke,
>
> Thanks for pointing this out.
>
> You're right: the issue is that ORCv2 doesn't support code removal (yet). To work around that we need to rename the anonymous expression each time (e.g. __anon_expr.1, __anon_expr.2, ...). Sounds like we're not doing that at the moment. I'll try to get it fixed up shortly.
>
> Cheers,
> Lang.
>
> On Thu, Aug 8, 2019 at 11:08 AM Zeke Medley via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>>
>> Hi Praveen,
>>
>> Thanks for pointing that out :) That's my mistake.
>>
>> I might have been misidentifying the issue with the assert statement.
>> With those fixes made function calls seem to all call the first
>> function called in the REPL. For example:
>>
>> ready> def fib(n) if (n < 2) then n else fib(n - 1) + fib(n - 2);
>> ...
>> ready> fib(40);
>> Evaluated to 102334155.000000
>> ready> fib(10); # This should not have the same result as the earlier call.
>> Evaluated to 102334155.000000
>>
>> Both of those calls evaluate fib(40) despite the second one being a
>> call to fib(10). The same goes for further calls to functions. If I
>> subsequently define another function in the same repl session and call
>> it, it uses the results of the first function call in that repl
>> session:
>>
>> ready> def bar(x) x + 1;
>> ...
>> ready> bar(1);
>> Evaluated to 102334155.000000
>>
>> I suspect that this has to do with the fact that in ORCv2 we can no
>> longer remove modules meaning that the code in
>> HandleTopLevelExpression can't wrap up by removing the most recent
>> module it added. The tutorial does lookups by creating a function with
>> no arguments names "__anon_expr", calling it, then removing it AFIK
>> and because ORCv2 doesn't allow for the removal part as of yet, my
>> hunch is that the issue is there.
>>
>> Any thoughts from anyone?
>>
>> If this does end up being an issue with how the tutorial looks right
>> now and not me making a mistake I'll happily volunteer to update the
>> tutorials as needed :)
>>
>> Zeke
>>
>> On Wed, Aug 7, 2019 at 8:38 PM Praveen Velliengiri
>> <praveenvelliengiri at gmail.com> wrote:
>> >
>> > Hi Zeke,
>> > Bool conversion of Error returns True for Failure States and False for Success States.
>> >
>> > assert(add_q && "HandleDefinition: Error adding a module."); - You're essentially checking against success state to assert the condition. Plus, Error have many handling APIs dealing with success and failure states, you can use them instead of assert.
>> > That will trigger a runtime error if Error is not handled correctly with the reason.
>> >
>> > Try this:
>> > +assert(!add_q && "Handle Definition : Error Adding a Module");
>> >
>> > Please let me know, if you ran any more problems with ORCV2.
>> >
>> > Cheers!
>> >
>> >
>> > On Thu, 8 Aug 2019 at 05:12, Zeke Medley via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>> >>
>> >> Hi folks,
>> >>
>> >> I'm working on migrating a JIT compiler from the old ORCv1 JIT APIs to
>> >> the newer ORCv2 ones and am having some trouble getting the code from
>> >> chapter 1 of the "Building a JIT" [1] tutorial working properly. I
>> >> have previously walked through the "My First Langauge" [2] tutorial
>> >> and that went smoothly using the provided JIT class, but using the one
>> >> from the JIT tutorial is giving me trouble.
>> >>
>> >> Kaleidoscope builds fine using Clang and LLVM version 9, but fails on
>> >> an expression like this:
>> >>
>> >> ready> fun foo(c) c;
>> >> Read function definition:
>> >> define double @foo(double %c) {
>> >> entry:
>> >> ret double %c
>> >> }
>> >>
>> >> kaleidoscope: kaleidoscope_baseline.cpp:980: void HandleDefinition():
>> >> Assertion `add_q && "HandleDefinition: Error adding a module."'
>> >> failed.
>> >> Aborted
>> >>
>> >> I'm using the exact source code from the tutorials to reproduce the
>> >> problem with some tiny changes to the front end to deal with some
>> >> slight API changes introduced in the JIT tutorial where some functions
>> >> return Expected. For example, the specific place that this is failing:
>> >>
>> >> FnIR->print(errs());
>> >> fprintf(stderr, "\n");
>> >> - TheJIT->addModule(std::move(TheModule));
>> >> + auto add_q = TheJIT->addModule(std::move(TheModule));
>> >> + assert(add_q && "HandleDefinition: Error adding a module.");
>> >> InitializeModuleAndPassManager();
>> >>
>> >>
>> >> I've looked at a previous thread discussing moving from ORCv1 to ORCv2
>> >> [3] and watched the "Updating ORC JIT for Concurrencyā€¯ talk by L.
>> >> Hames & B. Loggins, but am still having a little trouble getting my
>> >> head around everything without walking through a complete tutorial.
>> >> I'd appreciate any guidance that you folks have on the migration as
>> >> well as some help with this specific issue. I'm happy to share more
>> >> about the source code and build settings if that is helpful.
>> >>
>> >> Thanks in advance,
>> >>
>> >> Zeke
>> >>
>> >> [1] https://llvm.org/docs/tutorial/BuildingAJIT1.html
>> >> [2] https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/index.html
>> >> [3] https://groups.google.com/forum/#!searchin/llvm-dev/orcv2%7Csort:date/llvm-dev/UNXf9EOw43g/w3qOKLYbAwAJ
>> >> _______________________________________________
>> >> LLVM Developers mailing list
>> >> llvm-dev at lists.llvm.org
>> >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list