基本概念
LLVM Pass按加载方式分类:
常见问题
XCode使用Pass的方式(以下方式笔者均验证过可行)
针对AppleClang开发动态Pass
现在来看看最难的部分,如果直接使用AppleClang对应版本的开源LLVM开发Pass给AppleClang使用是会崩溃的,因为AppleClang相对于开源LLVM魔改了很多地方。为了让AppleClang能运行起来一个最简单的Pass你至少需要如下hacker代码:
__attribute__((visibility("default"))) void Value::dump() const {
print(dbgs(), /*IsForDebug=*/true); dbgs() {
public:
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) {
M.dump();
#ifdef APPLE_CLANG
static PreservedAnalyses (*PreservedAnalyses__all)() = 0;
static PreservedAnalyses (*PreservedAnalyses__none)() = 0;
if (PreservedAnalyses__all == 0) {
const char* image = _dyld_get_image_name(0);
PreservedAnalyses__all = (__typeof(PreservedAnalyses__all)) DobbySymbolResolver(image,
"__ZN4llvm6detail9PassModelINS_6ModuleEN12_GLOBAL__N_114NoOpModulePassENS_17PreservedAnalysesENS_15AnalysisManagerIS2_JEEEJEE3runERS2_RS7_");
PreservedAnalyses__none = (__typeof(PreservedAnalyses__none))DobbySymbolResolver(image,
"__ZN4llvm6detail9PassModelINS_6ModuleENS_25InvalidateAllAnalysesPassENS_17PreservedAnalysesENS_15AnalysisManagerIS2_JEEEJEE3runERS2_RS6_");
}
return (opc > 0) ? PreservedAnalyses__all() : PreservedAnalyses__none();
#else
return (opc > 0) ? PreservedAnalyses::all() : PreservedAnalyses::none();
#endif
};
static bool isRequired() { return true; }
};
以上操作仅仅是让你“入门”,而下一步就是处理AppleClang魔改造成的冲突,包括但不限于补全符号/拆分静态库/自行实现冲突代码,也是个复杂且麻烦的工程了,有兴趣的可以接着研究下去