ToDo:
27日の日記でLLVM-GCCを使ってコンパイルしたSADだが、 common block回りの不具合原因が判明。
ここで問題です、次の Fortranコードを llvm-gfrotranで コンパイルした場合、どんな結果が出力されるでしょう?
implicit none integer*4 i logical*4 flags(64),flag1,flag2,flag3 common /tflags/flags equivalence (flag2,flags(2)) equivalence (flag3,flags(3)) do i=1,64 flags(i)=.false. enddo write(*,*)'Clear:' write(*,*)'flags(1)=',flags(1) write(*,*)'flag1=',flag1 write(*,*)'flags(2)=',flags(2) write(*,*)'flag2=',flag2 write(*,*)'flags(3)=',flags(3) write(*,*)'flag3=',flag3 flag2=.true. write(*,*)'After: flag2=.true.' write(*,*)'flags(1)=',flags(1) write(*,*)'flag1=',flag1 write(*,*)'flags(2)=',flags(2) write(*,*)'flag2=',flag2 write(*,*)'flags(3)=',flags(3) write(*,*)'flag3=',flag3 do i=1,64 flags(i)=.false. enddo write(*,*)'Clear:' write(*,*)'flags(1)=',flags(1) write(*,*)'flag1=',flag1 write(*,*)'flags(2)=',flags(2) write(*,*)'flag2=',flag2 write(*,*)'flags(3)=',flags(3) write(*,*)'flag3=',flag3 flags(1)=.true. write(*,*)'After: flags(1)=.true.' write(*,*)'flags(1)=',flags(1) write(*,*)'flag1=',flag1 write(*,*)'flags(2)=',flags(2) write(*,*)'flag2=',flag2 write(*,*)'flags(3)=',flags(3) write(*,*)'flag3=',flag3 flag1=.false. write(*,*)'After: flag1=.false.' write(*,*)'flags(1)=',flags(1) write(*,*)'flag1=',flag1 write(*,*)'flags(2)=',flags(2) write(*,*)'flag2=',flag2 write(*,*)'flags(3)=',flags(3) write(*,*)'flag3=',flag3 end
Subversion resporitory revision 48818での結果は、以下の通り。
Clear: flags(1)= F flag1= F flags(2)= F flag2= F flags(3)= F flag3= F After: flag2=.true. flags(1)= T flag1= F flags(2)= F flag2= T flags(3)= F flag3= T Clear: flags(1)= F flag1= F flags(2)= F flag2= F flags(3)= F flag3= F After: flags(1)=.true. flags(1)= T flag1= F flags(2)= F flag2= T flags(3)= F flag3= T After: flag1=.false. flags(1)= T flag1= F flags(2)= F flag2= T flags(3)= F flag3= T
要するに、EQUIVALENCE文に配列を添字付きで与えた場合、 添字の部分が無視されているようです。
バグ 1971でも EQUIVALENCEの不具合が報告されている模様です。
SADは、common blockとEQUIVALENCEを多用してるので このバグが直らない限り、LLVM-GCCを使うのは絶望的です。
SADの CVS repositoryから調査用に変換生成した Subversion repositoryを あさってみると...
といったことが、分かりました。
開発形態は、少数精鋭による典型的な伽藍モデルのようです。
あとは、CVS repository導入直後から現代までのコード行数の変遷でも 調べて見るべきか?
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記
バグ1971は直ったようですね。