用gcc12编译pmon

一直用gcc4.9编译pmon, 这几天尝试在新版本的gcc编译pmon, 到gcc7都是没有问题的, 到gcc8开始, 默认使用硬浮点,编译出来的pmon 不能启动, 估计是因为硬浮点没有进行初始化, 在CFLAGS增加一项 -msoft-float解决,

新版本的gcc默认不再合并重复定义的变量, 比如在某个.h中定义了一个变量,  然后有几个.c, include包含了这个.h, 于是就出现了重复变量,在合并这些.o的时候, 早期的gcc是会自动合并这些变量, 新版本的gcc会报变量重复错误,停止编译, 在CFLAGS增加一项   -fcommon, 让它跟以前一样合并重复定义的变量,就ok了。

到gcc11的,出现编译成功, 但是不能启动,对gcc10与gcc13之间的8000个patch, 用2分法进行定位,17次编译测试后, 找到了问出在commit 5879ab5fafedc

1        bad
4040     bad 5b884e940074156  2019-10-21
6059     bad 2fdc20b65c2f340
7069     bad 536b4592a148f50
7321     bad ed383d79ee753208f0df0cdad
7447     bad aa992ce717568eb88b324  EPC=81002b0c
7455     bad 5fa3b3cb4605
7459     bad 16f8992e7fec7b8d4 EPC=81002b0c
7460     bad 5879ab5fafedc
7461     ok  32d941139e814
7463     ok  832ece8
7478     ok b7c28a47c2d57bc
7510     ok 66b54d88e9d33
7574     ok 0ec537f3500924
8079     ok

原本-O3的一个优化项OPT_ftree_loop_distribute_patterns 被错误的放到了-O2:

--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -550,7 +550,7 @@ static const struct default_options default_options_table[] =
     { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
-    { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
+    { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
 
这个优化项, 是用gcc自带的memcpy/memset 代替用户的memcpy/memset, 造成pmon出错, 
 
所有的补丁, 已经放到 https://github.com/lshw/loongosn1-pmon
 
使用debian12的交叉编译工具, 就可以完成编译。
apt-get  install  gcc-12-mipsel-linux-gnu gcc-mipsel-linux-gnu
 
启动过程:
Configuration [FCR,EL,NET]                               
Git:git@github.com:lshw/loongson1-pmon.git               
Commit Id: abf3d89                                       
Commit Date: 2023-12-27 12:12:26 +0000                   
MakeTime: 2023-12-27 12:25:33 +0000.                     
Supported loaders [txt, srec, elf, bin]                  
Supported filesystems [sdcard, mtd, net, fs/yaffs2, fat,]
This software may be redistributed under the BSD copyrig.
Copyright 2000-2002, Opsycon AB, Sweden.                 
Copyright 2005, ICT CAS.                                 
CPU Loongson 1C300 OpenLoongson @ 252.00 MHz / Bus @ 126z
Memory size  64 MB ( 64 MB Low memory,   0 MB High memor.
Primary Instruction cache size 16kb (32 line, 4 way)
Primary Data cache size 16kb (32 line, 4 way)
BEV in SR set to zero.                                   
Press <Enter> to execute loading image:mtd0
Press any other key to abort.                                             
PMON> vers                                               
PMON: Git:git@github.com:lshw/loongson1-pmon.git         
Commit Id: abf3d89                                   
Commit Date: 2023-12-27 12:12:26 +0000
MakeTime: 2023-12-27 12:25:33 +0000  
GCC: 12.0                                                                                                      
PMON>