I’m using the ORCJit to execute some code generated by MLIR, and I can’t seem to get some symbols defined in my current process to be visible to the JIT. I’m creating the JIT like this:
llvm::orc::JITDylib &mainJD = jit->getMainJITDylib();
mainJD.addGenerator(
cantFail(DynamicLibrarySearchGenerator::GetForCurrentProcess(
dataLayout.getGlobalPrefix())));
but seeing the following output when executing the code through the JIT:
JIT session error: Symbols not found: [ mgpuLaunchKernel, mgpuModuleGetFunction, mgpuModuleLoad, mgpuModuleUnload, mgpuStreamCreate, mgpuStreamDestroy, mgpuStreamSynchronize ]
I’m quite sure that these symbols are in my process. Checking objdump -TC
reports that they are in a library I’m linking with:
objdump -TC build/lib/liblgcore.so | grep mgpu
000000000130d870 g DF .text 0000000000000005 Base mgpuModuleUnload
000000000130da60 g DF .text 0000000000000005 Base mgpuStreamDestroy
000000000130da00 g DF .text 000000000000005b Base mgpuStreamCreate
000000000130d940 g DF .text 00000000000000b2 Base mgpuLaunchKernel
000000000130d7c0 g DF .text 00000000000000ab Base mgpuModuleLoad
000000000130d880 g DF .text 00000000000000b3 Base mgpuModuleGetFunction
000000000130da70 g DF .text 000000000000009a Base mgpuStreamSynchronize
and the following code before the Jit invocation:
std::cout << "found mgpuLaunchKernel at address " << dlsym(RTLD_DEFAULT, "mgpuLaunchKernel") << std::endl;
std::cout << "found mgpuModuleLoad at address " << dlsym(RTLD_DEFAULT, "mgpuModuleLoad") << std::endl;
std::cout << "found mgpuModuleUnload at address " << dlsym(RTLD_DEFAULT, "mgpuModuleUnload") << std::endl;
std::cout << "found mgpuModuleGetFunction at address " << dlsym(RTLD_DEFAULT, "mgpuModuleGetFunction") << std::endl;
std::cout << "found mgpuStreamCreate at address " << dlsym(RTLD_DEFAULT, "mgpuStreamCreate") << std::endl;
std::cout << "found mgpuStreamDestroy at address " << dlsym(RTLD_DEFAULT, "mgpuStreamDestroy") << std::endl;
std::cout << "found mgpuStreamSynchronize at address " << dlsym(RTLD_DEFAULT, "mgpuStreamSynchronize") << std::endl;
outputs:
found mgpuLaunchKernel at address 0x7f0bcd955940
found mgpuModuleLoad at address 0x7f0bcd9557c0
found mgpuModuleUnload at address 0x7f0bcd955870
found mgpuModuleGetFunction at address 0x7f0bcd955880
found mgpuStreamCreate at address 0x7f0bcd955a00
found mgpuStreamDestroy at address 0x7f0bcd955a60
found mgpuStreamSynchronize at address 0x7f0bcd955a70
So i’m not sure where to go. Based on the documentation, the DynamicSearchLibraryGenerator::getForCurrentProcess
uses dlsym
internally.