采用cmake包装,至少有3种方式可以在windows平台上编译:
vs2012及以上 使用cmake-gui配置即可,使用vs库及头文件
mingw/mingw64 可能会出现out of memory错误,使用gcc库及头文件
ninja 速度快 cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON dir
windows/linux/mac上均可编译llvm clang lldb,方法如下:
版本3.8.1 单独工程具体编译方法如上述3种 每一步执行make make install
1.下载并编译llvm-3.8.1.src到llvm-3.8.1.bin
2.下载cfe-3.8.1.src,这正是clang,可以编译c/c++/oc等语言,支持各种系统。
使用cmake生成的时候会提示错误,此时只要修改CMakeCache.txt或直接在cmake-gui中添加entry即可
这一步需要添加的是第1步中生成的llvm-config.exe路径
再运行cmake即可,编译到cfe-3.8.1.bin
3.下载lldb-3.8.1.src
这一步cmake提示添加 llvm源码路径 llvm编译路径 clang源码路径 clang编译路径,分别设置好即可
如果是mac中这一步可能会提示subversion版本过低,只要按官网方法编译一次即可,还有可能提示无法给lldb-server签名,这里需要在钥匙串访问加入代码签名的lldb-server
编译通过则成功
一些程序:
clang/clang++ 编译前端 clang 1.cpp clang -c -emit-llvm main.c -o main.bc 生成伪代码二进制 clang -S -emit-llvm main.c -o main.ll生成伪代码
clang-cl 兼容msvc
clang-check 语法检查
clang-format 格式化源码
llvm-llc 伪代码生成汇编文本 llc main.bS -o main.asm
llvm-lli 伪代码二进制/伪代码 反汇编为汇编文本 lli main.bc lli main.ll
llvm-ar
llvm-as 伪代码生成伪代码二进制 as -o=main.bc main.ll
llvm-bcanalyzer 伪代码二进制分析器
llvm-config 打印出配置时 LLVM 编译选项、库、等等
llvm-cov
llvm-diff
llvm-dis 可执行文件反汇编为伪代码
llvm-dsymutil
llvm-dwarfdump
llvm-extract
llvm-link
llvm-lto
llvm-mc
llvm-nm
llvm-objdump
llvm-profdata
llvm-ranlib
llvm-readobj
llvm-rtdyld
llvm-size
llvm-stress
llvm-symbolizer
llvm-tblgen
llvm-vtabledump
main.c
#include <stdio.h>
int main(){
printf("hellloworld");
return 0;
}
main.asm
@feat.00 = 1
.def _main;
.scl 2;
.type 32;
.endef
.globl _main
.align 16, 0x90
_main: # @main
# BB#0: # %entry
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $0, -4(%ebp)
movl $"??_C@_0M@IMOOCPLP@hellloworld?$AA@", (%esp)
calll _printf
xorl %eax, %eax
addl $8, %esp
popl %ebp
retl
.section .rdata,"dr",discard,"??_C@_0M@IMOOCPLP@hellloworld?$AA@"
.globl "??_C@_0M@IMOOCPLP@hellloworld?$AA@" # @"\01??_C@_0M@IMOOCPLP@hellloworld?$AA@"
"??_C@_0M@IMOOCPLP@hellloworld?$AA@":
.asciz "hellloworld"
main.ll
; ModuleID = '1.cpp'
target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
target triple = "i686-pc-windows-msvc"
@"\01??_C@_0M@IMOOCPLP@hellloworld?$AA@" = linkonce_odr unnamed_addr constant [12 x i8] c"hellloworld\00", align 1
define i32 @main() #0 {
entry:
%retval = alloca i32, align 4
store i32 0, i32* %retval
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([12 x i8]* @"\01??_C@_0M@IMOOCPLP@hellloworld?$AA@", i32 0, i32 0))
ret i32 0
}
declare i32 @printf(i8*, ...) #0
attributes #0 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.ident = !{!0}
!0 = !{!"Obfuscator-LLVM clang version 3.6.1 (tags/RELEASE_361/final) (based on Obfuscator-LLVM 3.6.1)"}