美文网首页
LLVM基础

LLVM基础

作者: 伶俐ll | 来源:发表于2018-08-14 20:50 被阅读52次

LLVM简介

  • LLVM项目是模块化、可重用的编译器以及工具链技术的集合
  • 美国计算机协会 (ACM) 将其2012 年软件系统奖项颁给了LLVM,之前曾经获得此奖项的软件和技术包括:Java、Apache、 Mosaic、the World Wide Web、Smalltalk、UNIX、Eclipse等等
  • 创始人Chris Lattner,亦是Swift之父
  • 有些文章把LLVM当做Low Level Virtual Machine(低级虚拟机)的缩写简称,官方描述如下 The name "LLVM" itself is not an acronym; it is the full name of the project. “LLVM”这个名称本身不是首字母缩略词; 它是项目的全名。

传统的编译器架构

传统的编译器架构.png

LLVM架构

LLVM架构.png
  • 不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)
  • 如果需要支持一种新的编程语言,那么只需要实现一个新的前端
  • 如果需要支持一种新的硬件设备,那么只需要实现一个新的后端
  • 优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改
  • 相比之下,GCC的前端和后端没分得太开,前端后端耦合在了一起。所以GCC为了支持一门新的语言,或者为了支持一个新的目标平台,就 变得特别困难
  • LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族、Java、.NET、Python、Ruby、Scheme、Haskell、D等)

Clang

什么是Clang?

  • Clang是LLVM项目的一个子项目,是基于LLVM架构的C/C++/Objective-C编译器前端
  • 官网:http://clang.llvm.org/
  • 相比于GCC,Clang具有如下优点:
    • 编译速度快:在某些平台上,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GGC快3倍)
    • 占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右
    • 模块化设计:Clang采用基于库的模块化设计,易于 IDE 集成及其他用途的重用
    • 诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告
    • 设计清晰简单,容易理解,易于扩展增强

Clang与LLVM

Clang与LLVM编译器.png

OC源文件的编译过程

  • 命令行查看编译的过程:$ clang -ccc-print-phases main.m
    0: input, "main.m", objective-c
    1: preprocessor, {0}, objective-c-cpp-output
    2: compiler, {1}, ir
    3: backend, {2}, assembler
    4: assembler, {3}, object
    5: linker, {4}, image
    6: bind-arch, "x86_64", {5}, image
    
    过程解析:
    0、找到源代码main.m文件
    1、预处理器,将#import""#include<>#define等替换
    2、编译器编译成ir中间代码
    3、交给后段生成汇编
    4、交给后段生成目标代码
    5、链接动态库等
    6、支持某一个架构的机器语言
  • 查看preprocessor(预处理)的结果:$ clang -E main.m
    预处理前OC代码:
    #define Age 40
    int main(int argc, const char * argv[]) {
        int a = 10;
        int b = 20;
        int c = a + b + Age;
        return 0;
    }
    
    预处理后结果:
    int main(int argc, const char * argv[]) {
        int a = 10;
        int b = 20;
        int c = a + b + 40;
        return 0;
    }
    

词法分析

生成Token: $ clang -fmodules -E -Xclang -dump-tokens main.m

语法树-AST

语法分析,生成语法树(AST,Abstract Syntax Tree): $ clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

LLVM IR

  • LLVM IR有3种表示形式(但本质是等价的,就好比水可以有气体、液体、固体3种形态)
    • text:便于阅读的文本格式,类似于汇编语言,拓展名.ll, $ clang -S -emit-llvm main.m
    • memory:内存格式
    • bitcode:二进制格式,拓展名.bc, $ clang -c -emit-llvm main.m
      ir.png

GCC
LLVM
Clang

相关文章

  • LLVM基础

    LLVM简介 LLVM项目是模块化、可重用的编译器以及工具链技术的集合 美国计算机协会 (ACM) 将其2012 ...

  • ClangFormat-Xcode配置

    你的项目基于的基础样式,我的项目是基于LLVM的 BaseOnStyle: LLVM 缩进宽度 IndentWid...

  • 基于LLVM的思考

    最近在看LLVM相关代码,产生了一点思考。 LLVM是编译器的基础设施,苹果的Xcode编译系统就是以LLVM展开...

  • 30.iOS底层学习之LLVM初了解

    本篇提纲1、LLVM简介2、编译器的一些基础知识 1.LLVM简介 基本介绍 LLVM是架构编译器的框架系统,以c...

  • LLVM

    LLVM 什么是LLVM? 官网:https://llvm.org/ The LLVM Project is a ...

  • xcode9.2 集成obfuscator-llvm-6.0.0

    一、理论基础 1、iOS Hacker obfuscator-llvm Xcode集成配置 https://m.a...

  • iOS_LLVM

    LLVM 官网:https://llvm.org/[https://llvm.org/] The LLVM Pro...

  • iOS 逆向 day 18 GCC LLVM Clang

    一、LLVM 1. 什么是 LLVM 官网:https://llvm.org/ The LLVM Project ...

  • 浅谈LLVM

    何为LLVM 在LLVM的官网(https://llvm.org/[https://llvm.org/])中写到T...

  • iOS逆向-day10:LLVM 编译器

    一、LLVM的简单介绍 1.1、什么是LLVM官网:https://llvm.org/LLVM官网解释:The L...

网友评论

      本文标题:LLVM基础

      本文链接:https://www.haomeiwen.com/subject/eyovbftx.html