• 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 Features>
          : Processor;

    multiclasses

    表示一组抽象的 record, 一次实例化可以产生多个 definations。

    可以看到在 multiclasses 内部 def 了多个 defination。 使用 defm 调用 muliclasses 的构造。

    multiclass ro_signed_pats {
    def : Pat<(i32 (!cast("sextload" # sty) address)),
              (!cast("LDRS" # T # "w_" # Rm # "_RegOffset")
                Base, Offset, Extend)>;
    
    def : Pat<(i64 (!cast("sextload" # sty) address)),
              (!cast("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.h for Clang.

    -gen-riscv-vector-builtins

    Generate riscv_vector_builtins.inc for Clang.

    -gen-riscv-vector-builtin-codegen

    Generate riscv_vector_builtin_cg.inc for Clang.

    -gen-riscv-sifive-vector-builtins

    Generate riscv_sifive_vector_builtins.inc for Clang.

    -gen-riscv-sifive-vector-builtin-codegen

    Generate riscv_sifive_vector_builtin_cg.inc for Clang.

    类型系统

    1. bit, bits, int
    2. string, code
    3. list
    4. unset
    5. dag
    6. 自定义的 class

    部分类型举例

    1. bit 0或1
    2. bits: { 1, 0, 1, 0, 1, 0 }
    3. string: “this is a string”
    4. code: [{ this_is_code(); }]

    list:

    1.  [ “this”, “is”, “a”, “list” ]
    2.  [ “explicitly”, “typed”, “list”, “literal” ]
    3.  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 : 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 e=a;

    }

    multiclass E{

    let c=num in def _c:C;// 在 muliclass 中使用 let 的语法

    def _d : D;

    }

    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 {

    B b_of_c = !cast(name);

    }

    def firstB: B;

    def c:C<"firstB">;

    拼接字符串

    class Hello {

    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

  • 相关阅读:
    Python学习第10天:类与对象
    AI绘制流程图
    Tableau自四部曲_Part1:Tableau介绍与安装
    proteus仿真大赛-----pyqt5制作上位机安防页面
    携创教育:成人高考的流程及注意事项
    外汇天眼:外汇储备减少对新兴市场货币构成风险
    基于javaweb的在线美食分享推荐系统(java+ssm+jsp+jquery+mysql)
    maven环境变量配置以及失败的原因
    Notebook系列第10期:图像风格转换
    如何精准识别主数据?
  • 原文地址:https://blog.csdn.net/qq_43688320/article/details/136411729