LLVM万花筒教程在本地外部失败

LLVM万花筒教程在本地外部失败,llvm,extern,Llvm,Extern,我正在处理这个问题。除了局部外部(与数学函数之类的东西相反),其他一切都正常工作 putchard根据教程在我的代码中声明为 /// putchard - putchar that takes a double and returns 0. extern "C" DLLEXPORT double putchard(double X) { fputc((char)X, stderr); return 0; } 其他在线帖子表明,这个问题可能是由于没有使用-rdynamic编译造成的,但我

我正在处理这个问题。除了局部外部(与数学函数之类的东西相反),其他一切都正常工作

putchard
根据教程在我的代码中声明为

/// putchard - putchar that takes a double and returns 0.
extern "C" DLLEXPORT double putchard(double X) {
  fputc((char)X, stderr);
  return 0;
}
其他在线帖子表明,这个问题可能是由于没有使用
-rdynamic
编译造成的,但我确实是这样

实际错误发生在以下代码中

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());
对GDB的一些调查显示,
ExprSymbol.getAddress()
hasrerror
标志为true,这就是
cantFail
失败的原因。至于为什么要挂那面旗子,我不知道

这似乎不是函数本身的问题:在GDB中,我可以成功运行
调用putchard(120)
,因此符号肯定存在于可执行文件中

最后,我的makefile看起来像

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

我在LLVM 8中遇到了完全相同的问题

问题是符号解析程序没有尝试在本地进程的地址中查找请求的符号,而
预期的
需要强制检查错误

为了克服它,我对万花筒进行了一点改动

将万花筒的构造函数替换为以下构造函数:

KaleidoscopeJIT()
      : Resolver(createLegacyLookupResolver(
            ES,
            [this](const std::string &Name) {
              auto symbol = ObjectLayer.findSymbol(Name, true);
              if (!symbol)
              {
                if (auto SymAddr = RTDyldMemoryManager::getSymbolAddressInProcess(Name))
                  return JITSymbol(SymAddr, JITSymbolFlags::Exported);
              }
              return symbol;
            },
            [](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); })),
        TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()),
        ObjectLayer(ES,
                    [this](VModuleKey) {
                      return ObjLayerT::Resources{
                          std::make_shared<SectionMemoryManager>(), Resolver};
                    }),
        CompileLayer(ObjectLayer, SimpleCompiler(*TM)) {
    llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
  }
KaleidoscopeJIT()
:解析器(createLegacyLookupResolver(
锿,
[this](const std::string&Name){
自动符号=ObjectLayer.findSymbol(名称,true);
如果(!符号)
{
if(auto-SymAddr=RTDyldMemoryManager::getSymbolAddressInProcess(名称))
返回JITSymbol(SymAddr、JITSymbolFlags::Exported);
}
返回符号;
},
[](错误Err){cantFail(std::move(Err),“lookupFlags failed”);}),
TM(EngineBuilder().selectTarget()),DL(TM->createDataLayout()),
对象层,
[此](VModuleKey){
返回ObjLayerT::Resources{
std::make_shared(),Resolver};
}),
编译器层(ObjectLayer,SimpleCompiler(*TM)){
llvm::sys::DynamicLibrary::loadlibrary永久(nullptr);
}

唯一的变化是,如果调用
ObjectLayer.findSymbol()
后没有找到任何符号,它将转到
RTDyldMemoryManager::getSymbolAddressInProcess()
来查找和创建JITSymbol对象。

嗨,baum,我在使用教程中提到的-Wl,--export-dynamic编译时也会遇到同样的错误。你找到解决办法了吗?在本教程中,它被称为mcjit而不是orcjit,您是如何找到正确的lib的?您好,同行。还没有解决办法。另外,我正在编译verbose(
-v
),并且已经包含了
-export-dynamic
(可能是
-rdynamic
)。至于mcjit/orcjit,我遇到了编译问题,并意识到我使用的是
orc
类,但从未包含这些库。我已经联系了llvm开发人员listserv;如果有人回信,我会在这里更新。谢谢,我也在llvm开发人员列表中看到了关于记录邮件错误消息的更新。我也遇到了同样的错误“找不到符号{printd}”。这似乎是相关的。我还未通过给定的测试用例:@jackie您是否通过SVN安装了LLVM 8?我正在尝试最新的稳定版本(7.0.0)不再用于此项目,因此无法确认结果。无论如何都要接受,希望这对将来的其他人有用。
KaleidoscopeJIT()
      : Resolver(createLegacyLookupResolver(
            ES,
            [this](const std::string &Name) {
              auto symbol = ObjectLayer.findSymbol(Name, true);
              if (!symbol)
              {
                if (auto SymAddr = RTDyldMemoryManager::getSymbolAddressInProcess(Name))
                  return JITSymbol(SymAddr, JITSymbolFlags::Exported);
              }
              return symbol;
            },
            [](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); })),
        TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()),
        ObjectLayer(ES,
                    [this](VModuleKey) {
                      return ObjLayerT::Resources{
                          std::make_shared<SectionMemoryManager>(), Resolver};
                    }),
        CompileLayer(ObjectLayer, SimpleCompiler(*TM)) {
    llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
  }