Запуск следующего кода с clang++ -S -emit-llvm main.cpp && lli main.ll
в Linux (Debian)
#include <future>
int main () {
return std::async([]{return 1;}).get();
}
не работает в режиме lli из-за следующей ошибки:
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++
компилируется и выполняется успешно *; какие конкретные функции libstdС++ используют, что вызывает эту проблему?
EDIT:
Мотивация этого вопроса заключается в понимании различий между libС++ и libstdС++, что приводит к этому конкретному сообщению об ошибке (в Linux) в llvm orcjit.
В OSX gcc устарел, а clang использует по умолчанию libc++
.
Чтобы воспроизвести эту ошибку на OSX, вам, вероятно, придется установить gcc и использовать -stdlib=libstdc++
.
Вот llvm-ir (к сожалению, он может быть встроен в него напрямую)