I recently hit an issue when JIT’ing my generated IR using llvm::orc::LLJIT. My IR contains the following definition of a global variable:
$_ZZ23TestStaticVarInFunctionbE1x = comdat any
@_ZZ23TestStaticVarInFunctionbE1x = linkonce_odr dso_local global i32 123, comdat, align 4
And in my host process, there exists the same symbol. I would expect LLJIT to resolve the global variable above to the address inside the host process, since it has linkage ‘linkonce_odr’. However, it turns out that LLJIT resolved it as if it were a conventional global variable definition and gave it its own address (I have added ‘GetForCurrentProcess’ generator for symbol resolution of course).
I can workaround this issue by making the symbol a declaration (drop the initializer, comdat and make the linkage external), but I’m wondering if it is expected behavior that LLJIT does not respect linkonce_odr specifier, since the documentation says LLJIT’s symbol resolution should work as if I were running a normal linker.