LLVM TableGen 系统学习笔记
Basic
TableGen 系统可以帮助记录领域特定的信息。它也可以认为是一种小型的编译系统。
TableGen 责负分析文件, 分析结果交给领域特定的后端进行处理。
重要的概念
records
一个 record 有一个独立的名称,一系列值和一系列父类。 它保存了特定领域的知识。
可以认为 tablegen 前端生成 recode 流, 对于其中 record 的解释由具体的后端执行。
definitions
record的具体形式, 按数据结构看是 key-value 字典, 它的具体含义与作用由特定的后端后决定。可以有名,也可以无名。
def
例子:
def HelloWorld {
string msg = "Hello world!";
}
classes
表示抽象的 record, 用于构造和描述其它的 record。类方便于定义目标领域的抽象。
class
class ProcNoItin<string Name, list<SubtargetFeature> Features>: Processor<Name, NoItineraries, Features>;
multiclasses
表示一组抽象的 record, 一次实例化可以产生多个 definations。
可以看到在 multiclasses 内部 def 了多个 defination。 使用 defm 调用 muliclasses 的构造。
multiclass ro_signed_pats<string T, string Rm, dag Base, dag Offset, dag Extend, dag address, ValueType sty> {
def : Pat<(i32 (!cast<SDNode>("sextload" # sty) address)),(!cast<Instruction>("LDRS" # T # "w_" # Rm # "_RegOffset")Base, Offset, Extend)>;def : Pat<(i64 (!cast<SDNode>("sextload" # sty) address)),(!cast<Instruction>("LDRS" # T # "x_" # Rm # "_RegOffset")Base, Offset, Extend)>;
}defm : ro_signed_pats<"B", Rm, Base, Offset, Extend,!foreach(decls.pattern, address,!subst(SHIFT, imm_eq0, decls.pattern)),i8>;
TableGen 的后端
clang-tblgen [options] [filename]
lldb-tblgen [options] [filename]
llvm-tblgen [options] [filename]
mlir-tblgen [options] [filename]
大体上是这几个, 但是每个命令指令不同的选项生成的效果也不同。
比如 clang 有这几个和 riscv 相关的指令:
-gen-riscv-vector-header
Generate
riscv_vector.hfor Clang.-gen-riscv-vector-builtins
Generate
riscv_vector_builtins.incfor Clang.-gen-riscv-vector-builtin-codegen
Generate
riscv_vector_builtin_cg.incfor Clang.-gen-riscv-sifive-vector-builtins¶
Generate
riscv_sifive_vector_builtins.incfor Clang.-gen-riscv-sifive-vector-builtin-codegen
Generate
riscv_sifive_vector_builtin_cg.incfor Clang.
类型系统
- bit, bits<N>, int
- string, code
- list<T>
- unset
- dag
- 自定义的 class
部分类型举例
- bit 0或1
- bits: { 1, 0, 1, 0, 1, 0 }
- string: “this is a string”
- code: [{ this_is_code(); }]
list:
- [ “this”, “is”, “a”, “list” ]
- [ “explicitly”, “typed”, “list”, “literal” ]
- Indexing a list: foo[4]
Unset value
表现在打印输出上是一个 ?, 它可以是任意类型
dag
类似于 S-expression, S表达式。 典型的应用场景是 ISel 即指令选择。
(op arg0:$name0, arg1:$name1, ...)
code
获取 defination 信息
我们可以使用 llvm-tblgen 或在线网站 Compiler Explorer 来查看一个tablegen 文件对应的 class 和 defination 流,这有利于我们了解现有的 tablegen 文件描述了什么东西。
tablegen 例子
def
def HelloWorld {
string msg = "Hello world!";
}
def { // 匿名
string msg = "Hello world!";
}
class
class C {
int c = 7;
int d = 7;
}
class D<int a> : C{ // 继承, 模板 , unset
int e=a;
}
def X: C {}
def Y: D<1>{} // 模板传参
let
class C {
int a;
int b;
}
let a=5, b=6 in {
def X: C {}
}
multiclass & defm
class C {
int c = 7;
int d = 7;
}
class D<int a>{
int e=a;
}
multiclass E<int num>{
let c=num in def _c:C;// 在 muliclass 中使用 let 的语法
def _d : D<num>;
}
defm INST: E<9>; // 一次定义2个 defination
foreach
class C {
int c = 7;
int d = 7;
}
foreach i = [0, 1, 2, 3] in {
def R#i : C; // #i 会替换成对应的值
def F#i : C;
}
!cast<>
根据名称(字符串)获取类
class B{
string b="isb";
}
class C <string name> {
B b_of_c = !cast<B>(name);
}
def firstB: B;
def c:C<"firstB">;
#
拼接字符串
class Hello <string _msg> {
string msg = "Hello " # _msg;
}
def HelloWorld: Hello<"world!"> {}
参考
1 TableGen Programmer’s Reference — LLVM 19.0.0git documentation
https://github.com/llvm/llvm-project/blob/main/llvm/utils/TableGen/jupyter/tablegen_tutorial_part_1.ipynb
https://archive.fosdem.org/2019/schedule/event/llvm_tablegen/attachments/slides/3304/export/events/attachments/llvm_tablegen/slides/3304/tablegen.pdf
相关文章:
LLVM TableGen 系统学习笔记
Basic TableGen 系统可以帮助记录领域特定的信息。它也可以认为是一种小型的编译系统。 TableGen 责负分析文件, 分析结果交给领域特定的后端进行处理。 重要的概念 records 一个 record 有一个独立的名称,一系列值和一系列父类。 它保存了特定领域…...
基于stm32的流水灯设计
1基于stm32的流水灯设计[proteus仿真] 速度检测系统这个题目算是课程设计和毕业设计中常见的题目了,本期是一个基于51单片机的自行车测速系统设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2¥,…...
kotlin图片合成和压缩
kotlin图片合成和压缩 之前的方法是继承AsyncTask 在doInBackground 里面去做压缩的操作,然后用 publishProgress 切到主线程里面更新 新方法是在协程里的去做 class ImageService {private fun getSumWidths(bitmaps: ArrayList<Bitmap>): Int {var sumWid…...
Java学习笔记004——接口概念理解及意义
一个类中有抽象方法,则必须声明为abstract(做为抽象类),抽象类不能实例化。子类继承抽象类,必须对所有的抽象方法重写,否则依然有抽象方法,还是抽象的,无法实例化。故抽象类常做为基…...
MT笔试题
前言 某团硬件工程师的笔试题,个人感觉题目的价值还是很高的,分为选择题和编程题,选择题考的是嵌入式基础知识,编程题是两道算法题,一道为简单难度,一道为中等难度 目录 前言选择题编程题 选择题 C语言中变…...
50道SQL面试题
50道SQL面试题 有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 环境 -- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS teacher; CREATE TABLE teacher (t_id varchar(20) …...
2024蓝桥杯每日一题(双指针)
一、第一题:牛的学术圈 解题思路:双指针贪心 仔细思考可以知道,写一篇综述最多在原来的H指数的基础上1,所以基本方法可以是先求出原始的H指数,然后分类讨论怎么样提升H指数。 【Python程序代码】 n,l map(int,…...
Android 开发过程中常见的内存泄漏场景分析
场景1 Static变量存储上下文环境Context public class ClassName {// 定义1个静态变量private static Context mContext;//... // 引用的是Activity的contextmContext context; // 当Activity需销毁时,由于mContext 静态 & 生命周期 应用程序的生命周期&…...
Codeforces-1935E:Distance Learning Courses in MAC(思维)
E. Distance Learning Courses in MAC time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output The New Year has arrived in the Master’s Assistance Center, which means it’s time to introduce a new feature…...
ZooKeeper和Diamond有什么不同
本文主要是讨论下两个类似产品:ZooKeeper和Diamond在配置管理这个应用场景上的异同点。 Diamond,顾名思义,寄寓了开发人员对产品稳定性的厚望,希望它像钻石一样,提供稳定的配置访问。Diamond是淘宝网Java中间件团队的核…...
三、N元语法(N-gram)
为了弥补 One-Hot 独热编码的维度灾难和语义鸿沟以及 BOW 词袋模型丢失词序信息和稀疏性这些缺陷,将词表示成一个低维的实数向量,且相似的词的向量表示是相近的,可以用向量之间的距离来衡量相似度。 N-gram 统计语言模型是用来计算句子概率的…...
QML 3D入门知识路线
目前使用的版本 v5.14.0 模块导入 使用QML 3D时需要 import Qt3D.Core 2.14 核心模块类 V6以上的版本已经发布,所以有很多module会发生变化,主要有核心module、输入、逻辑、渲染、动画和扩展module,以及2D/3D场景模块 类名 能…...
蓝牙系列五:开源蓝牙协议BTStack框架代码阅读(1)
蓝牙学习系列,借鉴卫东上老师的蓝牙视频教程。 BTStack协议栈学习。首先来看一下,对于硬件操作,它是如何来进行处理的。在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码。在BTStack中,可以搜索一下main.c,将会发现有很多main.c,都是…...
c++ 类内可以定义引用数据成员吗?
在C中,类内是可以定义引用数据成员的,但是在初始化对象时,必须在构造函数的成员初始化列表中对引用进行初始化,因为引用必须在创建时被初始化,并且不能在其生存期内引用不同的对象。下面是一个简单的示例: …...
MacBook2024苹果免费mac电脑清理垃圾软件CleanMyMac X
CleanMyMac X是一款专业的Mac清理软件,具备多种强大功能。首先,它能够智能清理Mac磁盘上的垃圾文件和多余语言安装包,从而快速释放电脑内存。其次,CleanMyMac X可以轻松管理和升级Mac上的应用,同时强力卸载恶意软件并修…...
Vue.js计算属性:实现数据驱动的利器
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
10-ARM gicv3/gicv4的总结-基础篇
目录 1、gic的版本2、GICv3/gicv4的模型图3、gic中断号的划分4、GIC连接方式5、gic的状态6、gic框架7、gic Configuring推荐 本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,s…...
数据库系统概论(超详解!!!) 第三节 关系数据库
1.基本概念 1. 域(Domain) 域是一组具有相同数据类型的值的集合。 2. 笛卡尔积(Cartesian Product) 给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D2…...
Springboot 集成kafka 消费者实现ssl方式连接监听消息实现消费
证书准备:springboot集成kafka 消费者实现 如何配置是ssl方式连接的时候需要进行证书的转换。原始的证书是pem, 或者csr方式 和key方式的时候需要转换,因为kafka里面是jks 需要通过openssl进行转换。 证书处理: KeyStore 用于存储客户端的证…...
spark 实验二 RDD编程初级实践
目录 一. pyspark交互式编程示例(学生选课成绩统计) 该系总共有多少学生; 该系DataBase课程共有多少人选修; 各门课程的平均分是多少; 使用累加器计算共有多少人选了DataBase这门课。 二.编写独立应用程序实现数…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
