LLVM 使用手册

简介

LLVM 是一个发展中的前言编辑器技术框架,它易于扩展并设计成多个库的形式,可以为编译器开发者提供流畅的体验,并能使编译器开发所涉及的学习过程变得非常流畅。

LLVM 架构特性

  1. C++ 语言实现
  2. 前端与后端分离,支持多种前端和后端,使用中间代码 IR 进行衔接
LLVM 架构组成
  1. 第一个 Release 版本发布于 2003 年,代码开源
  2. 提供了很多工具用于编译和优化代码
LLVM 工具集
  1. 与 GCC 相比,编译出的程序运行效率更高

Tools 使用

LLVM 的一些优化和绘图都针对 bitcode 文件,这里介绍与之相关的工具使用

从 源文件 生成 bitcode 文件

clang -c -emit-llvm const.c -o const.bc

clang 是 LLVM 的前端编译工具,可以用它来生成目标文件,这个指令将 .c 代码生成 .bc 文件.

warning:
使用这个命令的时候会自动带有 -O0 级别的优化(新版本中),可以禁止它,参考

clang -c -emit-llvm -Xclang -disable-O0-optnone const.c -o const.bc    

llvm tools 提供了产生 cfg callgraph 等图片参数的工具(opt),注意,不会自己生成图片,还需要工具(如:graphviz MacOS下安装 brew install graphviz)
cfg 图

opt –view-cfg const.bc

call 图

opt -view-callgraph file.bc

中间代码优化
用 opt ,还可以调用 LLVM 提供的优化器对 bitcode 文件进行代码优化

opt -mem2reg const.bc -o const.reg.bc

-constprop 临时变量
-early-cse 消除公共部分
运行 help ,可以查看 LLVM 提供的优化器

opt -help

-load 可以加载自定义的优化器(或其他分析器),如

opt -load LLVMCountOp.dylib -opCounter file.bc -o file.oc.bc
opt -load LLVMCountOp.dylib -help

-opCounter LLVMCountOp.dylib 里面 Pass 的注册标记

如果仅仅分析代码,可以用 -disable-output 禁用输出

opt -load LLVMCountOp.dylib -opCounter -disable-output -time-passes file.bc

-time-passes pass 运行时间

bitcode 文件生产 .ll ,中间代码 IR 文件

llvm-dis const.bc  

可以对 .ll 进行即时运行(JIT)

lli const.ll   

bitcode 文件生成可执行文件

clang const.ll
./a.out

bitcode 文件生成目标平台机器码

llc -march=x86 ex0.reg.bc -o ex0.reg.x86

使用官方二进制库

LLVM 官网提供了各个版本的下载,有二进制文件和源码,使用二进制文件中包含了可以直接运行在目标平台的 Tools 和 LLVM 的基础功能静态库。
直接使用二进制静态库,可以开发出我们自己的编译工具,Tools 里有 llvm-config 提供了补充 LLVM 各个依赖参数功能,可以方便编写 MakeFile 文件,编译工程。
仓库下 JIT 提供了一个编译工具的工程,依赖的 LLVM 版本是 3.4 。提供了一个通用的 MakeFile 模板。

LLVM_CONFIG ?= ../bin_3.4/bin/llvm-config

ifndef VERBOSE
QUIET := @
endif

SRC_DIR ?= $(PWD)

LLVM_LDFLAGS := $(shell $(LLVM_CONFIG) --ldflags)
COMMON_FLAGS = -Wall -Wextra
LLVM_CXXFLAGS += $(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags)
LLVM_CPPFLAGS += $(shell $(LLVM_CONFIG) --cppflags) -I$(SRC_DIR)
LLVM_LIBS = $(shell $(LLVM_CONFIG) --libs jit interpreter nativecodegen)

objects = Driver.o Expr.o Lexer.o Parser.o
name = driver

default: $(name)

$(name) : $(objects)
        @echo Linking $@
        $(QUIET)$(CXX) -o $@ $(LLVM_CXXFLAGS) $(LLVM_LDFLAGS) $^ $(LLVM_LIBS)

%.o : %.cpp
        @echo Compiling $*.cpp
        $(QUIET)$(CXX) -c $< $(LLVM_CPPFLAGS) -o $@

clean::
        $(QUIET)rm -f $(name) $(objects)

系统下配置好 clang 环境,然后设置好 LLVM_CONFIG 目录,即可运行 make 命令,进行编译。

使用官方源码

借助于官网提供的源代码也能开发出高效工具,这里以 Pass 的开发为例。
从官网找到一个版本(如:3.4)的代码后,下载到本地,代码工程由 cmake 工具组织,可以在工程下创建目录llvm_xcode,然后进入目录执行

cmake -G Xcode ../llvm 

就能生成支持 Xcode 的项目,用 Xcode IDE 可以打开工程(还支持其他IDE工具,详情参考官网)。
在源码工程下我们可以找到一个实例工程 Hello ,这是一个 Pass 工程,在 llvm/lib/Transforms 目录下(不是 llvm_xcode 下的 lib)。我们使用目录工具进入该文件下,模仿Hello工程的配置,新建自己的工程,修改 Transforms 目录下的 CMakeList.txt Makefile 和 子目录下的文件。然后回到 llvm_xcode 目录下,再执行一遍 cmake 指令。
Xcode IDE 可以对工程代码进行编辑,编译完成后,可以对目标 Target 进行编译。会生成以动态链接库,放在工程下验证, 仓库 Passes 下提供了编译好的库,可以直接使用。

常见错误:

Error opening 'LLVMCountOp.dylib': dlopen(LLVMCountOp.dylib, 9): Symbol not found: __ZN4llvm12FunctionPass17assignPassManagerERNS_7PMStackENS_15PassManagerTypeE
  Referenced from: LLVMCountOp.dylib
  Expected in: flat namespace

加载的 Pass 和 opt 版本不对,或者 Release Debug 不一致

参考

Makefile 调用 llvm-config

llvm-config 官文

Makefile 官文

课件官网

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容