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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 48|回复: 0

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12008
发表于 2024-11-10 13:14:38 | 显示全部楼层 |阅读模式
用LLVM写一个芯片编译器(三)——芯片的整体架构部分上一章介绍了从宏观上看LLVM需要补充什么东西,从这一章开始我们逐个讲各部分需要的代码。

用LLVM写一个芯片编译器(二)——从无到有需要写什么东西_依星源码资源网,依星资源网 -

本部分我们首先介绍芯片的整体架构部分。这一部分可能稍微有点儿枯燥,没有讲寄存器和指令那么的清晰明了,但它确实是LLVM编译器的入口,首先就要完成这一部分代码, 所以需要耐心看完。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
如上图,首先回顾一下这个部分需要写什么东西。我们挑重点讲。
1. Smallbird.h
这个文件是我们要完成的第一个文件,其实就是申明了两个类,方便后续引用。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
后续可以把全局的宏定义写到这个里面。
没有其他东西了,毫无技术含量^^
2. Smallbird.td
接下来我们写Smallbird.td。emmm 这个文件主要定义整体架构层面的东西。
2.1 定义一些subtarget Features
例如我们定义两个feature, 支持SLT,和支持Cmp指令。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
然后为了方便,定义这些feature的集合。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
例如定义个SmallBird32II特性,包含Cmp和Slt.
这部分其实是利用tablegen来完成的,基类是SubtargetFeature。后续我们可以确定我们某个subtarget带不带某个feature。
至于这个subtargetFeature, 显然用的是LLVM提供的接口。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
没有太多内容,就是定义了一下名字,描述之类的。
2.2 定义一些subtarget Features
然后就是定义几个Processor。。。这个Processor带了某个特性。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
例如上面就定义了两个subtarget处理器,一个含有FeatureSmallBird32I特性,另一个含有FeatureSmallBird32II特性。
2.3 把架构定义出来

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
3. SmallBirdTargetMachine.cpp/h
3.1 定义我们的target类
这部分h文件描述我们的TargetMachine类。这个类包含了各个subtarget类的一个map。
从LLVMTargetMachine里继承出我们的SmallBirdTargetMachine类。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
其实可以理解为对subtarget的管理,提供了接口,可以方便的拿出我们需要的subtarget。
(你不知道为什么要拿到subtarget类?看上一章)
当然,为了使用方便,我们还能用SmallBirdTargetMachine还可以派生出大小端的类。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
3.2 注册我们的target类
在C文件里,比较重要的是我们需要调用一个LLVM的库函数,把我们写的类注册给LLVM。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
3.3 实现我们的PassConfig
此处在C文件里直接实现SmallBirdPassConfig类,继承自TargetPassConfig, 用来配置我们Target的Pass。
(什么叫Pass: 就是一个处理过程,例如程序选择就是一个Pass, 不太清楚的话看第一章)

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
例如上面的代码就是重载了addInstSelector, 注册了我们自己写的指令选择器。
4.SmallBirdMCTargetDesc
这部分代码正式生成Target对象,并把各种类都注册给LLVM。具体注册了些什么见cpp文件。
主要在LLVMInitializeSmallBirdTargetMC()里,

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
把target, asminfo, inst, reg, subtarget等等类全部注册给LLVM。
5.SmallBirdbaseInfo
这是个.h文件,倒是比较简单。定义了两个枚举类型,
Target Operad Flag, 操作数前缀。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
还有就是指令类型的enum

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
没什么其他内容了,比较简单。
6.SmallBirdTargetInfo
这个文件贼简单,主要就是实现一个函数gettarget,让我们获取到target类。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
7.SmallBirdSubTarget
emmm 然后来到了最重要的一个类。这个类前面讲过,是个接口类,主要定义了一系列subtarget对外的接口。
这个地方subtarget有哪些我们在td文件中定义过,此处写成一个enum, 显然,td文件要和.h文件对上。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
所以我们可以看出,td文件和cpp/.h文件是要配合使用的,两个剥离开了理解是非常痛苦的一件事儿。类里定义了一堆借口。

用LLVM写一个芯片编译器(三)——芯片的整体架构部分

用LLVM写一个芯片编译器(三)——芯片的整体架构部分
例如上面这样的,返回的全是各类的指针。
8. 几个容易混淆的概念
上面这部分代码重点已经讲完了。你可能看到这儿有几个点有疑惑,这儿解释一下。
Target和SubTarget的区别:Target说的是一类芯片,例如ARM是一个Target, SubTarget是具体的一个芯片,例如ARM的M3。这也很好理解,一个系列的芯片总有不同的特征的,有些支持slt, 有些不支持,把这些特性总结成feature, 然后定义各种subtarget即可。否则岂不是要写若干编译器><
Target和TargetMachine区别:Target是信息层面的类,比如Target叫什么,有哪些特征。TargetMachine是操作层面的类,用于管理subtarget的。
9. 总结
本章是我们从LLVM森林看到LLVM树木的第一章。介绍了我们如何在LLVM上定义出我们的架构,方便后续添加枝叶进去。可能有点晦涩,可对照代码来读。下一章讲的内容应该更好懂,下一章我们讲讲如何添加寄存器信息进去。


相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠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-11-23 22:27

Powered by Net188.com X3.4

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

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