Ошибка вызова прохода LLVM CodeGen с использованием clang: при попытке создать TargetPassConfig без целевой машины - PullRequest
0 голосов
/ 22 марта 2020

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

clang -std = c99 -m64 - c -o file.o -DSPE C -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 до запуска моего прохода. Но, как уже упоминалось выше, проход работает нормально с опцией. Поэтому я не хочу менять пароль на лог c.

Буду признателен за любые указатели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...