Запуск следующий код с clang++ -S -emit-llvm main.cpp && lli main.ll
на Linux (Debian)ЛЛИ: LLVM ОШИБКА: Невозможно выбрать: X86ISD :: WrapperRIP TargetGlobalTLSAddress: i64
#include <future>
int main() {
return std::async([]{return 1;}).get();
}
не запускается на ЛЛИ из-за следующей ошибки:
LLVM ERROR: Cannot select: 0xd012e0:
i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<i8** @_ZSt15__once_callable> 0 [TF=10]
0xd020c0: i64 = TargetGlobalTLSAddress<i8** @_ZSt15__once_callable> 0 [TF=10]
In function: _ZSt9call_onceIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS0_12_Result_baseENS4_8_DeleterEEvEEPbEJPS1_S9_SA_EEvRSt9once_flagOT_DpOT0_
Вопросы:
Что это значит?
Существуют ли какие-либо флагов-компиляторы, которые устраняют эту проблему?
с использованием -stdlib=libc++
скомпилирован и успешно выполнен *; какие конкретные функции libstdC++ используют, что вызывает эту проблему?
EDIT:
Мотивация этого вопроса, чтобы понять различие между LIBC++ и libstdC++, что приводит к этому конкретному сообщению об ошибке (на Linux) в orcjit LLVM в.
В OSX gcc устарел и clang использует по умолчанию libc++
. Для воспроизведения этой ошибки на OSX вам, вероятно, придется установить gcc & -stdlib=libstdc++
.
Вот llvm-ir (это, к сожалению, большой, чтобы встроить его непосредственно здесь)
Что вы подразумеваете под «компиляции и работает успешно» с libC++. Я получаю: LLVM ERROR: Программа использовала внешнюю функцию '_ZTVNSt3__114__shared_countE', которая не может быть решена! при запуске lli ... с помощью macOS? – Tobias
да, вы правы, видимо, я использую пользовательскую сборку, которая содержит эти символы в двоичном формате; однако я в первую очередь заинтересован в понимании того, почему llvm orcjit не может запустить этот код * с * gcc стандартной библиотекой. – Gaetano
https://llvm.org/bugs/show_bug.cgi?id=21431? Я знаю, что это mcjit, но, возможно, такая же проблема для orc – Tobias