[Info-vax] VMS Software Q1 '23 Update
Dave Froble
davef at tsoft-inc.com
Wed Jan 25 20:36:14 EST 2023
On 1/25/2023 6:50 PM, Arne Vajhøj wrote:
> On 1/25/2023 5:55 PM, John Reagan wrote:
>> G2L recurses down the symbol table and converts the static variables in each
>> block as it finds
>> them. The difference is that GEM frontends can record the desired offset into
>> the PSECT in
>> any order. We sort by offset in each block, but we need to hoist all the
>> static variables out in
>> another pass, sort them, and do them all at the module level. PSECTs are
>> created by the linker.
>> They exist outside the control of the compiler.
>>
>> Here's a nasty Fortran program where each subroutine initializes and
>> reinitializes parts of the
>> same common block in a particular order.
>>
>> subroutine print_common
>> common /mypsect/ i1,i2
>> integer*4 :: i1,i2
>> write (*,10) i1,i2
>> 10 format (' ',Z8,' ',Z8)
>> return
>> end
>>
>> subroutine update_longwords
>> common /mypsect/ i1,i2
>> c start with putting hex AAAAAAAA into both longwords
>> integer*4 :: i1='AAAAAAAA'X,i2='AAAAAAAA'X
>> return
>> end
>>
>> subroutine update_words
>> c and update bottom words with BBBB
>> common /mypsect/ w1,w2,w3,w4
>> integer*2 :: w1,w2='BBBB'X,w3,w4='BBBB'X
>> return
>> end
>>
>> subroutine update_bytes
>> c and update bottom bytes with CC
>> common /mypsect/ b1,b2,b3,b4,b5,b6,b7,b8
>> integer*1 :: b1,b2,b3,b4='CC'X,b5,b6,b7,b8='CC'X
>> return
>> end
>>
>> program main
>> c by now, the two longwords in the common should be
>> c CCBBAAAA CCBBAAAA
>> call print_common
>> end
>
> That is horrible code IMHO.
I find that an interesting comment ...
Perhaps it is doing what someone needed it to do ...
> Initializing the same common block in multiple subroutines
> is not something I would ever do.
You've never redefined the data type of some data?
> I would expect either an error or undefined result due to
> order of processing being undefined.
>
> But then I don't know what the Fortran standard and the
> VMS Fortran documentation says on the topic.
>
> Someone is actually using such constructs?
>
> Arne
>
Consider:
Record TLS
Variant
Case
String Rec$=42
Case
Byte Byte1%
Byte VerMajor%
Byte VerMinor%
Long UnixDate%
String Random$=28
Long SessionID%
Word Cypher%
Byte Method%
End Variant
End Record
In this case the Basic RECORD statement allows multiple variants of the same
memory, basically allowing different types of variables to be used on the same
memory location(s). Useful, and a relatively later addition to the language.
Similar to what is called a structure in C and perhaps other languages.
Perhaps some would not want variants, but I for one have used them many times.
Map (D) Long D1%
Map (D) String D1$=4
Now in a MAP statement, whiich is rather similar to a COMMON block, multiple
definitions of the MAP statement allows for a similar redefinition of the same
memory. In the above, a longword value is stored in 4 bytes of memory. The
redefinition of the MAP statement allows the same memory to be labeled as a
string or a longword.
It's been useful to me in the past.
Back in the day, some programmers learned to work around things a language
didn't provide. I'd guess that different implementations of a compiler might
not be quite happy with such work arounds.
Sorry John ...
--
David Froble Tel: 724-529-0450
Dave Froble Enterprises, Inc. E-Mail: davef at tsoft-inc.com
DFE Ultralights, Inc.
170 Grimplin Road
Vanderbilt, PA 15486
More information about the Info-vax
mailing list