首页 > 其他分享 >LLVM ISA指令选择与实现

LLVM ISA指令选择与实现

时间:2023-01-12 04:55:05浏览次数:62  
标签:LLVM return struct Base classof 指令 ISA

LLVM ISA指令选择与实现

LLVM指令的选择

对指令选择过程中一些代码的解释:

    1、这里的指令选择发生在SelectionDAG阶段的后段,即DAG图已经转成了目标机器的DAG并完成了Schedule(指令调度);但在寄存分配之前。此阶段其实就是发射机器指令了。

    这个阶段中是采用BuildMI方法(定义在: llvm\include\llvm\Codgen\MachineBuilder.h)进行由前者到后者的转换的。

    2、def : Pat<(i32 immSExt8:$in), (ADDiu R4, imm:$in)>;

    这条指令的意思是进行一种匹配。至于用处可以看该文档,现在只用个例子进行解释。大意就是在selectDAG中会匹配到类似第一个参数的指令,匹配到后便会利用后一个参数的指令进行替换。而这句代码中的 i32 immSEx8:$in 代指的就是一个32位的立即数。immSExt8之前定义为:

       def immSExt8 : PatLeaf<(imm), [{return isInt<8>(N->getSExtValue()); }]>;      

这条指令是判定一个立即数是否是8位的,是的话才能匹配成功。第一个参数imm代表的就是立即数;第二个参数则是判定语句。具体的信息还得再领悟。。。 

       ADDiu R4, imm:$in 则是用来替代前一参数所代表的指令。

     整条指令是由LLVM IR转成机器指令,发生在selectDAG阶段。而且可以看到这条指令并没有定义一个具体的名字,说明是可以匹配任何的指令,只要匹配成功就会执行。

Llvm ISA指令实现

LLVM确实大量使用了手工形式的RTTI,使用了isa<>、cast<>和dyn_cast<>等模板。这种形式的RTTI是可选的,可以添加到任何类中。也比dynamic_cast<>有效得多。

LLVM实现了某种自定义RTTI并使用了classof。

首先,LLVM系统非常具体,根本不是RTTI系统的替代品。对于大多数类,不需要生成RTTI信息当需要时,信息只在给定的层次结构中有意义排除了这个系统的多重继承识别对象类,以简单的层次结构为例:

struct Base {}; /* abstract */

struct DerivedLeft: Base {}; /* abstract */

struct DerivedRight:Base {};

struct MostDerivedL1: DerivedLeft {};

struct MostDerivedL2: DerivedLeft {};

struct MostDerivedR: DerivedRight {};

创建一个特定于此层次结构的枚举,其中每个可以实例化的层次结构成员都有一个枚举成员(其他成员将毫无用处)

enum BaseId {
  DerivedRightId,
  MostDerivedL1Id,
  MostDerivedL2Id,
  MostDerivedRId
};

然后,基类将使用返回此枚举的方法进行扩充。

struct Base {
  static inline bool classof(Base const*) { return true; }
 
  Base(BaseId id): Id(id) {}
 
  BaseId getValueID() const { return Id; }
 
  BaseId Id;
};

每一个具体的类也以这种方式被扩充:

struct DerivedRight: Base {
  static inline bool classof(DerivedRight const*) { return true; }
 
  static inline bool classof(Base const* B) {
    switch(B->getValueID()) {
    case DerivedRightId: case MostDerivedRId: return true;
    default: return false;
    }
  }
 
  DerivedRight(BaseId id = DerivedRightId): Base(id) {}
};

现在,可以简单地查询精确的类型以进行强制转换。

隐藏实施详细信息

但是,让用户对getValueID进行窃听会很麻烦,所以在LLVM中,这是通过使用classof方法隐藏的。

给定的类应该实现两类方法:一类用于其最深的基(测试BaseId的适当值),另一类用于自身(纯优化)。例如:

struct MostDerivedL1: DerivedLeft {
  static inline bool classof(MostDerivedL1 const*) { return true; }
 
  static inline bool classof(Base const* B) {
    return B->getValueID() == MostDerivedL1Id;
  }
 
  MostDerivedL1(): DerivedLeft(MostDerivedL1Id) {}
};

这样,可以通过模板检查是否可以进行强制转换:

template <typename To, typename From>
bool isa(From const& f) {
  return To::classof(&f);
}

想象一下,To是MostDerivedL1:

如果From是MostDerivedL1,那么调用classof的第一个重载,就会工作

如果From是其他类型,那么调用classof的第二个重载,检查使用枚举来确定具体类型是否匹配。

当关闭RTTI时,像是一种推荐的实现自己数据的方式。至少这非常非常有效+1,正在研究Clang和LLVM,而主要研究Clang。这根本不是自动的,事实上这就是重点,因为只要不使用,就不会为此付费。LLVM和Clang是非常具体的项目,有非常具体的需求,对于大多数项目来说,简单的RTTI就足够了。–

除了getValueID不是虚拟的,但基类具有getValueID返回的BaseId类型的成员。

不知道在想什么,因为其中一个目标是完全摆脱虚拟指针。–

MostDerivedL1应该继承自DerivedLeft,更正了定义。也应该适用于基类,例如,派生到基的转换将负责将DerivedLeft*转换为base*,然后将使用base::classof(base const*)(并返回true)。将在Base中添加实现类,目前缺失。

 

 

参考文献了解

https://stackoverflow.com/questions/6038330/how-is-llvm-isa-implemented/

 

标签:LLVM,return,struct,Base,classof,指令,ISA
From: https://www.cnblogs.com/wujianming-110117/p/17045329.html

相关文章

  • 欧盟无线充CE​​​认证​​​CE-RED指令介绍
    欧盟关于无线遥控产品、通讯产品,必须符合RED指令(无线电及通讯终端指令)-1999/5/EC要求,最新无线电设备指令按照2014/53/EU要求(RED指令)。2016年开始强制执行。​RED指令所包括......
  • vue指令
    指令(1)表单绑定    v-model:双向绑定     多个checkbox,v-model="数组",:value=""     单个checkbox,v-model="布尔值"     应用:......
  • LLVM 指令与lowering代码结构
    LLVM指令与lowering代码结构LLVM 是一个很复杂的软件,了解LLVM的工作原理不是很容易,然而,对于刚开始接触LLVM整个框架的工作原理来说,详细而深入,不如广泛而浅显,所以有......
  • docker指令备忘
    菜鸟教程是个好地方拉取镜像:dockerpull镜像:tag启动容器(简单,放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是/bin/bash):dockerrun-it镜像名......
  • Vue中的内置指令
    1.v-text作用是:向其所在的节点中渲染文本内容//与插值语法的区别:v-text会替换掉节点中的全部数据{{xxx}}不会conststr='我是一个字符串'<divv-text='str'></div......
  • LLVM TableGen杂谈
    LLVMTableGen杂谈1.什么是tablegen tablegen是llvm用于开发和维护编译器中公共特性的条目(e.g.指令描述,寄存器描述)的代码,使之灵活的描述与构造的自动化工具.......
  • linux指令nmcli
    参见: https://blog.csdn.net/yulin003/article/details/125561203nmcli 是NetworkManager的命令行工具。nm代表 NetworkManager,cli代表Command-Line命令行。......
  • 38预处理器指令 知识点
    //什么是编译器//编译器是一种翻译程序//它用于将源语言程序翻译为目标语言程序//源语言程序:某种程序设计语言写成的,比如C#、C、C++、JAVA等语言写的程序//目标语言程......
  • linux指令df和du
    官方文档:https://www.gnu.org/software/coreutils/manual/html_node/df-invocation.html#df-invocation一、dfdf:Reportfilesystemspaceusaged:disk磁盘f:file......
  • Nginx的alias指令引发的漏洞
    前言一开始看到alias都不知道是什么,我们先来学习一下Nginx以其高性能著称,常用作前端反向代理服务器。同时nginx也是一个高性能的静态文件服务器。通常都会把应用的静态文......