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は直ったようですね。