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内核等,主要手段是通过调整编译器后端的目标指令集,综合使用窥孔、指令拆分、寄存器分配约束、指令调度等优化来生成处理器上性能更好的指令序列。主要的优化方法包含:
- Fedora/CentOS系统中安装的gcc默认在O32下使用mips1指令集,在N64下使用mips3指令集,使用具有更优性能的mips64选项编译上述两个系统,已经通过测试,新的CentOS已经发布;
- 在N32、N64 ABI下,对函数序跋中的成对64位访存指令,在其地址满足16字节对齐的约束下,进行窥孔优化,使用处理器核提供的128位访存指令来完成相同功能;
- 对程序中出现的64位数组指针计算,采用特殊的指令拆分,使用处理器核提供的64位三操作数乘法,从而消除hi/lo相关操作以及移位拼接;
- 修改gcc的寄存器分配覆盖集描述,从覆盖集中去掉hi/lo寄存器,避免程序寄存器压力过大时,分配hi/lo作为通用寄存器的暂存寄存器而引发的流水线停顿;
- 优化-march=loongson3a的流水线描述,使得长延迟操作如load/mult/div/mod等尽量提早发射,减少流水线因数据相关造成的停顿;
- 修正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