[llvm-dev] Orc JIT vs. STL

Geoff Levner via llvm-dev llvm-dev at lists.llvm.org
Tue Aug 27 08:45:02 PDT 2019


I don't have the DynamicLibrarySearchGenerator and
StaticLibrarySearchGenerator classes. I should mention that we are
using LLVM 7... Does
DynamicLibrarySearchGenerator::GetForCurrentProcess() do more than
what DynamicLibrary::LoadLibraryPermanently(nullptr) does (or did)?

I am also thinking our problems might be connected to the fact that
gcc 6.3.1 is in a software collection (devtoolset-6) and that there is
some sort of  magic going on to mix its STL (the .a file) with the
libstdc++ DSO, which is in /usr/lib64, not in devtoolset-6.

On Tue, Aug 27, 2019 at 5:36 PM Praveen Velliengiri
<praveenvelliengiri at gmail.com> wrote:
>
> You can add symbols from Archieve via StaticLibrarySearchGenerator. But it is added recently though
>
> On Tue, 27 Aug 2019 at 21:02, Praveen Velliengiri <praveenvelliengiri at gmail.com> wrote:
>>
>> Hi Geoff,
>> I tried it, but I can't able to reproduce it.
>>
>> Test Program:
>> #include <fstream>
>> int main()
>> {
>>  std::ifstream stream1, stream2;
>>  stream1.swap(stream2);
>>  return 0;
>> }
>>
>> I didn't get undefined symbols error. I used DynamicLibrarySearchGenerator::GetForCurrentProcess API to make symbols from STL visible to ORC JIT.
>>
>> On Tue, 27 Aug 2019 at 20:36, Geoff Levner <glevner at gmail.com> wrote:
>>>
>>> On Tue, Aug 27, 2019 at 4:56 PM Praveen Velliengiri
>>> <praveenvelliengiri at gmail.com> wrote:
>>> >
>>> > HI
>>> > Did you run the static constructor and destructor? How did you make your process symbols visible to ORC jit?
>>>
>>> Yes. It's the constructor that generates the undefined symbol error.
>>> We use DynamicLibrary::LoadLibraryPermanently(nullptr) to add process
>>> symbols.
>>>
>>> > Could you please share us the for what symbols you get undefined references :-)
>>>
>>> Certainly! Mangled:
>>>
>>>     _ZNSi4swapERSi
>>>     _ZNSt13basic_filebufIcSt11char_traitsIcEE4swapERS2_
>>>
>>> And unmangled:
>>>
>>>     std::basic_istream<char, std::char_traits<char>
>>> >::swap(std::basic_istream<char, std::char_traits<char> >&)
>>>     std::basic_filebuf<char, std::char_traits<char>
>>> >::swap(std::basic_filebuf<char, std::char_traits<char> >&)
>>>
>>> Incidentally, if I call that STL swap() function in the application,
>>> to ensure it is in the process symbols, the second symbol is found,
>>> but the first is still undefined.
>>>
>>>
>>> >
>>> > On Aug 27, 2019 8:18 PM, "Geoff Levner via llvm-dev" <llvm-dev at lists.llvm.org> wrote:
>>> >>
>>> >> Greetings, LLVM wizards.
>>> >>
>>> >> We are using Clang and Orc JIT (v1) to compile and execute C++ code on the fly. If a C++ module calls functions from external libraries, we add them via DynamicLibrary::LoadLibraryPermanently().
>>> >>
>>> >> The problem we have run into recently is when a module calls a function from the STL -- in particular this swap() function for input streams:
>>> >>
>>> >> #include <fstream>
>>> >> std::ifstream stream1, stream2;
>>> >> stream1.swap(stream2);
>>> >>
>>> >> When we run the constructors for the module, we get two undefined symbols. And explicitly adding libstdc++ doesn't help. It turns out that the missing symbols are defined not in the runtime DSO but in an archive file:
>>> >>
>>> >> /opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/libstdc++.a
>>> >>
>>> >> So my questions are:
>>> >>
>>> >> 1. Is there a simple way to get access to all symbols defined in the STL? Intuitively, it seems like we should not need to know about such compiler magic.
>>> >>
>>> >> 2. If there is no magical solution, is there a way to explicitly add symbols from an archive?
>>> >>
>>> >> Thanks,
>>> >> Geoff
>>> >>
>>> >>
>>> >> _______________________________________________
>>> >> LLVM Developers mailing list
>>> >> llvm-dev at lists.llvm.org
>>> >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>> >>


More information about the llvm-dev mailing list