Я пытался вызвать мой проход функции 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.
Буду признателен за любые указатели.