<div dir="ltr">To try to find out why it was crashing, I followed the trail of function calls:<div><br></div><div><div>C:\llvm\examples\Kaleidoscope\Orc\initial\toy.cpp</div><div><br></div><div>      auto ExprSymbol = J.findUnmangledSymbol("__anon_expr");</div><div><br></div><div>  JITSymbol findUnmangledSymbol(const std::string Name) {</div><div>    return findSymbol(mangle(Name));</div><div>  }</div><div><br></div><div>  JITSymbol findSymbol(const std::string &Name) {</div><div>    return CompileLayer.findSymbol(Name, true);</div><div>  }</div><div><br></div><div>  CompileLayerT CompileLayer;</div><div>  typedef IRCompileLayer<ObjLayerT> CompileLayerT;</div><div><br></div><div>C:\llvm\include\llvm\ExecutionEngine\Orc\IRCompileLayer.h</div><div><br></div><div>template <typename BaseLayerT> class IRCompileLayer {</div><div><br></div><div>  JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {</div><div>    return BaseLayer.findSymbol(Name, ExportedSymbolsOnly);</div><div>  }</div><div><br></div><div>C:\llvm\examples\Kaleidoscope\Orc\initial\toy.cpp</div><div><br></div><div>  typedef ObjectLinkingLayer<> ObjLayerT;</div><div><br></div><div>C:\llvm\include\llvm\ExecutionEngine\Orc\ObjectLinkingLayer.h</div><div><br></div><div>  JITSymbol findSymbol(StringRef Name, bool ExportedSymbolsOnly) {</div><div>    for (auto I = LinkedObjSetList.begin(), E = LinkedObjSetList.end(); I != E;</div><div>         ++I)</div><div>      if (auto Symbol = findSymbolIn(I, Name, ExportedSymbolsOnly))</div><div>        return Symbol;</div><div><br></div><div>  JITSymbol findSymbolIn(ObjSetHandleT H, StringRef Name,</div><div>                         bool ExportedSymbolsOnly) {</div><div>    if (auto Sym = (*H)->getSymbol(Name)) {</div></div><div><div>C:\llvm\examples\Kaleidoscope\Orc\initial\toy.cpp</div><div><br></div><div>      auto ExprSymbol = J.findUnmangledSymbol("__anon_expr");</div><div><br></div><div>  JITSymbol findUnmangledSymbol(const std::string Name) {</div><div>    return findSymbol(mangle(Name));</div><div>  }</div><div><br></div><div>  JITSymbol findSymbol(const std::string &Name) {</div><div>    return CompileLayer.findSymbol(Name, true);</div><div>  }</div><div><br></div><div>  CompileLayerT CompileLayer;</div><div>  typedef IRCompileLayer<ObjLayerT> CompileLayerT;</div><div><br></div><div>C:\llvm\include\llvm\ExecutionEngine\Orc\IRCompileLayer.h</div><div><br></div><div>template <typename BaseLayerT> class IRCompileLayer {</div><div><br></div><div>  JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {</div><div>    return BaseLayer.findSymbol(Name, ExportedSymbolsOnly);</div><div>  }</div><div><br></div><div>C:\llvm\examples\Kaleidoscope\Orc\initial\toy.cpp</div><div><br></div><div>  typedef ObjectLinkingLayer<> ObjLayerT;</div><div><br></div><div>C:\llvm\include\llvm\ExecutionEngine\Orc\ObjectLinkingLayer.h</div><div><br></div><div>  JITSymbol findSymbol(StringRef Name, bool ExportedSymbolsOnly) {</div><div>    for (auto I = LinkedObjSetList.begin(), E = LinkedObjSetList.end(); I != E;</div><div>         ++I)</div><div>      if (auto Symbol = findSymbolIn(I, Name, ExportedSymbolsOnly))</div><div>        return Symbol;</div><div><br></div><div>  JITSymbol findSymbolIn(ObjSetHandleT H, StringRef Name,</div><div>                         bool ExportedSymbolsOnly) {</div><div>    if (auto Sym = (*H)->getSymbol(Name)) {</div></div><div><div>      if (Sym.isExported() || !ExportedSymbolsOnly) {</div></div><div><br></div><div>and after putting in some debugging code, it turns out this is it - the client wants exported symbols only, but the expression is not exported. This is the easiest change to fix the problem:</div><div><br></div><div><div>  JITSymbol findSymbol(const std::string &Name) {</div><div>    return CompileLayer.findSymbol(Name, false);</div><div>  }</div></div><div><br></div><div> but is it the right one? Or should the symbol be exported instead?</div></div>