最近在github上发现一个不错的翻译文档,关于llvm的,虽然文档是2014.08年,但是对于用来了解llvm也是足够了.
对于英文文档,可以下载这里.
关于 Clang
Clang不仅将C和C++转换为LLVM IR,而且能够监督整个编译过程,作为一个灵活的编译器驱动器,努力与GCC兼容共处。
Clang看作一个前端编译器,而不是一个编译器驱动器,它负责将C和C++程序翻译为LLVM IR。
什么是 Compiler-RT
Compiler-RT(runtime)项目为硬件不支持的低级功能提供目标特定的支持。举例来说,32位目标通常缺少64位除法指令。Compiler-RT提供一个目标特定的优化的函数,它用32位指令实现64位除法,从而解决这个问题。
比如c文件
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main() {
uint64_t a = 0ULL, b = 0ULL;
scanf("%ld %ld", &a, &b);
printf("64-bit division is %lu\n", a / b);
return EXIT_SUCCESS;
}
执行汇编clang-12 -S compiler-rt.c -o test.S
,然后可以看到下面一个test.S的文件,里面的内容如下. 参数-S指示编译器生成x86汇编语言.
# %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $32, %rsp
movl $0, -4(%rbp)
movq $0, -16(%rbp)
movq $0, -24(%rbp)
movabsq $.L.str, %rdi
leaq -16(%rbp), %rsi
leaq -24(%rbp), %rdx
movb $0, %al
callq __isoc99_scanf
movq -16(%rbp), %rax
xorl %ecx, %ecx
movl %ecx, %edx
divq -24(%rbp)
movq %rax, %rsi
movabsq $.L.str.1, %rdi
movb $0, %al
callq printf
xorl %eax, %eax
addq $32, %rsp
popq %rbp
.cfi_def_cfa %rsp, 8
retq
dragonegg
DragonEgg 是一个 GCC 插件,它用 LLVM 项目中的代码生成器替代了 GCC 的优化器和代码生成器。它适用于 gcc-4.5或更高版本,可以针对 x86-32/x86-64和 ARM 处理器系列,并已成功地应用于 Darwin、 FreeBSD、 KFreeBSD、 Linux 和 OpenBSD 平台。它完全支持 Ada、 c、 c + + 和 Fortran。它对 Go、 Java、 Obj-C 和 Obj-C + + 有部分支持。
目前llvm3.3 之后就没有发布过了,所以直接用G++就可以.
比如一个简单的cpp文件
int main()
{
int i = 0;
return i;
}
然后用gcc编译为汇编
$ gcc test.cpp -S -O1 -o -
.file "test.cpp"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
movl $0, %eax
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
.section .note.GNU-stack,"",@progbits
Read more
github博客 微信公众号:cdtfug, 欢迎关注一起吹牛逼,也可以加微信号「xiaorik」朋友圈围观。