---
title: 更新Pass使用NewPassManager
description: "在毕昇编译器中，用户可以使用NewPassManager实现的自定义Pass。以下是一个在函数退出时输出信息的简单功能函数，这里我们示范如何用NewPassManager实现一个完成这个功能的Pass。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/compilation/ug-bisheng/kunpengbisheng_06_0084.html
sourcePath: /source/zh/kunpengdevps/compilation/ug-bisheng/kunpengbisheng_06_0084.html
indexId: 80da8b6f21011d92dc8e5d68ff10581e3022839650e5e7e097b64bbe2d9c468874
---
# 更新Pass使用NewPassManager

在毕昇编译器中，用户可以使用NewPassManager实现的自定义Pass。以下是一个在函数退出时输出信息的简单功能函数，这里我们示范如何用NewPassManager实现一个完成这个功能的Pass。

```
bool runBye(Function &F) {
    errs() << "Bye: ";
    errs().write_escaped(F.getName()) << '\n';
    return false;
}
```

使用NewPassManager实现Bye Pass：

```
struct Bye : PassInfoMixin<Bye> {
    PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
        if (!runBye(F))
            return PreservedAnalyses::all();
        return PreservedAnalyses::none();
    }
};
```

PassInfoMixin提供了一种简洁的方式来定义pass。在New Pass中，编程人员只需要自定义run函数就可以了，用户可以在run中运行自己完成的功能函数，这里调用的是上例runBye()。然后返回值告诉毕昇编译器哪些分析结果仍然有效，哪些需要重新计算。

- PreservedAnalyses::all() 表示所有的分析结果都仍然有效。
- PreservedAnalyses::none() 表示所有的分析结果都需要重新计算。
