LLVM编译器架构

LLVM概述

LLVM项目是模块化和可重用的编译器及工具链技术的集合。尽管名称如此,LLVM与传统虚拟机关系不大。名称“ LLVM”本身不是缩写。它是项目的全名。

LLVM最初是伊利诺伊大学的一个研究项目,目的是提供一种基于SSA的现代编译策略,该策略能够支持任意编程语言的静态和动态编译。从那时起,LLVM逐渐发展成为一个由多个子项目组成的总体项目,其中许多子项目已用于各种商业和开源项目的产品中,并广泛用于学术研究。LLVM项目中的代码已根据“具有LLVM例外的Apache 2.0许可”获得许可

LLVM的主要子项目是:

  1. LLVM内核库提供一个现代化的源代码与目标无关的优化,随着代码生成支持许多流行的CPU(以及一些不太常见的!),这些包都是围绕着建立以及指定被称为LLVM中间表示的代码表示(“ LLVM IR”)。LLVM核心库有充分的文档记录,特别容易发明自己的语言(或移植现有的编译器)以将LLVM用作优化器和代码生成器
  2. Clang是“ LLVM本机” C / C ++ / Objective-C编译器,旨在提供惊人的快速编译,极其有用的错误和警告消息,并为构建出色的源代码级工具提供平台。该Clang静态分析器clang-tidy工具,代码自动发现错误,而且是那种可以使用clang前端的库来解析C / C ++代码生成工具的很好的例子。
  3. LLDB项目建立在由LLVM和Clang提供了极大的机调试库。它使用Clang AST和表达式解析器,LLVM JIT,LLVM反汇编程序等,从而提供了一种“可行”的体验。在加载符号时,它还比GDB速度更快,存储效率更高。
  4. libc中++libc ++ ABI项目提供了一个标准的conformant和高性能执行的C ++标准库,包括C ++ 11和C ++ 14的全力支持。
  5. 当目标没有简短的本机指令序列来实现核心IR操作时,compiler-rt项目将对底层代码生成器支持示例(例如__fixunsdfdi)和其他调用进行高度优化的实现。它还为动态测试工具(例如AddressSanitizerThreadSanitizerMemorySanitizerDataFlowSanitizer)提供了运行时runtime库的实现 。
  6. MLIR子项目是一种新的方法来构建可重用和可扩展的编译架构。MLIR旨在解决软件碎片,改善异构硬件的编译,显着降低构建特定于域的编译器的成本以及帮助将现有编译器连接在一起的问题。
  7. OpenMP的子项目提供的OpenMP与在clang的OpenMP实现使用运行时间。
  8. polly工程实施缓存局部性优化,使用多面体模型套件以及自动并行和矢量化。
  9. libclc项目旨在实现的OpenCL标准库。

10. 该klee项目实现了“象征性的虚拟机”,它采用一个定理证明,试图评估在努力发现问题和证明的功能性,通过程序中的所有动态路径。Klee的一个主要功能是,它在检测到错误时可以生成一个测试用例。

11. 该LLD项目是一个新的链接。这是系统链接程序的直接替代,并且运行速度更快。

除了LLVM的官方子项目之外,还有许多其他项目将LLVM的组件用于各种任务。通过这些外部项目,可以使用LLVM来编译Ruby,Python,Haskell,Rust,D,PHP,Pure,Lua和许多其它语言。LLVM的主要优势在于它的多功能性,灵活性和可重用性,这就是为什么它被用于各种各样的任务:从轻量级JIT编译嵌入式语言(如Lua)到为大型超级电脑编译Fortran代码的原因。

LLVM拥有广泛而友好的社区,这些社区对构建出色的低级工具感兴趣。如果有兴趣参与其中,那么最好的方法是浏览LLVM博客并注册LLVM Developer邮件列表。有关如何发送补丁程序,获取提交访问权限以及版权和许可主题的信息,请参阅《 LLVM开发人员政策》

LLVM编译器架构的更多相关文章

  1. 编译器架构Compiler Architecture(下)

    编译器架构Compiler Architecture(下) Combining Scanning and Parsing 实际上没有必要将扫描(词法分析/标记化)与解析(语法分析/树生成)分开.基于P ...

  2. 编译器架构Compiler Architecture(上)

    编译器架构Compiler Architecture(上) 编译器是程序,通常是非常大的程序.它们几乎都有一个基于翻译分析综合模型的结构. CONTENTS Overview • Compiler C ...

  3. LLVM编译器

    LLVM 1. 说说 LLVM(Low Level Virtual Machine)到底是什么吧 先说编译器:编译器是把程序员的代码翻译成机器可以理解的语言的工具: 再谈 LLVM:一个模块化和可重用 ...

  4. cmake构建时指定编译器架构(x86 or x64)

    vs2015 x64编译器为例,cmake命令如下: cmake -G "Visual Studio 14 Win64" path\to\source\dir 去掉Win64,就是 ...

  5. LLVM与Clang的概述及关系

    LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time).链接时间(link-time).运行时间(run-time ...

  6. LLVM和clang

    LLVM编译器架构 LLVM项目是一套工具的集合,它包括模块化.可复用的编译器及一些列工具链技术. LLVM最开始是Low Level Virtual Machine的简称,但现在它并不是传统意义上的 ...

  7. 转:LLVM与Clang的概述及关系

    转:http://www.cnblogs.com/saintlas/p/5738739.html      LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言 ...

  8. iOS开发系列-LLVM、Clang

    LLVM LLVM计划启动于2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持开展. 我们可以认为LLVM是一个完整 ...

  9. 深入理解iOS开发中的BitCode功能

    前言 做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而 ...

随机推荐

  1. Linux中编写Shell脚本

    目录 Shell Shell脚本的执行 Shell脚本编写规范 Shell 中的变量 变量的算术运算 双小括号 (())  数值运算命令的用法 let 运算命令的用法 expr 命令的用法 br 命令 ...

  2. Windows Pe 第三章 PE头文件-EX-相关编程-1(PE头内容获取)

    获取pE头相关的内容,就是类似如下内容 原理:比较简单,直接读取PE到内存,然后直接强转就行了. #include <windows.h> #include <stdio.h> ...

  3. Openstack 虚拟机宽带限速

    修改Neutron配置文件,使其支持Qos 修改Neutron.conf service_plugins = neutron.services.qos.qos_plugin.QoSPlugin 修改p ...

  4. nginx 配置后页面访问是报500错

    该问题是html文件权限问题. 用jenkins 并远程服务器上传到另一台服务器的html ,在配置好nginx 的location  root 绝对位置后还是报错500 手工用root上传时访问正常 ...

  5. 如何实现一个 System Services?

    <Android 系统开发做什么?>写到 Android System Services 是专注于特定功能的模块化组件,应用框架 API 所提供的功能可与系统服务通信,以访问底层硬件.An ...

  6. Truncate用法详解

    前言: 当我们想要清空某张表时,往往会使用truncate语句.大多时候我们只关心能否满足需求,而不去想这类语句的使用场景及注意事项.本篇文章主要介绍truncate语句的使用方法及注意事项. 1.t ...

  7. 迷失在Mysql的锁世界~

    1.饮料 这是一杯饮料. 这是3杯饮料,每杯饮料的味道各不相同. 但是人类并不称呼[饮料]为[饮料],而是称呼[饮料]为[记录]. 2.红章鱼 这个红色的,长的像章鱼的家伙,我们就叫它红章鱼~ 红章鱼 ...

  8. Duplicate entry '' for key 'PRIMARY'

    今天在在mysql中插入数据 因为直接插入查询出来的表格,insert into 表(student_id,class_id) 直接插入了这两个字段对应的查询出来的表 没有留意到该表的主键没有设置自增 ...

  9. SQLFlow——一个强大的可视化SQL关系分析工具

    SQLFlow 摘要 本文主要介绍SQLFlow是什么,以及它的功能及使用场景 SQLFlow是什么 SQLFlow是一个可视化的在线处理SQL对象依赖关系的工具,只需要上传你的SQL脚本,它可以自动 ...

  10. mysql登录框注入绕过单引号匹配

    0x00 原理   网站使用正则匹配对用户名一栏传到服务器的参数进行了匹配,如果匹配到了单引号则报错 0x01 简单例子   当我们输入admin'时,网站直接报错,很有可能就是用了正则,这样我们也不 ...