LLVM 外部项目 2

Posted by 叉叉敌 on May 17, 2022

最近在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」朋友圈围观。