Ошибка при вызове прохода LLVM CodeGen с использованием clang: попытка создания TargetPassConfig без целевой машины

Я пытался вызвать свой проход функции LLVM вне дерева с помощью clang (opt не вариант. Отлично работает с opt btw):

clang -std =c99 -m64 -c -o file.o -DSPEC -DNDEBUG -Ispec_qsort -DSPEC_AUTO_SUPPRESS_OPENMP -g -march=native -fno-unsafe-math-optimizations -Xclang -load -Xclang path / to / MyPass.so path/to/my_lib.a -fno-strict-aliasing -fgnu89-inline -DSPEC_LP64 file.c

Но я получаю следующую ошибку:

error in backend: Trying to construct TargetPassConfig without a target machine. Scheduling a CodeGen pass without a target triple set?

Пропуск работает нормально, если я удалю код, связанный с TargetPassConfig.

Я регистрирую проход с помощью clang, выполнив следующие действия:

static void registerClangPass ( const PassManagerBuilder &,
legacy :: PassManagerBase & PM )
{ PM . add ( new MyPass ()); }

static RegisterStandardPasses RegisterClangPass
( PassManagerBuilder :: EP_ModuleOptimizerEarly  , registerClangPass );
static RegisterStandardPasses RegisterClangPass0
( PassManagerBuilder :: EP_EnabledOnOptLevel0  , registerClangPass );

Чтобы получить общее представление о том, как выглядит мой пропуск, взгляните на:

https://github.com/llvm-mirror/llvm/blob/master/lib/CodeGen/SafeStack.cpp

который также зависит от TargetPassConfig. Следующая строка кажется проблемой:TM = &getAnalysis<TargetPassConfig>().getTM<TargetMachine>();

Я не уверен, как я могу вызвать / заполнить TargetMachine перед выполнением моего прохода. Но как было сказано выше, пропуск отлично работает с опт. Поэтому я не хочу менять логику прохода.

Любые указатели будут оценены.

0 ответов

Другие вопросы по тегам