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