GCC编译器

GCC编译器

GCC(GNU Compiler Collection,GNU编译器套装),一套由GNU开发的编程语言编译器。一套GNU编译器套装以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X操作系统的标准编译器。GCC原名为GNU C语言编译器,原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java以及Ada与其它语言。GCC4.4开始默认支持2F架构,GCC4.6开始默认支持3A架构。
  调优目标是SPEC CPU2000、coremark和Linux内核等,主要手段是通过调整编译器后端的目标指令集,综合使用窥孔、指令拆分、寄存器分配约束、指令调度等优化来生成处理器上性能更好的指令序列。主要的优化方法包含:

  1. Fedora/CentOS系统中安装的gcc默认在O32下使用mips1指令集,在N64下使用mips3指令集,使用具有更优性能的mips64选项编译上述两个系统,已经通过测试,新的CentOS已经发布;
  2. 在N32、N64 ABI下,对函数序跋中的成对64位访存指令,在其地址满足16字节对齐的约束下,进行窥孔优化,使用处理器核提供的128位访存指令来完成相同功能;
  3. 对程序中出现的64位数组指针计算,采用特殊的指令拆分,使用处理器核提供的64位三操作数乘法,从而消除hi/lo相关操作以及移位拼接;
  4. 修改gcc的寄存器分配覆盖集描述,从覆盖集中去掉hi/lo寄存器,避免程序寄存器压力过大时,分配hi/lo作为通用寄存器的暂存寄存器而引发的流水线停顿;
  5. 优化-march=loongson3a的流水线描述,使得长延迟操作如load/mult/div/mod等尽量提早发射,减少流水线因数据相关造成的停顿;
  6. 修正gcc编译器在loongson3a/b o32 abi 下不使用浮点奇数号寄存器;

GCC FAQ:

1、如何查看gcc编译器版本?

    gcc -v

2、如何指定编译出来的程序是32位或64位?

    可以通过编译选项-mabi=xx指定。

    gcc -mabi=32  #32 位程序(fedora13默认是32位,centos6.4、fedora21需要安装多库版本。)

    gcc -mabi=64  #64 位程序 (fedora13是32位系统,无法编译出64位程序,centos6.4、fedora21默认是64位。)

    gcc -mabi=n32  #n32 程序 (fedora13是32位系统,无法编译出n32程序,centos6.4、fedora21需要安装多库版本。)

3、如何查看一个二进制程序是32位还是64位的?

    linux下可以通过命令file查看。

    $file a.out

      ELF 32-bit LSB executable, MIPS, MIPS64 version 1 (SYSV),  #32 位程序

    $file a.out

      ELF 64-bit LSB executable, MIPS, MIPS64 version 1 (SYSV),  #64 位程序

    $file a.out

      ELF 32-bit LSB executable, MIPS, N32 MIPS64 version 1 (SYSV),  #n32 程序

4、什么是多库版本,如何查看系统是否为多库版本?

    多库版本是64位操作系统中有32位和n32的glibc库版本。

    $rpm -qa | grep glibc

     glibc-32-xxx  #32表示32位库,xxx为版本号。

     glibc-n32-xxx #n32表示n32库,xxx为版本号。

调试bug

如何准确、快速的提交一个关于GCC的bug,以便尽快解决。

在提交一个bug之前,首先检查代码本身的正确性,用编译选项 gcc -Wall -Wextra 查看输出出错信息,确保代码的正确性。

提交一个bug,需要以下信息:

步骤

1、GCC的版本(通过gcc -v 命令查看):

    gcc -v

2、系统类型、版本:

    cat /etc/issue

    cat /proc/cpuinfo

3、产生bug时的编译选项:

    gcc you_options

    如果为一个工程,包含多个源文件,将编译的输出log提交(如涉及保密及知识产权,将导致出错的单个命令行,输出做敏感处理后提供)

4、编译预处理文件(添加编译选项 -v -save-temps,将产生的输出信息重定向到一个文件,并将产生的*.i文件和输出信息重定向文件):

    gcc -v -save-temps your_options your_filename.c 2>&1 | tee compile_output.txt

源文件无法编译、复现问题,将编译时加 -v -save-temps时的输出信息和产生的*.i 文件。

维护三个主要版本的gcc,分别为gcc-4.4(配套的操作系统为centos 6.4、 fedora 13)、gcc-4.9(配套的操作系统为loongnix1.0)和gcc-7(在loongnix1.0中通过devtoolset集成)。

不同版本之间的优化性能差别,不同版本之间比较时,用-O2选项或同级别的优化选项。

工具链

1. 优化版本gcc编译器

2. 64位是指编译生成的二进制文件是mips 64位的,32位同理

4. gs464核linux交叉编译器(gcc-7.3.1)

工具链支持情况

 

 表格中画対号的是支持的库类型

如果不添加编译参数,则默认编译的目标文件为"mips32r2 mabi=32 glibc"

如果想要编译其它类型目标文件需要添加参数.

例如,如果需要编译mips64r2 n64的目标文件:

 

 添加参数"-mips64r2 -mabi=64".

工具链信息

 

 其中,single float是只存在当精度浮点指令.如果代码中出现了双精度浮点运算,则使用软浮点实现.

  • 工具链中工具/库版本信息

 

  • 其中指令集和架构支持同mips-201901-loongson-linux

7. gs464核sde elf交叉编译器(gcc-8.3.0)说明

  • 工具链支持情况

此工具链为裸板工具链,支持 "mips32r2 o32" 、 "mips32 o32" 与 "mips16 o32"

 

其中,single float是只存在当精度浮点指令.如果代码中出现了双精度浮点运算,则使用软浮点实现.

  • 工具链中工具/库版本信息

 

 其中指令集和架构支持同mips-201901-loongson-linux

8. gs464核linux交叉编译器(gcc-8.3.0)说明

工具链支持情况

ABI: o32 n32 n64

库: glibc

浮点类型: hard float

如果不添加编译参数,则默认编译的目标文件为"mips32r2 mabi=32 glibc"

如果想要编译其它类型目标文件需要添加参数.

例如,如果需要编译mips64r2 n64的目标文件:

添加参数"-mips64r2 -mabi=64".

其它类推

另外,从rc1.1开始支持gdb和gdbserver

* mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/lib64/bin/gdbserver

* mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/lib/bin/gdbserver

* mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/lib32/bin/gdbserver

根据自己目标系统的ABI选择使用哪个gdbserver

 

 注意事项:

所有的gs464核交叉编译器均运行在x86_64位系统上,32位x86系统暂不支持,

ls232核交叉编译器运行在x86 32位系统上,在64位系统上运行请安装32位库。

运行交叉编译的操作系统为RHEL/centos-6系列,ubuntu-13/14/15等,某些linux发行版无法运行,自行切换操作系统。

修改内容:

在o32 ABI下不使用奇数号浮点寄存器。

在ll与sc之间的跳转指令的目标地址前加sync指令。

参考链接:

http://www.loongnix.org/index.php/Cross-compile

人工智能芯片与自动驾驶
原文地址:https://www.cnblogs.com/wujianming-110117/p/14970637.html