Я хотел бы запустить пример RxCpp в ИК-интерпретаторе llvm lli
,
К сожалению, запуск любого из примеров RxCpp завершается неудачно в lli:
git clone https://github.com/Reactive-Extensions/RxCpp.git --depth 1
cd RxCpp/Rx/v2/examples/pythogerian
clang++ -S -emit-llvm -fno-use-cxa-exit -I../../src main.cpp
lli main.ll
сообщение об ошибке:
Relocation type not implemented yet!
UNREACHABLE executed at llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp:232!
Вопросы:
Что именно означает эта ошибка? — Какие предположения сделаны в orv-jit llvm, которые не выполняются?
Есть ли обходной путь? — есть ли какие-либо преобразования LLVM-IR, которые я могу применить, чтобы сделать эту работу (например, через флаг компилятора)?
Какие специальные функции использует RxCpp, которые вызывают эту проблему в orvjit от llvm?
проверено на:
clang version 5.0.0 (https://github.com/llvm-mirror/clang.git 6c9e299494de2a5b0425e46bc937f29a05128252)
clang version 4.0.0-+rc1-1 (tags/RELEASE_400/rc1)
clang version 3.9.0-1 (tags/RELEASE_390/final)
clang version 3.8.1-12 (tags/RELEASE_381/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Кажется, проблема с thread_local
/ __thread
,
Замена #define RXCPP_THREAD_LOCAL __thread
в rx-utils.hpp
с пробелами «исправляет» эту проблему.
Причина — сбой в бэкэнде LLVM, поскольку он еще не поддерживает TLS. Это связано с Ошибка 21431 и тот факт, что в RuntimeDyld компании llvm отсутствуют некоторые стратегии перемещения.
Других решений пока нет …