<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi Bjoern,<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Even though the "tryToGenerate" function of my DefinitionGenerator returned a "llvm::orc::SymbolsNotFound" for the "?_Plansch_test@@3HA", I got an address for "?</blockquote><div><br></div><div>That's because you're issuing the lookup with RequiredState == SymbolState::Resolved. This means that your query will return as soon as "?Sampler@@YAXXZ" is assigned an address. In the JIT linker(s) addresses are assigned before external references are looked up. So after your lookup returns the linker attempts to find "?_Plansch_test@@3HA", fails, and so moves "?Sampler@@YAXXZ" to the error state.</div><div><br></div><div>You almost always want to issue your lookups with RequiredState == SymbolState::Ready. This ensures that the query will not return until / unless the requested symbols (and all their dependencies) are successfully linked into the target process and ready to execute.</div><div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span lang="EN-GB">Question 1.)<br></span><span lang="EN-GB">Is there any way to reset the error state of "?Sampler@@YAXXZ" at this point?</span></blockquote><p class="MsoNormal"><span lang="EN-GB"><br></span></p><p class="MsoNormal"><span lang="EN-GB">No. However, the removable code feature will allow you to remove failed materialization units once it lands in the mainline.</span></p><p class="MsoNormal"><span lang="EN-GB"><br></span></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span lang="EN-GB">- After my first call I used the "define" function of the JITDylib to define ?_Plansch_test@@3HA and then I tried calling the lookup function again and again, however I only got the error: "Failed to materialize symbols" even though "?_Plansch_test@@3HA" was defined now...<br></span><span lang="EN-GB">- Changing the order of the "define" and the "lookup" call works of course, but I'm interested in the case where I don't know the address yet.</span></blockquote><p class="MsoNormal"><span lang="EN-GB"></span></p><p class="MsoNormal"><span lang="EN-GB"><br></span></p><p class="MsoNormal"><span lang="EN-GB">The JIT doesn't re-try linking. Once a symbol has failed to link it remains in the error state. In theory, once removable code is added you could choose to remove and then re-add "?Sampler@@YAXXZ" after "?_Plansch_test@@3HA" is defined. The real solution though is just to make sure that "?_Plansch_test@@3HA" is defined (either directly or via a generator) before you look up "?Sampler@@YAXXZ".</span></p><p class="MsoNormal"><span lang="EN-GB"><br></span></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span lang="EN-GB">Out of curiosity I repeated the previous scenario - but added "?_Plansch_test@@3HA" to the "lookupSet" which changed things drasticly. When executing "lookup" I now get the "llvm::orc::SymbolsNotFound" error from my DefinitionGenerator...</span></blockquote><p class="MsoNormal"><span lang="EN-GB"><br></span></p><p class="MsoNormal"><span lang="EN-GB">Yes. Because "?_Plansch_test@@3HA" is not defined. You should see a SymbolsNotFound error sent to your error reporter in the first scenario too, followed by a failure-to-materialize error for "?Sampler@@YAXXZ".</span></p><p class="MsoNormal"><span lang="EN-GB"><br></span></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">... and "?Sampler@@YAXXZ" is stuck as a pending query in the MaterializingInfos entries.</blockquote><p class="MsoNormal"><span lang="EN-GB"><br></span></p><p class="MsoNormal"><span lang="EN-GB">Huh. That sounds like a bug: All references to the query should be removed from the state machine before it returns its result (in this case an error). I'll see if I can reproduce this locally and fix it up, but it doesn't affect the discussion here.</span></p><p class="MsoNormal"><span lang="EN-GB"><br></span></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">When I then add a definition for "?_Plansch_test@@3HA" and call "lookup" the second time, it will succeed and give me the addresses. Also I'm able to execute the code now. This is great! However...</blockquote><p class="MsoNormal"><br></p><p class="MsoNormal">When a lookup fails we try to restore the ExecutionSession state to what it was prior to the query. This is why the sequence "lookup -> symbols not found -> define -> lookup again" worked.</p><p class="MsoNormal"><br></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Question 2.)<br>Why did the first call to lookup not return the address of "?Sampler@@YAXXZ" like in the first scenario? I expected it would return an address for it.</blockquote><p class="MsoNormal"><br></p><p class="MsoNormal">A lookup must match against all symbols before anything is JIT'd. When it failed to match "?_Plansch_test@@3HA" we immediately bailed out with an error. There was no further attempt to compile "?Sampler@@YAXXZ".</p><p class="MsoNormal"><br></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Question 3.)<br>Can I somehow combine both behaviours? Getting the address for all the symbols (like in scenario 1) while still being able to provide definitions later (like in scenario 2)?</blockquote><p class="MsoNormal"><br></p><p class="MsoNormal"><i>Sort of.</i></p><p class="MsoNormal"><br></p><p class="MsoNormal">Definition generators allow you to provide a definition at the last minute (i.e. in response to a query). The best mental model though is: "All definitions that a generator can generate are part of the interface of the dylib". E.g. if you use a DynamicLibrarySearchGenerator to mirror symbols from a dynamic library containing "foo", "bar" and "baz" then you should think of your JITDylib as containing definitions for "foo", "bar" and "baz", even if the generator hasn't actually added them to the JITDylib yet. The reason is that it will add them in response to any query for them, so it's indistinguishable (except for timing and debug logging) from the case where they're already present.</p><p class="MsoNormal"><br></p><p class="MsoNormal">If you need to be able to defer adding a "real" definition beyond the initial lookup then your only option (and this only applies to functions) is a lazy-reexport. This allows you to provide a definition for a function while deferring lookup until the first execution of the re-export at runtime. I wouldn't generally use this to break dependencies though: You want a definition of the real function body for "?_Plansch_test@@3HA" already added to your JIT because (in general) you never know when JIT'd code will need it.</p><p class="MsoNormal"><br></p><p class="MsoNormal">My turn to ask a question: How is "?_Plansch_test@@3HA" created, and why not just add it up-front? :)</p><p class="MsoNormal"><br></p><p class="MsoNormal">-- Lang.</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Sep 28, 2020 at 4:57 AM Gaier, Bjoern via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">





<div lang="DE">
<div class="gmail-m_1215308874056268979WordSection1">
<p class="MsoNormal"><span lang="EN-GB">Hey everyone,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">I felt this question is different from my other question - hope this is okay.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">So - I was playing around with the lookup function of the ExecutionSession and there are some things I don't understand.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">I have a .BC file with a function "?Sampler@@YAXXZ" referencing a value "?_Plansch_test@@3HA" that is not defined in that module itself. I first planed on not providing an address for "?_Plansch_test@@3HA" but wanted
 to know the address of "?Sampler@@YAXXZ". So I issued something like that:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">                auto &ES = this->jit->getExecutionSession();<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">                SymbolLookupSet lookupSet;<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">                <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">                lookupSet.add("?Sampler@@YAXXZ", llvm::orc::SymbolLookupFlags::WeaklyReferencedSymbol);<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">                ES.lookup({{&jit->getMainJITDylib(), llvm::orc::JITDylibLookupFlags::MatchAllSymbols}}, lookupSet, llvm::orc::LookupKind::Static, llvm::orc::SymbolState::Resolved);<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">                <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Even though the "tryToGenerate" function of my DefinitionGenerator returned a "llvm::orc::SymbolsNotFound" for the "?_Plansch_test@@3HA", I got an address for "?Sampler@@YAXXZ". Dumping the "MainJITDylib" I saw, that
 the "?Sampler@@YAXXZ" was in an Error state. Which made sense - I guess.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Question 1.)<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Is there any way to reset the error state of "?Sampler@@YAXXZ" at this point?<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">- After my first call I used the "define" function of the JITDylib to define ?_Plansch_test@@3HA and then I tried calling the lookup function again and again, however I only got the error: "Failed to materialize symbols"
 even though "?_Plansch_test@@3HA" was defined now...<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">- Changing the order of the "define" and the "lookup" call works of course, but I'm interested in the case where I don't know the address yet.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Out of curiosity I repeated the previous scenario - but added "?_Plansch_test@@3HA" to the "lookupSet" which changed things drasticly. When executing "lookup" I now get the "llvm::orc::SymbolsNotFound" error from my DefinitionGenerator
 and "?Sampler@@YAXXZ" is stuck as a pending query in the MaterializingInfos entries. When I then add a definition for "?_Plansch_test@@3HA" and call "lookup" the second time, it will succeed and give me the addresses. Also I'm able to execute the code now.
 This is great! However...<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Question 2.)<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Why did the first call to lookup not return the address of "?Sampler@@YAXXZ" like in the first scenario? I expected it would return an address for it.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Question 3.)<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Can I somehow combine both behaviours? Getting the address for all the symbols (like in scenario 1) while still being able to provide definitions later (like in scenario 2)?<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Thank you in advance and kind greetings,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Björn<u></u><u></u></span></p>
</div>
Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Junichi Tajika, Ergin Cansiz.
</div>

_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>