相关疑难解决方法(0)

如何在 Clang 中自动注册并加载现代 Pass?

我正在尝试编写一个简单的“现代”LLVM pass 并将其与 Clang 一起使用。我希望它能够使用如下命令运行: clang -Xclang -load -Xclang libMyPass.so file.cpp

有很多关于如何将遗留通行证集成到 Clang 中的手册。然而,关于新通行证管理器的信息并不多。我看到了一系列名为“2018 年编写 LLVM Pass”的文章。但它只提到了您的密码放置在 LLVM 代码树内的情况。我需要在树外构建模块。

class MyPass : public llvm::PassInfoMixin<MyPass> {
public:
    llvm::PreservedAnalyses run(
        llvm::Function &F,
        llvm::FunctionAnalysisManager &FAM
    ) {
    // Pass code here
    }
};

extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK
llvmGetPassPluginInfo() {
    return {
        LLVM_PLUGIN_API_VERSION, "MyPass", "v0.1",
        [](llvm::PassBuilder &PB) {
            PB.registerPipelineParsingCallback(
                [](
                    llvm::StringRef Name, llvm::FunctionPassManager &FPM,
                    llvm::ArrayRef <llvm::PassBuilder::PipelineElement>
                ) {
                    if (Name == "my-pass") {
                        FPM.addPass(MyPass());
                        return true;
                    }
                    return false;
                }
            );
        }
    };
} …
Run Code Online (Sandbox Code Playgroud)

llvm clang

14
推荐指数
2
解决办法
3173
查看次数

在clang命令行上提供LLVM ModulePass

我有一个使用opt工具的ModulePass,但是我无法弄清楚如何在命令行中使用它.我目前使用my pass的工作流程是:

  1. clang -c -emit-llvm [c-source code files]
  2. llvm-link [llvm bitcode文件]
  3. opt -load [PassName] .so - [pass-name] [链接llvm文件]
  4. llc [结果bitcode文件]
  5. gcc [生成的汇编程序文件] -o [target]

我希望将我的pass与clang命令行集成,以便可以作为现有软件(例如c ++标准库)构建的一部分调用它,而不必为我编译的每个东西重新构建整个构建系统.我已经看到了关于如何做到这一点的提示,但我无法将各个部分组合到一个正常工作的设置中.

使用Clang自动运行LLVM Pass会自动描述我想要的内容,但LLVM 3.4中似乎不推荐使用该方法(PassManagerBuilder已移至旧版命名空间).

LLVM - 使用clang自动运行自己的通行证似乎解决了基本问题,但我希望我能做到这一点,而不必修改clang(这似乎是那里的建议).

使用LLVM 3.4从clang获得新传递的最佳方法是什么?

llvm clang llvm-clang llvm-ir llvm-c++-api

10
推荐指数
1
解决办法
1155
查看次数

标签 统计

clang ×2

llvm ×2

llvm-c++-api ×1

llvm-clang ×1

llvm-ir ×1