以下の項では、-qautodbl オプションの動作の詳細について説明し、 プロモーションと埋め込みが行われているときの動作をユーザーが予測できるようにします。
2 つのデータ・オブジェクト間のストレージの関係 (storage relationship) によって、 これらのオブジェクトの相対開始アドレスと相対サイズを判別します。 -qautodbl オプションは、可能な限りこの関係を保持するように動作します。
データ・オブジェクトは、1 つのオブジェクトの変更内容がもう 1 つのオブジェクトに反映されるように 値の関係 (value relationship) を持つこともできます。 たとえば、あるプログラムで値をある変数に保管し、次にこの値を別のストレージ関連の変数を介して読み取る という場合です。 -qautodbl を指定して有効な状態にすると、1 つまたは両方の値の表現が異なるものになるため、 値の関係が常に保持されるということがなくなります。
このオプションがオブジェクトに作用すると、オブジェクトは次のように処理されます。
埋め込み用に追加されたスペースにより、変換前から存在しているストレージ共用関係が確実に維持されます。 たとえば、配列エレメント I(20) と R(10) がデフォルトにより同一アドレスから 開始したときに、R のエレメントがプロモートされてサイズが 2 倍になった場合、I(20) と R(10) が同一アドレスから開始するようにするため、I のエレメントが埋め込まれます。
I/O ステートメントは埋め込みを処理しません。 ただし、不定様式の I/O ステートメントは除きます。 これらのステートメントは、構造体内の埋め込みを読み書きします。
本節に示す例は、以下のエンティティー相互間でストレージが共用される関係を示しています。
図 6. -qautodbl オプションを指定しなかった場合のストレージの関係
上の図は、コンパイラーのデフォルトのストレージの共用関係を示しています。
@process autodbl(none) block data complex(4) x8 /(1.123456789e0,2.123456789e0)/ real(16) r16(2) /1.123q0,2.123q0/ integer(8) i8(2) /1000,2000/ character*5 c(2) /"abcde","12345"/ common /named/ x8,r16,i8,c end subroutine s() complex(4) x8 real(16) r16(2) integer(8) i8(2) character*5 c(2) common /named/ x8,r16,i8,c ! x8 = (1.123456e0,2.123456e0) ! promotion did not occur ! r16(1) = 1.123q0 ! no padding ! r16(2) = 2.123q0 ! no padding ! i8(1) = 1000 ! no padding ! i8(2) = 2000 ! no padding ! c(1) = "abcde" ! no padding ! c(2) = "12345" ! no padding end subroutine s
図 7. -qautodbl=dbl を指定した場合のストレージの関係
@process autodbl(dbl) block data complex(4) x8 real(16) r16(2) /1.123q0,2.123q0/ real(8) r8 real(4) r4 /1.123456789e0/ integer(8) i8(2) /1000,2000/ character*5 c(2) /"abcde","12345"/ equivalence (x8,r8) common /named/ r16,i8,c,r4 ! Storage relationship between r8 and x8 is preserved. ! Data values are NOT preserved between r8 and x8. end subroutine s() real(16) r16(2) real(8) r4 integer(8) i8(2) character*5 c(2) common /named/ r16,i8,c,r4 ! r16(1) = 1.123q0 ! no padding ! r16(2) = 2.123q0 ! no padding ! r4 = 1.123456789d0 ! promotion occurred ! i8(1) = 1000 ! no padding ! i8(2) = 2000 ! no padding ! c(1) = "abcde" ! no padding ! c(2) = "12345" ! no padding end subroutine s
図 8. -qautobl=dbl4 を指定した場合のストレージの関係
@process autodbl(dbl4) complex(8) x16 /(1.123456789d0,2.123456789d0)/ complex(4) x8 real(4) r4(2) equivalence (x16,x8,r4) ! Storage relationship between r4 and x8 is preserved. ! Data values between r4 and x8 are preserved. ! x16 = (1.123456789d0,2.123456789d0) ! promotion did not occur ! x8 = (1.123456789d0,2.123456789d0) ! promotion occurred ! r4(1) = 1.123456789d0 ! promotion occurred ! r4(2) = 2.123456789d0 ! promotion occurred end
図 9. -qautodbl=dbl8 を指定した場合のストレージの関係
@process autodbl(dbl8) complex(8) x16 /(1.123456789123456789d0,2.123456789123456789d0)/ complex(4) x8 real(8) r8(2) equivalence (x16,x8,r8) ! Storage relationship between r8 and x16 is preserved. ! Data values between r8 and x16 are preserved. ! x16 = (1.123456789123456789q0,2.123456789123456789q0) ! ! promotion occurred ! x8 = upper 8 bytes of r8(1) ! promotion did not occur ! r8(1) = 1.123456789123456789q0 ! promotion occurred ! r8(2) = 2.123456789123456789q0 ! promotion occurred end
図 10. -qautodbl=dblpad4 を指定した場合のストレージの関係
上の図で、破線は埋め込みを表します。
@process autodbl(dblpad4) complex(8) x16 /(1.123456789d0,2.123456789d0)/ complex(4) x8 real(4) r4(2) integer(8) i8(2) equivalence(x16,x8,r4,i8) ! Storage relationship among all entities is preserved. ! Date values between x8 and r4 are preserved. ! x16 = (1.123456789d0,2.123456789d0) ! padding occurred ! x8 = (upper 8 bytes of x16, 8 byte pad) ! promotion occurred ! r4(1) = real(x8) ! promotion occurred ! r4(2) = imag(x8) ! promotion occurred ! i8(1) = real(x16) ! padding occurred ! i8(2) = imag(x16) ! padding occurred end
図 11. -qautodbl=dblpad8 を指定した場合のストレージの関係
上の図で、破線は埋め込みを表します。
@process autodbl(dblpad8) complex(8) x16 /(1.123456789123456789d0,2.123456789123456789d0)/ complex(4) x8 real(8) r8(2) integer(8) i8(2) byte b(16) equivalence (x16,x8,r8,i8,b) ! Storage relationship among all entities is preserved. ! Data values between r8 and x16 are preserved. ! Data values between i8 and b are preserved. ! x16 = (1.123456789123456789q0,2.123456789123456789q0) ! ! promotion occurred ! x8 = upper 8 bytes of r8(1) ! padding occurred ! r8(1) = real(x16) ! promotion occurred ! r8(2) = imag(x16) ! promotion occurred ! i8(1) = upper 8 bytes of real(x16) ! padding occurred ! i8(2) = upper 8 bytes of imag(x16) ! padding occurred ! b(1:8)= i8(1) ! padding occurred ! b(9:16)= i8(2) ! padding occurred end
図 12. -qautodbl=dblpad を指定した場合のストレージの関係
上の図で、破線は埋め込みを表します。
@process autodbl(dblpad) block data complex(4) x8 /(1.123456789e0,2.123456789e0)/ real(16) r16(2) /1.123q0,2.123q0/ integer(8) i8(2) /1000,2000/ character*5 c(2) /"abcde","12345"/ common /named/ x8,r16,i8,c end subroutine s() complex(8) x8 real(16) r16(4) integer(8) i8(4) character*5 c(2) common /named/ x8,r16,i8,c ! x8 = (1.123456789d0,2.123456789d0) ! promotion occurred ! r16(1) = 1.123q0 ! padding occurred ! r16(3) = 2.123q0 ! padding occurred ! i8(1) = 1000 ! padding occurred ! i8(3) = 2000 ! padding occurred ! c(1) = "abcde" ! no padding occurred ! c(2) = "12345" ! no padding occurred end subroutine s