依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

限时开通VIP永久会员,可免费下载所有附件
查看: 21|回复: 0

现代化地编写LLVM Pass -- part II

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11646
发表于 4 天前 | 显示全部楼层 |阅读模式
现代化地编写LLVM Pass -- part II
Writing LLVM Pass in 2018-part II
第二部分原文
Analysis —Thing that deserves its own article
在LLVM PassManager中,收集程序的分析任务也被构建为了Passes,它们不会也不应该修改IR内容。而且,和旧版PM相比,在新PM中,分析数据的管理和开发有很大的改变,所以我单独用一篇文章来阐述。这篇文章将会谈论如何用新的 AnalysisManager 来接受分析数据。打开你上手的编辑器,开始吧~
analysis pass
在旧版Pass中,你会发现一个重要的特性就是analysis manager和PassManager高度融合。你可以通过 getAnalysis<...> 方法来获取某个分析数据,这也是 Pass 类的成员之一。然而在新版的PassManager中,analysis manager是一个单独的实例,可以在任何地方独立使用。为了让你理解这个特点,让我们在 旧版Pass 中使用 新版 AnalysisManager .下面是主干代码
1
2
3
4
5
6
7
bool MyFuncPass::runOnFunction(Function& F) override {
  PassBuilder PB;
  FunctionAnalysisManager FAM;
  PB.registerFunctionAnalyses(FAM);
  // ...
  return false;
}

PassBuilder我们很熟悉,需要他来向PM注册所有可用的Pass。在这之后,这里的FunctionAnalysisManager可以独立使用。 AnalysisManager 负责管理所有已注册的analysis Pass和它们的分析结果。比如,缓存一个analysis pass的结果,直到它对应的IR单元被修改。

所以我们应该如何从manager中获取分析结果呢?和旧版Pass中的 getAnalysis<...> 接口类似,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "llvm/Analysis/AliasAnalysis.h"

bool MyFuncPass::runOnFunction(Function& F) override {
  PassBuilder PB;
  FunctionAnalysisManager FAM;
  PB.registerFunctionAnalyses(FAM);

  // How we do in legacy Passes:
  AAResultWrapperPass& WrapperPass = getAnalysis<AAResultsWrapperPass>();
  AAresults& AAR1 = WrapperPass.getAAResults();

  // How we do with new AnalysisManager
  AAResults& AAR2 = FAM.getResult<AAManager>(F);

  return false;
}

上述代码使用AliasAnalysis作为我们想获得的分析数据。如果用旧的语法, 你需要先获取Pass的一个实例,然后用其中的一个成员函数来获取分析结果。在新语法中,你只需要用analysis Pass的类型(此处为 AAManager ),连同你的目标IR单元实例(此处为 Function )来调用 getResult<...> 。

这里指出 getAnalysis 和 getResult 返回类型是不同的。一方面, getAnalysis<T> 的返回类型是 T ,它的模板类型T是你希望的analysis Pass的类型,而不是analysis的结果。另一方面, getResult<T> 中的模板类型T仍代表你希望的analysis pass的类型,但 getResult 的返回类型是 T::Result (T中的Result成员)。这个区别揭示了analyses management设计中的一个重要变化: analysis结果与analysis Pass解耦。这将使得某些管理、数据验证更简单且高效。
AnalysisManager
再回头来看新的PassManager. run 方法的第二个参数是对应的IR单元的 AnalysisManager 实例
1
2
3
4
5
6
7
struct MyNewPass : public PassInfoMixin<MyNewPass> {
  PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) {
    AAResults& AAR = FAM.getResult<AAManager>(F);
    // ...
    return PreservedAnalyses::all();
  }
};

因此你可以直接使用而不用通过PassBuilder来构建。
analysis data invalidation
最后让我们谈论下分析数据的invalidation. 我们打算仅讨论normal Pass中最常用的部分。
PreservedAanlyses 是run方法所需的返回类型,记录着在Pass后仍然有效的一组分析数据。如果你只是想查看IR而不是修改它们,那么所有的分析在这之后都有效,只需要返回 PreservedAnalyses::all() 即可。

但如果你使用一些数据修改了分支的可能性并因此改变了block的频率信息,你需要从被保留的set中移除它们
1
2
3
4
5
6
7
8
9
10
#include "llvm/Analysis/BlockFrequencyInfo.h"

struct MyNewPass : public PassInfoMixin<MyNewPass> {
  PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) {
    // ...Use some profile data to change BasicBlock frequencies...
    PreservedAnalyses PA = PreservedAnalyses::all();
    PA.abandon<BlockFrequencyAnalysis>();
    return PA;
  }
};

通常我们不是从 PreservedSet 中移除分析结果,而是声明一些被保留的分析。例如,你知道你的pass在函数内不会修改控制流(control flow graph)和循环信息。如下面的代码
1
2
3
4
5
6
7
8
9
10
11
#include "llvm/Analysis/LoopInfo.h"

struct MyNewPass : public PassInfoMixin<MyNewPass> {
  PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) {
    // ...
    PreservedAnalyses PA = PreservedAnalyses::none();
    PA.preserve<LoopAnalysis>();
    PA.preserveSet<CFGAnalyses>();
    return PA;
  }
};

preserve<...> 方法声明了单个analysis的保留集(通过向其模板类型中传入analysis 类型)。 而preserveSet<...> 有些区别,它会保留一组analyse,你需要传入一个analysis set的类型(不同于Pass的概念)。有很多可用的analysis set的类型,比如此处的 CFGAnalyses 表示所有的控制流相关的analyse.

PS:
还有一些重要话题没有讨论,例如:
  • 如何写一个analysis pass
  • 如何查询一个analysis是否被保留
或许你可以从源码中找到答案 :-)

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-10-28 18:20

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表