COSCUP2016 - LLVM框架、由淺入淺

62
LLVM框架、由淺淺 浪打、Hydai

Transcript of COSCUP2016 - LLVM框架、由淺入淺

Page 1: COSCUP2016 - LLVM框架、由淺入淺

LLVM框架、由淺⼊入淺浪打、Hydai

Page 2: COSCUP2016 - LLVM框架、由淺入淺

Speakers$ whoami

Page 3: COSCUP2016 - LLVM框架、由淺入淺

楊宗凡 — 浪打 ‣ 成功⼤大學電機系四年級 ‣ sonic.tw.tp (at) gmail.com

戴宏穎 — Hydai ‣ 清華⼤大學資⼯工碩⼀一年級 ‣ z54981220 (at) gmail.com

Page 4: COSCUP2016 - LLVM框架、由淺入淺

Github Repos:https://github.com/sonicyang/ws-frontend

https://github.com/sonicyang/llvm-z80

Page 5: COSCUP2016 - LLVM框架、由淺入淺

Code to Executable$ gcc helloworld.c

Page 6: COSCUP2016 - LLVM框架、由淺入淺

#include <stdio.h> int main(int argc, char* argv[]){ puts(“Hello World!”); return 0; }

In C

Hello World!print “Hello World!”

In Python

Hello World!

魔法 我想學魔法!

Page 7: COSCUP2016 - LLVM框架、由淺入淺

The Magic

原始碼 組合語⾔言 機械碼

AssemblerCompiler

print “!@#$” mov d, msg$ mov c, 9

call 5

110100….

>./hw機械碼

110100….

Hello World!

Page 8: COSCUP2016 - LLVM框架、由淺入淺

Compiler

原始碼

組合語⾔言

Lex Parse

Token Stream

轉譯AST

Page 9: COSCUP2016 - LLVM框架、由淺入淺

bdos equ 0005H start: mvi c,9 lxi d,msg$ call bdos ret msg$: db 'Hello, world!$' end start

Intel 8080

AssemblerMSG: .ASCIIZ "Hello, world!" LDX #0 LDA MSG,X @LP: JSR $FFD2 INX LDA MSG,X BNE @LP RTS

MOS 6502

8080 Assemble

6502 Assemble

110110.. 010111..

CP/M Apple Dos

Page 10: COSCUP2016 - LLVM框架、由淺入淺

PerlPython

JavaC

Ruby

Javascript

他們都造⾃自⼰己的輪⼦子 對應不同的機器

IA-32 AMD64

IA-64 Arch32

AArch64Sun Sparc

Page 11: COSCUP2016 - LLVM框架、由淺入淺

Compiler

原始碼

組合語⾔言

Lex Parse

Token Stream

轉譯AST

Page 12: COSCUP2016 - LLVM框架、由淺入淺

Modern Compiler$ export CFLAGS = “-O3”

Page 13: COSCUP2016 - LLVM框架、由淺入淺

Modern Wheel

原始碼

組合語⾔言

Lex Yacc

AST

演算法

中介語⾔言

轉譯

Page 14: COSCUP2016 - LLVM框架、由淺入淺

三階段編譯流程

原始碼

Backend

組合語⾔言

OptimizerFrontend

Page 15: COSCUP2016 - LLVM框架、由淺入淺

Copy Propagation

Page 16: COSCUP2016 - LLVM框架、由淺入淺

Constant Propagation

Page 17: COSCUP2016 - LLVM框架、由淺入淺

Constant Folding

Page 18: COSCUP2016 - LLVM框架、由淺入淺

Dead Code Elimination(1)

Page 19: COSCUP2016 - LLVM框架、由淺入淺

Dead Code Elimination(2)

Page 20: COSCUP2016 - LLVM框架、由淺入淺

三階段編譯流程

原始碼

Backend

組合語⾔言

OptimizerFrontend

Page 21: COSCUP2016 - LLVM框架、由淺入淺

Python的故事

Python

組合語⾔言

Interpreter

C Code GCC

Page 22: COSCUP2016 - LLVM框架、由淺入淺

LLVM Framework$ git clone http://llvm.org/git/llvm.git

Page 23: COSCUP2016 - LLVM框架、由淺入淺

三階段編譯流程

原始碼

Backend

組合語⾔言

OptimizerFrontend

Page 24: COSCUP2016 - LLVM框架、由淺入淺

IR

LLVM Framework - Front End

原始碼 Backend 組合語⾔言Frontend

IRPass IR Pass … Pass IR Pass

Page 25: COSCUP2016 - LLVM框架、由淺入淺

IR

LLVM Framework - Optimizer

原始碼 Backend 組合語⾔言Frontend

IRPass IR Pass … Pass IR Pass

Page 26: COSCUP2016 - LLVM框架、由淺入淺

IR

LLVM Framework - Back End

原始碼 Backend 組合語⾔言Frontend

IRPass IR Pass … Pass IR Pass

Page 27: COSCUP2016 - LLVM框架、由淺入淺

模組化的開發

原始碼

Backend

組合語⾔言

OptimizerFrontend

LLVM IR

Page 28: COSCUP2016 - LLVM框架、由淺入淺

Front End$ clang -S -emit-llvm main.c

Page 29: COSCUP2016 - LLVM框架、由淺入淺

以下使⽤用 Whitespace 語⾔言

Page 30: COSCUP2016 - LLVM框架、由淺入淺

Hello, world!

Page 31: COSCUP2016 - LLVM框架、由淺入淺

Hello, world(syntax hl)

Page 32: COSCUP2016 - LLVM框架、由淺入淺

Whitespace 簡介

• 只有三種 Tokens:

• Space 空⽩白(' ')

• Tabs 制表符(\t)

• New lines 換⾏行(\n)

• 其餘的字元全部都被當成註解

Page 33: COSCUP2016 - LLVM框架、由淺入淺

Front End to IR

程式碼 LLVM IR

Page 34: COSCUP2016 - LLVM框架、由淺入淺

Front End to IR

程式碼 LLVM IRParser LLVM API

• Module • IRBuilder • Function • BasicBlock • Instruction

Page 35: COSCUP2016 - LLVM框架、由淺入淺

LLVM IR$ cat main.ll

Page 36: COSCUP2016 - LLVM框架、由淺入淺

LLVM IR

• RISC-style (Reduced Instruction Set Computing)

• ⼈人類可讀的

• 具備 SSA form (Static Single Assignment)

• 無限多的虛擬暫存器 • 任意位元⼤大⼩小

• 不改變⾏行為下 Transform IR ,來做最佳化。

Page 37: COSCUP2016 - LLVM框架、由淺入淺

C to IR

Page 38: COSCUP2016 - LLVM框架、由淺入淺
Page 39: COSCUP2016 - LLVM框架、由淺入淺

int  a  =  1;

Page 40: COSCUP2016 - LLVM框架、由淺入淺

int  c  =  a+b;

Page 41: COSCUP2016 - LLVM框架、由淺入淺

Optimizer

• LLVM 使⽤用 opt 做最佳化

• 每⼀一種類的分析跟轉換的 pass 都是 opt 的參數

• opt 會照順序幫你⼀一個⼀一個⾛走過這些 pass

• 每個 pass 會⾃自⼰己決定要不要做事

Page 42: COSCUP2016 - LLVM框架、由淺入淺

opt 剛才的 C Code

Page 43: COSCUP2016 - LLVM框架、由淺入淺

Backend$ llc -march=z80 main.ll

Page 44: COSCUP2016 - LLVM框架、由淺入淺

Basic Ideas

LLVM IR 組合語⾔言

Page 45: COSCUP2016 - LLVM框架、由淺入淺

Basic Ideas

SelectionDAGLLVM IR 組合語⾔言

•Combining •Legalizing •Scheduling •Register Allocation

Page 46: COSCUP2016 - LLVM框架、由淺入淺

What’s a DAG?

Page 47: COSCUP2016 - LLVM框架、由淺入淺

llvm::SelectionDAGISel

LLVM IR 組合語⾔言

Original DAG

Combined DAG

Legalized DAG

Target Legalizing

DAG Combiner

Instruction Selection

TableGen

Page 48: COSCUP2016 - LLVM框架、由淺入淺

llvm::SelectionDAGISel

LLVM IR 組合語⾔言

Original DAG

Combined DAG

Legalized DAG

Target Legalizing

DAG Combiner

Instruction Selection

TableGen

Page 49: COSCUP2016 - LLVM框架、由淺入淺

TableGen

組譯器

反組譯器

編譯器

除錯器

Target CPU

暫存器

指令格式

指令

代表A

代表B

代表C

代表D

Page 50: COSCUP2016 - LLVM框架、由淺入淺

TableGen

組譯器

反組譯器

編譯器

除錯器

Target CPU

TableGen

暫存器

指令格式

指令

Page 51: COSCUP2016 - LLVM框架、由淺入淺

Legalizing

LOAD LD

8bit 加法

除法

32bit 加法

⼀一堆 減法

Legal

Promote

Custom

Page 52: COSCUP2016 - LLVM框架、由淺入淺

Instruction Selecting

組合語⾔言

Legalized DAG

Instruction Selection

TableGen

Page 53: COSCUP2016 - LLVM框架、由淺入淺

Register AllocationSSA

虛擬暫存器 CPU暫存器分配 最佳化

Instruction Scheduling

原先指令順序 CPU 更適合的順續

順序 最佳化

Page 54: COSCUP2016 - LLVM框架、由淺入淺

llvm::SelectionDAGISel

LLVM IR 組合語⾔言

Original DAG

Combined DAG

Legalized DAG

Target Legalizing

DAG Combiner

Instruction Selection

TableGen

Page 55: COSCUP2016 - LLVM框架、由淺入淺

DemoA 40 years portal by LLVM, Linking 1976 and 2016

Page 56: COSCUP2016 - LLVM框架、由淺入淺

DemoA 40 years portal by LLVM, Linking 1976 and 2016

WhiteSpace

LLVM IR 組合語⾔言

CP/M

LLVM

Zilog Z80

Page 57: COSCUP2016 - LLVM框架、由淺入淺

模組化的LLVM

原始碼

Backend

組合語⾔言

OptimizerFrontend

Page 58: COSCUP2016 - LLVM框架、由淺入淺

Reference$ uname -a

Page 59: COSCUP2016 - LLVM框架、由淺入淺

1. Architecture for Next Generation GCC ftp://gcc.gnu.org/pub/gcc/summit/2003/Architecture%20for%20a%20Next-Generation%20GCC.pdf

2. Life of an Instruction in LLVM http://eli.thegreenplace.net/2012/11/24/life-of-an-instruction-in-llvm

3. A deeper look into the LLVM code generator http://eli.thegreenplace.net/2013/02/25/a-deeper-look-into-the-llvm-code-generator-part-1

4. LLVM TableGen Documentation http://llvm.org/docs/TableGen/index.html

5. LLVM TableGen Introduction http://llvm.org/docs/TableGen/LangIntro.html

6. Independent Code Generator http://llvm.org/docs/CodeGenerator.html

7. The Relationship between selectiondag and selectiondagisel http://stackoverflow.com/questions/26814062/the-relationship-between-selectiondag-and-selectiondagisel

8. How TableGen’s DAGISel Backend Works https://github.com/draperlaboratory/fracture/wiki/How-TableGen's-DAGISel-Backend-Works

9. ZASM - Z80 Assembler http://k1.spdns.de/Develop/Projects/zasm/Documentation/

10. LLVM Z80 Backend https://github.com/mostlyuseful/llvm-z80/network

11. Whitespace LLVM https://github.com/Subv/Whitespace-LLVM

Page 60: COSCUP2016 - LLVM框架、由淺入淺

Q & A$ man man

Page 61: COSCUP2016 - LLVM框架、由淺入淺
Page 62: COSCUP2016 - LLVM框架、由淺入淺