扩展LLVM:添加指令、内部函数、类型等

  1. Introduction and Warning
  2. Adding a new intrinsic function
  3. Adding a new instruction
  4. Adding a new SelectionDAG node
  5. Adding a new type
    1. Adding a new fundamental type
    2. Adding a new derived type

Introduction and Warning

在使用LLVM的过程中,可能希望为研究项目或实验定制它。此时,可能意识到需要向LLVM添加一些内容,不管是新的基本类型、新的内在函数还是全新的指令。

当意识到这一点时,停下来想想。真的需要扩展LLVM吗?它是LLVM在其当前化身中不支持的一个新的基本功能,还是可以从已经存在的LLVM元素合成它?如果不确定,询问LLVM dev列表。原因是,扩展LLVM将涉及到更新所有不同的传递,使用扩展,并且有许多LLVM分析和转换,所以这可能是相当多的工作。

添加内部函数比添加指令容易得多,并且对优化过程是透明的。如果添加的功能可以表示为函数调用,则内部函数是LLVM扩展的首选方法。

在投入大量的精力在一个非常重要的扩展上之前,先问一下想要做的事情是否可以用已经存在的基础架构来完成,或者也许其他人已经在做了。这样做会节省很多时间和精力。

Adding a new intrinsic function

向LLVM添加一个新的内部函数比添加一个新的指令要容易得多。几乎所有对LLVM的扩展都应该从一个内在函数开始,然后在有必要的情况下转换为指令。

llvm/docs/LangRef.html:记录内部。确定它是否特定于代码生成器,以及限制是什么。

llvm/include/llvm/Intrinsics*.td:为内在函数添加一个条目。描述它的内存访问特性以进行优化(控制它是否是DCE'd、CSE'd等)。请注意,tblgen将llvm_int_ty type用于参数的任何内在函数,都将被tblgen视为重载,并且在内部函数的名称上需要相应的后缀。              llvm/lib/Analysis/ConstantFolding.cpp:如果可以常量折叠内部函数,请在canConstantFoldCallTo和ConstantFoldCall函数中添加对它的支持。

llvm/test/Regression/*:将测试用例添加到测试套件中

一旦内在函数被添加到系统中,就必须为其添加代码生成器支持。

通常必须执行以下步骤:

在lib/Target/CBackend中添加对C后端的支持/

根据内在特性,有几种方法可以实现这一点。对于大多数intrinsic,在llib/CodeGen/IntrinsicLowering.cpp的LowerIntrinsicCall中添加代码来降低内部函数是有意义的。

第二,在所有情况下将内部代码降低到扩展的C代码序列是有意义的,那么只需在Writer.cpp中的visitCallist中发出。如果内在函数有某种方式可以用GCC(或任何其它编译器)扩展来表示,那么可以根据编译CBE输出的编译器来有条件地支持它(参见llvm.prefetch示例)。

第三,如果内在函数真的没有降低的方法,只需让代码生成器发出打印错误消息的代码,并在执行时调用abort。

将选择的目标文件lib/Target/*/*.td添加到目标文件中。

通常是向.td文件中添加一个与内在模式匹配的模式的问题,尽管很明显,可能还需要添加要生成的指令。在PowerPC和X86后端中有许多示例可以遵循。

Adding a new SelectionDAG node

与内部函数一样,向LLVM添加一个新的SelectionDAG节点比添加一个新的指令要容易得多。通常会添加新节点来帮助表示多个目标通用的指令。这些节点通常映射到LLVM指令(add,sub)或内在(byteswap,population count)。在其他情况下,添加了新的节点以允许许多目标执行一个共同的任务(在浮点和整数表示之间转换)或在单个节点中捕获更复杂的行为(旋转)。

include/llvm/CodeGen/SelectionDAGNodes.h:为新的SelectionDAG节点添加枚举值。

lib/CodeGen/SelectionDAG/SelectionDAG.cpp:添加代码以将节点打印到getOperationName。如果在给定常量参数时可以在编译时对新节点求值(例如用另一个常量添加一个常量),请找到接受适当数量参数的getNode方法,并将节点的大小写添加到switch语句中,该语句对采用与新节点相同数量参数的节点执行常量折叠。

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:根据需要添加代码以使节点合法化、升级和扩展。需要在LegalizeOp中为节点添加case语句,该语句将对节点的算子调用LegalizeOp,并在任何算子因合法化而更改时返回新节点。可能并非SelectionDAG框架支持的所有目标都会在本机支持新节点。在这种情况下,还必须在LegalizeOp中的节点case语句中添加代码,以便将节点扩展为更简单、合法的操作。将余数展开为除法、乘法和减法的ISD::UREM就是一个很好的例子。

Adding a new instruction

警告:添加指令会更改位码格式,需要一些努力才能保持与以前版本的兼容性。只有在绝对必要时才添加指令。

l  llvm/include/llvm/Instruction.def: add a number for your instruction and an enum name为指令添加数字和枚举名称

l  llvm/include/llvm/Instructions.h: add a definition for the class that will represent your instruction为将表示指令的类添加定义

l  llvm/include/llvm/Support/InstVisitor.h: add a prototype for a visitor to your new instruction type为新的指令类型添加访问者原型

l  llvm/lib/AsmParser/Lexer.l: add a new token to parse your instruction from assembly text file添加一个新的标记来解析程序集文本文件中的指令

l  llvm/lib/AsmParser/llvmAsmParser.y: add the grammar on how your instruction can be read and what it will construct as a result添加语法,说明如何读取指令以及它将作为结果构造什么

l  llvm/lib/Bitcode/Reader/Reader.cpp: add a case for your instruction and how it will be parsed from bitcode为指令添加大小写,以及如何从位代码解析它

l  llvm/lib/VMCore/Instruction.cpp: add a case for how your instruction will be printed out to assembly添加一个案例,说明如何将指令打印到程序集

l  llvm/lib/VMCore/Instructions.cpp: implement the class you defined in llvm/include/llvm/Instructions.h实现在llvm/include/llvm/Instructions.h中定义的类

l  测试你的指令

l  Test your instruction

l  llvm/lib/Target/*: Add support for your instruction to code generators, or add a lowering pass. 向代码生成器添加对指令的支持,或添加降低传递。

l  llvm/test/Regression/*: add your test cases to the test suite. 将测试用例添加到测试套件中。

Adding a new type

警告:添加新类型会更改位码格式,并将破坏与当前现有LLVM安装的兼容性。只有在绝对必要时才添加新类型。

Adding a fundamental type

l  llvm/include/llvm/Type.h: add enum for the new type; add static Type* for this type

l  llvm/lib/VMCore/Type.cpp: add mapping from TypeID => Type*; initialize the static Type*

l  llvm/lib/AsmReader/Lexer.l: add ability to parse in the type from text assembly

l  llvm/lib/AsmReader/llvmAsmParser.y: add a token for that type

Adding a derived type

l  llvm/include/llvm/Type.h: add enum for the new type; add a forward declaration of the type also

l  llvm/include/llvm/DerivedTypes.h: add new class to represent new class in the hierarchy; add forward declaration to the TypeMap value type

l  llvm/lib/VMCore/Type.cpp: add support for derived type to:

l  std::string getTypeDescription(const Type &Ty,

l    std::vector<const Type*> &TypeStack)

l  bool TypesEqual(const Type *Ty, const Type *Ty2,

l    std::map<const Type*, const Type*> & EqTypes)

  1. add necessary member functions for type, and factory methods

l  llvm/lib/AsmReader/Lexer.l: add ability to parse in the type from text assembly

l  llvm/lib/BitCode/Writer/Writer.cpp: modify void BitcodeWriter::outputType(const Type *T) to serialize your type

l  llvm/lib/BitCode/Reader/Reader.cpp: modify const Type *BitcodeReader::ParseType() to read your data type

l  llvm/lib/VMCore/AsmWriter.cpp: modify

void calcTypeName(const Type *Ty,

std::vector<const Type*> &TypeStack,

std::map<const Type*,std::string> &TypeNames,

std::string & Result)

to output the new derived type

扩展LLVM:添加指令、内部函数、类型等的更多相关文章

  1. 编写高质量代码改善C#程序的157个建议——建议101:使用扩展方法,向现有类型“添加”方法

    建议101:使用扩展方法,向现有类型“添加”方法 考虑如何让一个sealed类型具备新的行为.以往我们会创建一个包装器类,然后为其添加方法,而这看上去一点儿也不优雅.我们也许会考虑修改设计,直接修改s ...

  2. [Swift通天遁地]五、高级扩展-(7)UIView(视图类型)的各种扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. 使用logisim搭建单周期CPU与添加指令

    使用logisim搭建单周期CPU与添加指令 搭建 总设计 借用高老板的图,我们只需要分别做出PC.NPC.IM.RF.EXT.ALU.DM.Controller模块即可,再按图连线,最后进行控制信号 ...

  4. .添加索引和类型,同时设定edgengram分词和charsplit分词

    1.添加索引和类型,同时设定edgengram分词和charsplit分词 curl -XPUT 'http://127.0.0.1:9200/userindex/' -d '{   "se ...

  5. SharePoint 2013中的默认爬网文件扩展名和分析文件类型

    摘要:了解默认情况下 SharePoint 2013 爬网的文件扩展名及其解析的文件类型,可以借此了解搜索可以爬的文件和支持的功能. 如果“管理文件类型”页上的列表包含文件扩展名,爬网组件将仅爬网文件 ...

  6. 如何扩展或者添加硬盘给VMware的Linux操作系统

    我们在使用Linux系统一段时间以后,可能添加的东西原来越多导致原来开辟的硬盘不够,当硬盘剩余空间过小时Ubuntu系统也会给出提示或者可以通过df  -hl命令查看你硬盘使用情况如下图所示:我已经用 ...

  7. IIS - 无后缀(无扩展名)的MIME类型配置

    添加一个新的 MIME 类型即可. 文件扩展名:. MIME类型:application/octet-stream

  8. 用ext_skel,实现一个PHP扩展,添加到PHP并调用

    1 创建函数定义文件 #mkdir /home/phpext #vi mydefined.skel string get_text(string str) 2 根据README所提供的信息创建预定义文 ...

  9. ExtJS 4.2 Date组件扩展:添加清除按钮

    ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...

随机推荐

  1. 【vue环境】vue : 无法加载文件 C:\Users\1111111\AppData\Roaming\npm\vue.ps1,因为在此系统禁止运行脚本

    在用脚手架搭建vue项目时,提示:无法加载文件 C:\Users\1111111\AppData\Roaming\npm\vue.ps1,因为在此系统禁止运行脚本 这是你笔记本禁止运行脚本,解决办法 ...

  2. hdu4756 最小树+树形dp

    题意:       给你一个完全图,让你在上面找到一颗最小树,然后问破坏这个最小树的某一条边后用其他边连接(要求最小)成新的树,然后输出破坏每一条边后最小树中最大的那个. 思路:       先跑出一 ...

  3. 【python】Leetcode每日一题-位1的个数

    [python]Leetcode每日一题-位1的个数 [题目描述] 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 示例1 ...

  4. Docker 搭建一个多端同步网盘-Nextcloud

    hub 官网

  5. 【mybatis】mybaits generator 逆向工程的使用

    mybatis逆向工程官方网站:http://www.mybatis.org/generator/quickstart.html 准备xml文件.如下generator.xml全部内容 <?xm ...

  6. 【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

    Arthas是啥 当我们系统遇到JVM或者内存溢出等问题的时候,如何对我们的程序进行有效的监控和排查,就发现了几个比较常用的工具,比如JDK自带的 jconsole.jvisualvm还有一个最好用的 ...

  7. 【Docker】2. Docker的架构介绍、安装与卸载 (CentOS 7)

    一.docker的基本组成 开局一张图. docker的组成: Client:客户端,可以通过它与docker服务进行交互.比如容器的构建.拉取.运行. DOCKER_HOST:就是docker服务. ...

  8. 在Visual Studio 中使用git——文件管理-下(六)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  9. C++ primer plus读书笔记——第9章 内存模型和名称空间

    第9章 内存模型和名称空间 1. 头文件常包含的内容: 函数原型. 使用#define或const定义的符号常量. 结构声明. 类声明. 模板声明. 内联函数. 2. 如果文件名被包含在尖括号中,则C ...

  10. [Java] GUI编程基础 绘图

    库 swing awt 过程 创建窗口JFrame JFrame-->MenuBar-->Container 屏幕坐标系:左上角为原点 Graphics2D Main.java 1 imp ...