1

我一直在尝试使用 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 可以正常工作。因此,我不愿意更改通过逻辑。

任何指针将不胜感激。

4

0 回答 0