鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

完整使用用例

以下提供一个完整使用该功能的代码示例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "llvm/IR/Function.h"
#include "llvm/Pass.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Passes/PassPlugin.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
namespace {
bool runBye(Function &F) {
    errs() << "Bye: ";
    errs().write_escaped(F.getName()) << '\n';
    return false;
}
struct Bye : PassInfoMixin<Bye> {
    PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
        if (!runBye(F))
            return PreservedAnalyses::all();
        return PreservedAnalyses::none();
    }
};
}
/* New PM Registration */
extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo() {
    return {LLVM_PLUGIN_API_VERSION, "Bye", LLVM_VERSION_STRING,
          [](PassBuilder &PB) {
            PB.registerVectorizerStartEPCallback(
                [](llvm::FunctionPassManager &PM, OptimizationLevel Level) {
                  PM.addPass(Bye());
                });
          }};
}

然后使用以下命令来使用这个Pass,这里使用的clang和clang++都是从毕昇软件包获取的。

1
2
3
4
5
clang++ MyPass.cpp -fPIC -shared -o bye.so `llvm-config --cxxflags --ldflags`
cat minimal.c 
int main() {return 0;}
clang -fplugin=./bye.so -fpass-plugin=./bye.so -O3 minimal.c
Bye: main

这里不要手动使用 -I -L,需要使用llvm-config。使用-fplugin=./bye.so -fpass-plugin=./bye.so来加载Pass。