zoukankan      html  css  js  c++  java
  • 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

    人工智能芯片与自动驾驶
  • 相关阅读:
    暂时转换
    内置函数⼆
    day13内置函数⼀
    day12⽣成器和⽣成器表达式
    20181031作业
    20181030函数2
    20181029函数1
    20181026
    20181025
    20181024
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/14970637.html
Copyright © 2011-2022 走看看