欢迎光临澳大利亚新华书店网 [登录 | 免费注册]

    • LLVM编译器原理与实践/芯科技前沿技术丛书
      • 作者:编者:吴建明//吴一昊|责编:李晓波//马超
      • 出版社:机械工业
      • ISBN:9787111763543
      • 出版日期:2024/10/01
      • 页数:456
    • 售价:55.6
  • 内容大纲

        LLVM是伊利诺伊大学的一个研究项目,提供一个现代化的,基于SSA的编译策略,并能够同时支持静态和动态的任意编程语言的编译目标。LLVM由不同的子项目组成,其中许多是正在生产中使用的商业和开源的项目。它也被广泛用于学术研究。
        本书力求将LLVM基础知识理论与案例实践融合在一起进行详细的介绍,帮助读者理解LLVM工作原理,同时按照应用与设备需要,使用LLVM进行相应的优化与部署。本书包含大量示例和代码片段,帮助读者掌握LLVM的编译器开发环境。
        本书共11章,包括编译和安装LLVM、LLVM外部项目、LLVM编译器、Clang前端基础、Clang架构与实践示例、LLVM IR实践、LLVM芯片编译器实践示例、LLVM编译器示例代码分析、LLVM优化示例、LLVM后端实践,以及MLIR编译器。
        本书适合算法、软件、编译器、人工智能、硬件等专业方向的企业工程技术人员、高校师生、科研工作人员和技术管理人员阅读。
  • 作者介绍

        吴建明,上海交通大学模式识别与智能系统专业博士毕业。长期从事人工智能芯片设计,尤其擅长TVM/LLVM编译器、AI框架、自动驾驶、芯片制造,嵌入式系统等领域的理论研究与技术创新。长期在一线工作,包括产品设计与代码实现等,主持和参与过30多项产品的研发。还参与过国家自然科学基金、上海市科委项目,并在核心期刊公开发表过8篇论文,其中6篇是第一作者。
  • 目录

    前言
    第1章  编译和安装LLVM
      1.1  LLVM系统入门
        1.1.1  查看LLVM(包括Clang等子项目)
        1.1.2  配置和构建LLVM与Clang
      1.2  独立构建
      1.3  软硬件环境要求
        1.3.1  硬件环境
        1.3.2  软件环境
        1.3.3  主机C++编译器和标准库
        1.3.4  获取流行主机C++工具链
      1.4  LLVM入门
        1.4.1  术语和符号
        1.4.2  打开LLVM存档文件
        1.4.3  从Git中签出LLVM源代码
        1.4.4  本地LLVM配置
        1.4.5  编译LLVM套件源代码
        1.4.6  交叉编译LLVM
        1.4.7  LLVM目标文件的位置
        1.4.8  可选配置项目
      1.5  目录布局
      1.6  使用LLVM工具链的示例
      1.7  LLVM常见问题
      1.8  LLVM相关链接
    第2章  LLVM外部项目
      2.1  LLDB调试器
        2.1.1  LLDB基础知识
        2.1.2  LLDB控制台
      2.2  C++标准库libc
        2.2.1  libc++库概述
        2.2.2  Ubuntu下安装Clang和libc
      2.3  compiler-rt运行时库
        2.3.1  compiler-rt项目组成
        2.3.2  compiler-rt的作用
        2.3.3  平台支持
        2.3.4  compiler-rt源代码结构
        2.3.5  构建compiler-rt
      2.4  DragonEgg
        2.4.1  DragonEgg将LLVM作为GCC后端
        2.4.2  DragonEgg实践
      2.5  构建RISC-VLLVM并编译和运行test-suite
        2.5.1  构建RISC-V的前期准备
        2.5.2  开始构建
        2.5.3  编译test-suite
        2.5.4  运行LLVMtest-suite
      2.6  Clang附加工具
    第3章  LLVM编译器
      3.1  LLVM与Clang源代码的下载及编译
        3.1.1  下载并编译LLVM
        3.1.2  Clang源代码的下载与编译

      3.2  LLVM编译器基础结构
        3.2.1  LLVM工作原理
        3.2.2  LLVM的主要子项目
        3.2.3  LLVM与Clang语法
      3.3  LLVM三段式编译
        3.3.1  传统编译器三段式设计及其实现
        3.3.2  LLVM的三段式设计的实现
      3.4  LLVM与Clang架构
        3.4.1  LLVM与Clang架构简介
        3.4.2  编译架构特点分析
      3.5  LLVM与GCC的区别
      3.6  LLVMIR
        3.6.1  什么是LLVMIR
        3.6.2  LLVMIR编译流程
        3.6.3  如何得到IR
        3.6.4  IR文件链接
        3.6.5  IR文件编译流程
        3.6.6  IR语法中的关键字
      3.7  词法分析与语法分析
        3.7.1  词法分析
        3.7.2  AST结构分析
      3.8  交叉编译器
        3.8.1  主机与目标机
        3.8.2  为什么要交叉编译
        3.8.3  交叉编译难点
      3.9  后端开发
        3.9.1  XLA后端分析
        3.9.2  SSA问题分析
        3.9.3  目标信息代码分析
      3.10  LLVM示例实践
        3.10.1  如何在ARM上编译LLVM/Clang
        3.10.2  如何编写LLVMPass
        3.10.3  基于LLVM的依赖分析方案
      3.11  LLVM数据并行、时间并行和多核并行
    第4章  Clang前端基础
      4.1  编译器Clang会代替GCC吗
        4.1.1  GCC概述
        4.1.2  Clang概述
        4.1.3  GCC基本设计与示例
        4.1.4  GCC与Clang的区别
      4.2  使用Clang静态分析器进行分析调试
        4.2.1  静态分析器概述
        4.2.2  静态分析器库的结构
        4.2.3  静态分析器工作原理
        4.2.4  内部检查器
        4.2.5  关于Clang静态分析器
      4.3  如何进行编译时间混编优化
      4.4  Clang模块实现原理探究
        4.4.1  ModuleMap与Umbrella
        4.4.2  模块的构建

        4.4.3  Clang模块复用机制
        4.4.4  PCH与PCM文件
      4.5  使用Clang校验AST
        4.5.1  制作Clang命令行工具的初衷
        4.5.2  制作Clang命令行工具主要步骤
        4.5.3  环境搭建
        4.5.4  开发框架选择
        4.5.5  代码开发
      4.6  LLVM与Clang的底层原理
        4.6.1  传统编译器设计
        4.6.2  Clang前端
        4.6.3  IR的优化
        4.6.4  bitcode
        4.6.5  编译流程总结示例
      4.7  自定义Clang命令,利用LLVMPass实现对Objective-C函数的静态插桩
        4.7.1  Objective-C中的常见的函数hook实现思路
        4.7.2  什么是LLVMPass
        4.7.3  编译过程
      4.8  指令系统
        4.8.1  指令系统概述
        4.8.2  指令格式
        4.8.3  指令的寻址方式
        4.8.4  指令的类型与功能
        4.8.5  CISC和RISC的比较
    第5章  Clang架构与实践示例
      5.1  C语言编译器Clang
        5.1.1  Clang和GCC编译器架构
        5.1.2  Clang起源
      5.2  Clang模块内部实现原理及源代码分析
        5.2.1  编译参数分析
        5.2.2  预处理
      5.3  好用的代码检查工具
      5.4  Clang在Objective-C中的使用
        5.4.1  终端使用特点
        5.4.2  Clang的简单使用
      5.5  Clang重排对象类结构分析
        5.5.1  概述
        5.5.2  根类、超类、子类
      5.6  使用Clang编译C程序并在安卓设备中执行
      5.7  分析Swift高效的原因
        5.7.1  Swift的函数派发机制
        5.7.2  结构体定义的内存分配
        5.7.3  编译SIL
        5.7.4  Clang编译流程的缺点
        5.7.5  Swift的特点及其编译器的使用流程
      5.8  LLVM中矩阵的实现分析
        5.8.1  背景说明
        5.8.2  功能实现
        5.8.3  举例说明
    第6章  LLVMIR实践

      6.1  LLVM架构简介
        6.1.1  LLVMIR的演变
        6.1.2  LLVMIR是什么
        6.1.3  LLVM架构
        6.1.4  前端生成中间代码
        6.1.5  LLVM后端优化IR
        6.1.6  LLVM后端生成汇编代码
      6.2  获取LLVMIR
        6.2.1  LLVMIR的三种形式
        6.2.2  LLVMIR结构
        6.2.3  标识符与变量
      6.3  LLVMIR实践——Helloworld
        6.3.1  LLVMIR程序设计方法概述
        6.3.2  最基本的程序
        6.3.3  基本概念解释
        6.3.4  主程序
      6.4  LLVMIR数据表示
        6.4.1  汇编层次的数据表示
        6.4.2  LLVMIR中的数据表示
        6.4.3  链接类型
        6.4.4  可见性
        6.4.5  寄存器
      6.5  LLVMIR类型系统
        6.5.1  类型系统
        6.5.2  元数据类型
        6.5.3  属性
      6.6  LLVMIR控制语句
        6.6.1  汇编语言层面的控制语句
        6.6.2  LLVMIR层面的控制语句
      6.7  LLVMIR语法链接类型
      6.8  LLVMIR函数
        6.8.1  定义与声明
        6.8.2  传递参数与获得返回值
        6.8.3  内置函数、属性和元数据
      6.9  LLVMIR异常处理
        6.9.1  异常处理的要求
        6.9.2  LLVMIR的异常处理
        6.9.3  怎么抛
        6.9.4  怎么接
    第7章  LLVM芯片编译器实践示例
      7.1  编译器基本概念
        7.1.1  LLVM的模块化编译器框架
        7.1.2  前端在干什么
        7.1.3  后端在干什么
        7.1.4  DAG下译
        7.1.5  DAG合法化
        7.1.6  小结
      7.2  从无到有开发
        7.2.1  不必从头开始开发
        7.2.2  需要添加的文件类型

        7.2.3  从文件角度看整体框架
        7.2.4  从类继承与派生角度看整体框架
      7.3  芯片的整体架构部分
        7.3.1  ×××.h类文件
        7.3.2  ×××.td类文件
        7.3.3  ×××TargetMachine.cpp和×××TargetMachine.h类文件
        7.3.4  ×××MCTargetDesc类文件
        7.3.5  ×××baseInfo类文件
        7.3.6  ×××TargetInfo类文件
        7.3.7  ×××Subtarget类文件
        7.3.8  几个容易混淆的概念
        7.3.9  小结
      7.4  寄存器信息
        7.4.1  ×××Registerinfo.td类文件
        7.4.2  ×××RegisterInfo类文件
        7.4.3  ×××SERegisterinfo类文件
      7.5  指令描述的.td文件
        7.5.1  ×××InstrFormats.td类文件
        7.5.2  ×××InstrInfo.td类文件
        7.5.3  依次定义指令
        7.5.4  定义指令的自动转换
        7.5.5  小结
      7.6  指令描述的.cpp文件
        7.6.1  ×××InstrInfo.cpp(.h)类文件
        7.6.2  ×××SEInstrInfo.cpp(.h)类文件
        7.6.3  ×××AnalyzeImmediate.cpp(.h)类文件
    第8章  LLVM编译器示例代码分析
      8.1  建立编译器的基础框架
      8.2  使用LLVM实现一个简单编译器
        8.2.1  目标
        8.2.2  词法分析
        8.2.3  语法分析
        8.2.4  LLVMIR的代码生成
        8.2.5  优化器
        8.2.6  添加JIT编译器
        8.2.7  静态单一赋值
        8.2.8  控制流
        8.2.9  用户自定义操作符
        8.2.10  可变变量
    第9章  LLVM优化示例
      9.1  LLVM优化示例介绍
        9.1.1  编译器优化目标
        9.1.2  LLVM优化Pass如何工作
        9.1.3  聚集对象的标量替换
        9.1.4  公共子表达式消除
        9.1.5  全局变量优化器
        9.1.6  指令合并器
      9.2  改进优化条件
        9.2.1  偏转循环移动代码
        9.2.2  运行规范化自然循环

        9.2.3  归纳变量简化
        9.2.4  进行比特追踪死代码消除
      9.3  链接时优化
        9.3.1  LTO基本概念
        9.3.2  LTO优化处理
        9.3.3  linkmap分析
      9.4  NutshellLLVMLTO
        9.4.1  ThinLTO
        9.4.2  高度并行的前端处理和初始优化
      9.5  LLVM完全LTO
        9.5.1  LLVM完全LTO的目标
        9.5.2  LLD的整个执行流程
      9.6  LLVM核心类简明示例
    第10章  LLVM后端实践
      10.1  LLVM后端概述
        10.1.1  LLVM后端基本概念
        10.1.2  使用Cpu0作为硬件的例子
      10.2  LLVM新后端初始化和软件编译
        10.2.1  新后端初始化和软件编译
        10.2.2  LLVM代码结构
        10.2.3  Cpu0后端初始化
        10.2.4  LLVM后端结构
        10.2.5  增加AsmPrinter
        10.2.6  增加DAGToDAGISel
        10.2.7  增加Prologue和Epilogue部分代码
        10.2.8  操作数模式
        10.2.9  小结
      10.3  算术和逻辑运算指令
        10.3.1  算术运算指令
        10.3.2  逻辑运算指令
      10.4  生成目标文件
        10.4.1  简要说明
        10.4.2  文件新增
        10.4.3  文件修改
        10.4.4  检验成果
      10.5  全局变量
        10.5.1  全局变量编译选项
        10.5.2  代码修改
        10.5.3  检验成果
        10.5.4  小结
      10.6  更多数据类型
        10.6.1  实现类型
        10.6.2  代码修改
        10.6.3  检验成果
      10.7  控制流
        10.7.1  控制流语句
        10.7.2  消除无用的JMP指令
        10.7.3  填充跳转延迟槽
        10.7.4  条件MOV指令
      10.8  函数调用

        10.8.1  栈帧结构
        10.8.2  传入参数
        10.8.3  函数调用优化
      10.9  ELF文件支持
        10.9.1  ELF文件
        10.9.2  支持反汇编
      10.10  汇编
        10.10.1  栈帧管理
        10.10.2  汇编器
        10.10.3  内联汇编
      10.11  使用仿真器验证编译器
        10.11.1  运行仿真器
        10.11.2  小结
    第11章  MLIR编译器
      11.1  MLIR语言参考
        11.1.1  高层结构
        11.1.2  MLIR符号
        11.1.3  MLIR作用域
        11.1.4  控制流和SSACFG作用域
        11.1.5  类型系统
        11.1.6  方言类型
      11.2  MLIR方言及运行分析
        11.2.1  MLIR简介
        11.2.2  常见的IR表示系统
        11.2.3  MLIR的提出
      11.3  方言及运行详解
        11.3.1  方言
        11.3.2  运行结构拆分
        11.3.3  创建新的方言操作
        11.3.4  将方言加载到MLIRContext中
        11.3.5  定义操作
        11.3.6  创建方言流程总结(使用ODS)
      11.4  MLIR运算与算子
        11.4.1  MLIR运算与算子概述
        11.4.2  运算类(Operation)
        11.4.3  算子类(Op)
        11.4.4  MLIROpBase.td算子类的作用
        11.4.5  MLIR运算的构建过程
        11.4.6  MLIRTableGen后端生成算子代码
      11.5  MLIR的缘起
      11.6  MLIR部署
        11.6.1  MLIR部署流程
        11.6.2  MLIR应用
      11.7  MLIR介绍
      11.8  MLIR基本数据结构
        11.8.1  MLIR源代码目录
        11.8.2  MLIR简易UML类图
        11.8.3  开发中用到的具体数据结构
      11.9  MLIR的出现背景与提供的解决方案
        11.9.1  概述

        11.9.2  解决方案
      11.10  机器学习编译器:MLIR方言体系
        11.10.1  基础组件
        11.10.2  方言体系
    参考文献