我一直在尝试使用 clang 调用我的树外 LLVM 函数传递(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。但如上所述,通过 opt 可以正常工作。因此,我不愿意更改通过逻辑。
任何指针将不胜感激。